Разбираем, почему скрытые зависимости (вроде прямого использования
std::cout) делают код хрупким, как «развернуть» ответственность с помощью инверсии (сборка в
main()), и как оформлять честные контракты через
std::istream
&/
std::ostream
&,
TaskRepository
& и отдельные компоненты (
Parser,
Printer,
CLI). Отдельно обсуждаем ссылки, указатели, владение (
std::unique_ptr) и «мягкую» инверсию через функции (
std::function).