Сообщение Как лучше назвать и сделать? от 19.06.2023 3:54
Изменено 19.06.2023 11:55 пффф
Как лучше назвать и сделать?
Привет!
При формировании строки из каких-нибудь флагов, например, или ещё из чего-то, что требует разделителя между равнозначными частями, приходится проверять, первый ли это элемент, надо ли вставлять разделитель. Это как-то надоедает. Есть ли какой-то стандартный паттерн с реализованным класс для такого?
Я сначала написал функцию:
Но она меня тоже стала утомлять — надо туда передавать строку, к которой добавляем, и разделитель. Написал классик:
В целом, функциональность устраивает, но название какое-то корявенькое. Может, как-то лучше можно назвать?
Ну, и вообще, может, как-то получше можно сделать?
ЗЫ Я не очень в си-шарпах и прочих явах разбираюсь, но там вроде есть всякие StringBuilder'ы. Вот это моё не имеет с ними сходства?
При формировании строки из каких-нибудь флагов, например, или ещё из чего-то, что требует разделителя между равнозначными частями, приходится проверять, первый ли это элемент, надо ли вставлять разделитель. Это как-то надоедает. Есть ли какой-то стандартный паттерн с реализованным класс для такого?
Я сначала написал функцию:
std::string appendWithSep(std::string str, const std::string &sAppend, const std::string &sSep = " ")
{
if (sAppend.empty()) // Do nothing on empty append
return str;
if (str.empty())
{
str.append(sAppend);
}
else
{
str.append(sSep);
str.append(sAppend);
}
return str;
}
Но она меня тоже стала утомлять — надо туда передавать строку, к которой добавляем, и разделитель. Написал классик:
lass StringAppendWithSep
{
std::string strSep;
std::string strBuf;
public:
StringAppendWithSep(const std::string &sep="", const std::string &strOrg=std::string())
: strSep(sep)
, strBuf(strOrg)
{}
bool empty() const
{
return strBuf.empty();
}
std::string modifySep(std::string newSep)
{
std::swap(strSep, newSep);
return newSep;
}
StringAppendWithSep& append(const std::string &s)
{
strBuf = appendWithSep(strBuf, s, strSep);
return *this;
}
StringAppendWithSep& append(std::size_t n, char ch)
{
append(std::string(n, ch));
return *this;
}
StringAppendWithSep& append(char ch)
{
append(1, ch);
return *this;
}
StringAppendWithSep& concat(const std::string &s)
{
strBuf.append(s);
return *this;
}
StringAppendWithSep& concat(std::size_t n, char ch)
{
strBuf.append(n, ch);
return *this;
}
StringAppendWithSep& concat(char ch)
{
strBuf.append(1, ch);
return *this;
}
std::string toString() const
{
return strBuf;
}
};
В целом, функциональность устраивает, но название какое-то корявенькое. Может, как-то лучше можно назвать?
Ну, и вообще, может, как-то получше можно сделать?
ЗЫ Я не очень в си-шарпах и прочих явах разбираюсь, но там вроде есть всякие StringBuilder'ы. Вот это моё не имеет с ними сходства?
Как лучше назвать и сделать?
Привет!
При формировании строки из каких-нибудь флагов, например, или ещё из чего-то, что требует разделителя между равнозначными частями, приходится проверять, первый ли это элемент, надо ли вставлять разделитель. Это как-то надоедает. Есть ли какой-то стандартный паттерн с реализованным класс для такого?
Я сначала написал функцию:
Но она меня тоже стала утомлять — надо туда передавать строку, к которой добавляем, и разделитель. Написал классик:
Используется как-то так:
В целом, функциональность устраивает, но название какое-то корявенькое. Может, как-то лучше можно назвать?
Ну, и вообще, может, как-то получше можно сделать?
ЗЫ Я не очень в си-шарпах и прочих явах разбираюсь, но там вроде есть всякие StringBuilder'ы. Вот это моё не имеет с ними сходства?
При формировании строки из каких-нибудь флагов, например, или ещё из чего-то, что требует разделителя между равнозначными частями, приходится проверять, первый ли это элемент, надо ли вставлять разделитель. Это как-то надоедает. Есть ли какой-то стандартный паттерн с реализованным класс для такого?
Я сначала написал функцию:
std::string appendWithSep(std::string str, const std::string &sAppend, const std::string &sSep = " ")
{
if (sAppend.empty()) // Do nothing on empty append
return str;
if (str.empty())
{
str.append(sAppend);
}
else
{
str.append(sSep);
str.append(sAppend);
}
return str;
}
Но она меня тоже стала утомлять — надо туда передавать строку, к которой добавляем, и разделитель. Написал классик:
lass StringAppendWithSep
{
std::string strSep;
std::string strBuf;
public:
StringAppendWithSep(const std::string &sep="", const std::string &strOrg=std::string())
: strSep(sep)
, strBuf(strOrg)
{}
bool empty() const
{
return strBuf.empty();
}
std::string modifySep(std::string newSep)
{
std::swap(strSep, newSep);
return newSep;
}
StringAppendWithSep& append(const std::string &s)
{
strBuf = appendWithSep(strBuf, s, strSep);
return *this;
}
StringAppendWithSep& append(std::size_t n, char ch)
{
append(std::string(n, ch));
return *this;
}
StringAppendWithSep& append(char ch)
{
append(1, ch);
return *this;
}
StringAppendWithSep& concat(const std::string &s)
{
strBuf.append(s);
return *this;
}
StringAppendWithSep& concat(std::size_t n, char ch)
{
strBuf.append(n, ch);
return *this;
}
StringAppendWithSep& concat(char ch)
{
strBuf.append(1, ch);
return *this;
}
std::string toString() const
{
return strBuf;
}
};
Используется как-то так:
auto collector = StringAppendWithSep(", ");
for(auto s: list)
{
if (optionalCondition)
collector.append(s);
}
// или
if (v&Flag1)
collector.append("Flag1");
if (v&Flag2)
collector.append("Flag2");
std::cout << collector.str() << "\n";
В целом, функциональность устраивает, но название какое-то корявенькое. Может, как-то лучше можно назвать?
Ну, и вообще, может, как-то получше можно сделать?
ЗЫ Я не очень в си-шарпах и прочих явах разбираюсь, но там вроде есть всякие StringBuilder'ы. Вот это моё не имеет с ними сходства?