У каждой функции (метода, процедуры) есть два аспекта, две точки зрения, с которых можно на неё смотреть.
Первый аспект — цель, конечный результат, которых она достигает («намерение» в терминологии Мартина Фаулера). Цель — внешний аспект, то, как её видят её пользователи. Польза, которую она приносит.
Конечный результат связан с контрактом, обещанием, которое даёт функция своим пользователям — обещанием сделать определённое что-то.
Второй аспект, внутренний — это реализация (implementation — осуществление). Это путь, которым достигаются цель и результат. Конкретный набор операций, который необходимо выполнить на пути к цели.
Эти аспекты связаны между собой, но не жёстко. Цель первична, реализация подчинена цели, но не наоборот. Достичь цели можно разными путями, так что каждой цели могут соответствовать разные реализации. Скажу больше — реализация иногда эволюцонирует во времени: если сегодня нам больше подходит один способ, то завтра будет правильнее применить другой. Реализация даже может выбираться динамически, налету, в зависимости от текущих внутренних условий работающего проекта.
Эти аспекты на самом деле присущи не только функциям, а вообще любому коду: любой код написан ради достижения определённой цели (что — конечный результат), и делает это своим определённым способом (как — реализация).
Из осознания этих двух аспектов следуют два принципа:
- важно, чтобы каждая функция заключала в себе знание о том, как достичь только одной цели (Single Knowledge Principle)
- важно, чтобы знание о способе достижения каждой цели присутствовало в коде проекта только один раз (Single Implementation Principle)
Что ещё почитать