Архитектура
Как разложить проект, чтобы его можно было менять
После урока ты сможешь
- Отделять предметную логику от ввода-вывода
- Зависеть от интерфейсов, а не от конкретных классов
- Раскладывать проект по папкам и библиотекам
Шаг 1 из 9
Код, который нельзя менять
Вот типичная первая версия бота-заметочника. Она работает:
int main() {
std::vector<std::string> notes;
std::string line;
while (std::getline(std::cin, line)) {
if (line.starts_with("/add ")) {
notes.push_back(line.substr(5));
std::ofstream("notes.txt", std::ios::app) << line.substr(5) << '\n';
std::println("Сохранено");
} else if (line == "/list") {
for (std::size_t i = 0; i < notes.size(); ++i) std::println("{}. {}", i + 1, notes[i]);
}
// ...ещё двадцать веток
}
}
А теперь попробуй её изменить:
- Перенести в Telegram.
std::cinиstd::printlnвплетены в каждую ветку, придётся переписать всё. - Протестировать команду
/add. Тест запишет файл на диск и будет читать консоль. Так тесты не пишут. - Заменить файл на базу данных. Запись в файл тоже размазана по веткам.
Проблема не в отдельных строках, а в том, что всё смешано: что делать (логика), откуда пришло (ввод), куда сохранить (хранилище) и как ответить (вывод). Архитектура — это и есть способ разложить эти вещи по разным местам, чтобы каждую можно было менять отдельно.