bogdanov-d-a / oop_lab2

OOP lab 2
0 stars 0 forks source link

Замечания по лабораторной работе №2 (задание 2 - RemoveExtraSpaces) #2

Open alexey-malov opened 9 years ago

alexey-malov commented 9 years ago
    BOOST_CHECK(CheckConversion("wide      spaces                here", "wide spaces here"));

Тут больше подходит макрос BOOST_CHECK_EQUAL

alexey-malov commented 9 years ago
class CRemoveExtraSpacesMachine
{
public:
    typedef std::function<void(char)> charCallback_t;

    CRemoveExtraSpacesMachine(charCallback_t callback);
    void SendChar(char c);
    static std::string RemoveExtraSpaces(std::string const& arg);

protected:
    enum class state_t
    {
        START_POSITION,
        SPACE_PENDING,
        NOTHING_PENDING
    };

    static const char SPACE_CHAR = ' ';

    state_t m_state;
    charCallback_t m_callback;
};

protected заменить на private Используй UpperCamelCase для enum-ов и тайпдефов функций Вероятно нет нужды SendChar делать публичным.

alexey-malov commented 9 years ago
std::string CRemoveExtraSpacesMachine::RemoveExtraSpaces(std::string const& arg)
{
    std::string result;
    CRemoveExtraSpacesMachine machine([&result](char c){ result.push_back(c); });
    std::for_each(arg.begin(), arg.end(), [&machine](char c){ machine.SendChar(c); });
    return result;
}

Лучше в результирующей строке сразу зарезервировать место, достаточное для хранения обработанной строки (метод reserve). Тогда класс строк при росте не будет перевыделять память Если использовать range-based for вместо for_each, то код, возможно, будет выглядеть читабельнее.

alexey-malov commented 9 years ago

Вариант с целым классом конечноного автомата, в целом хорош. Но несколько переусложнен. Можно было бы обойтись обычной функцией, внутри которой содержался бы цикл. Если хочется универсальности, можно передать ей в качестве параметра тот же функциональный объект.

alexey-malov commented 9 years ago

k=0,8 за исполнение и 1,1 за срок