«Сверху вниз» - это , уже использованное в вычислениях для описания техники анализа . Вместо этого я предлагаю использовать термин "снаружи-внутрь".
Outside-in - это термин из BDD, в котором мы признаем, что к системе часто подключается множество пользовательских интерфейсов. Пользователи могут быть как другими системами, так и людьми. Подход BDD аналогичен подходу TDD; это может помочь вам, поэтому я кратко опишу это.
В BDD мы начинаем со сценария - обычно это простой пример использования системы пользователем. Разговоры вокруг сценариев помогают нам понять, что система должна действительно делать. Мы пишем пользовательский интерфейс и можем автоматизировать сценарии для этого пользовательского интерфейса, если захотим.
Когда мы пишем пользовательский интерфейс, мы делаем его максимально тонким. Пользовательский интерфейс будет использовать другой класс - контроллер, модель представления и т. Д. - для которого мы можем определить API.
На этом этапе API будет либо пустым классом, либо (программным) интерфейсом. Теперь мы можем написать примеры того, как пользовательский интерфейс может использовать этот контроллер, и показать, как контроллер предоставляет значение.
В примерах также показана сфера ответственности контроллера и то, как он делегирует свои обязанности другим классам, таким как репозитории, сервисы и т. Д. Мы можем выразить это делегирование с помощью имитаций. Затем мы пишем этот класс, чтобы заставить примеры (модульные тесты) работать. Мы пишем достаточно примеров, чтобы наши сценарии на уровне системы прошли.
Я считаю, что обычно дорабатывают смоделированные примеры, так как интерфейсы макетов только сначала угадываются, а затем появляются более полно по мере написания класса. Это поможет нам определить следующий уровень интерфейсов или API-интерфейсов, для которых мы опишем больше примеров и т. Д. До тех пор, пока не потребуются дополнительные макеты и не пройдет первый сценарий.
Поскольку мы описываем больше сценариев, мы создаем различное поведение в классах, и мы можем изменить рефакторинг для удаления дублирования, когда разные сценарии и пользовательские интерфейсы требуют одинакового поведения.
Делая это извне, мы получаем как можно больше информации о том, какими должны быть API, и переделываем эти API как можно быстрее. Это соответствует принципам реальных опционов (никогда не совершайте рано, если вы не знаете, почему ). Мы не создаем ничего, что не используем, а сами API предназначены для удобства использования, а не для простоты написания. Код, как правило, пишется в более естественном стиле с использованием языка предметной области, а не языка программирования, что делает его более читабельным. Поскольку код читается примерно в 10 раз больше, чем написано, это также помогает сделать его более легким в обслуживании.
По этой причине я бы использовал внешний подход, а не интеллектуальные догадки снизу вверх. Мой опыт показывает, что в результате получается более простой, более прочный, более читаемый и более понятный код.