Инженерия · Сборка и архитектура

Архитектура

Как разложить проект, чтобы его можно было менять

~40 мин 9 шагов

После урока ты сможешь

  • Отделять предметную логику от ввода-вывода
  • Зависеть от интерфейсов, а не от конкретных классов
  • Раскладывать проект по папкам и библиотекам

Шаг 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. Тест запишет файл на диск и будет читать консоль. Так тесты не пишут.
  • Заменить файл на базу данных. Запись в файл тоже размазана по веткам.

Проблема не в отдельных строках, а в том, что всё смешано: что делать (логика), откуда пришло (ввод), куда сохранить (хранилище) и как ответить (вывод). Архитектура — это и есть способ разложить эти вещи по разным местам, чтобы каждую можно было менять отдельно.