Информация об изменениях

Сообщение Как лучше назвать и сделать? от 19.06.2023 3:54

Изменено 19.06.2023 11:55 пффф

Как лучше назвать и сделать?
Привет!

При формировании строки из каких-нибудь флагов, например, или ещё из чего-то, что требует разделителя между равнозначными частями, приходится проверять, первый ли это элемент, надо ли вставлять разделитель. Это как-то надоедает. Есть ли какой-то стандартный паттерн с реализованным класс для такого?

Я сначала написал функцию:
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'ы. Вот это моё не имеет с ними сходства?
Как лучше назвать и сделать?
Привет!

При формировании строки из каких-нибудь флагов, например, или ещё из чего-то, что требует разделителя между равнозначными частями, приходится проверять, первый ли это элемент, надо ли вставлять разделитель. Это как-то надоедает. Есть ли какой-то стандартный паттерн с реализованным класс для такого?

Я сначала написал функцию:
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'ы. Вот это моё не имеет с ними сходства?