Разбираем, зачем интерфейсу нужен «договор» (предусловия и постусловия), почему «тонкий» интерфейс проще реализовывать и тестировать, как фиксировать контракт прямо в сигнатуре через
const,
std::string_view,
std::optional и
[[nodiscard]], как честно описывать неуспех без исключений, а также как инварианты состояния влияют на поведение. В конце — практический пример для TaskBoard и разбор типичных ошибок проектирования.