Open alexey-malov opened 8 years ago
программа не спрашивает о сохранении изменний, если проигнорировать ввод последнего неизвестного слова
k=0,75
class DictionaryLogic
{
public:
DictionaryLogic(std::string const& filename);
~DictionaryLogic();
bool HasWord(std::string const& word);
std::string GetValueAt(std::string const& word);
void InsertPair(std::string const& first, std::string const& second);
void SetSaveState(bool flag);
bool GetSaveState();
void SaveNewWordsInFile();
std::map<std::string, std::string> DictionaryLogic::GetMapFromFile();
private:
std::string m_filename;
std::map<std::string, std::string> m_newWords;
std::map<std::string, std::string> m_oldWords;
bool m_needToSave;
};
методы, не изменяющие состояние словаря, должны быть объявлены константными
std::string GetValueAt(std::string const& word);
- дать имя из предметной области
void InsertPair(std::string const& first, std::string const& second)
- аналогично
void SetSaveState(bool flag)
- есть ли необходимость в этом методе. Разве сам класс не может выставить это состояние?
std::map<std::string, std::string> DictionaryLogic::GetMapFromFile();
- Нет необходимости в этом методе, т.к. используется только в тестах. Лучше тестировать класс методом черного ящика - зачем знать что там у класса внутри? Состояние объекта следует определять по его публичным методам.
void DictionaryLogic::SaveNewWordsInFile()
{
ofstream out(m_filename, ios_base::app);
for (auto & pair : m_newWords)
{
out << pair.first << ":" << pair.second << endl;
}
out.close();
}
я бы ожидал от этого метода, что после сохранения новых слов в файл будет сброшен флажок необходимости сохранения, а также список новых слов опустошится. потому как если будет возможность сохранять состояние словаря в любой момент, а не только при выходе, то последующие сохранения будут дописывать и дописывать новые слова
std::string DictionaryLogic::GetValueAt(std::string const& word)
{
std::string result;
try
{
result = m_oldWords.at(word);
}
catch (std::out_of_range const & e)
{
std::ignore = e;
}
return result;
}
неоднозначное решение. в случае получения перевода для отсутствующего слова возвращение пустой строки будет требовать от вызывающего кода обязательной проверки результата на пустоту.
Еще как вариант - возвращать boost::optional<string>
. В этом случае вызывающий код сможет проверить "есть результат" или "нет результата", прежде чем использовать его. В общем-то, отсутствие слова в словаре - нормальная ситуация. В этом случае HasWord вообще не нужен:
auto translaton = dictionary.GetTranslation(word);
if (translation)
{
cout << *translation;
}
else
{
cout << "no translation. please enter translation or enter empty line to cancel";
}
У классов должен быть префикс C
Стоит получше определиться с терминами. Рекомендую следующее:
протестировать DictionaryApp будет легче, если подсунуть ему в роли исходных данных сконфигурированный словарь, а также пользовательский ввод, моделирующий ряд простых сценариев взаимодействия пользователя с программой.
гугли inverse of control, dependency injection
k=0,85
при работе с пользователем не воспринимать отличный от Да ответ как Нет, т.к. пользщователь потеряет результаты работы