В следующей книге - "Чистый код. Создание, анализ и рефакторинг" Роберта Мартина утверждается:
ФУНКЦИЯ ДОЛЖНА ВЫПОЛНЯТЬ ТОЛЬКО ОДНУ ОПЕРАЦИЮ. ОНА ДОЛЖНА ВЫПОЛНЯТЬ ЕЕ ХОРОШО. И НИЧЕГО ДРУГОГО ОНА ДЕЛАТЬ НЕ ДОЛЖНА.
Далее, автор задается вопросом, что значит "одна операция" и дает ответ:
Если функция выполняет только те действия, которые находятся на одном
уровне под объявленным именем функции, то эта функция выполняет одну операцию.
В примере (ниже), которым автор объясняет этапы работы функции на одном уровне абстракции под объявленным именем функции мне не удается ухватить понимание "одного уровня". Условный блок определяет уровень? Логическая последовательность выражений?
public static String renderPageWithSetupsAndTeardowns(
PageData pageData, boolean isSuite) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData. isSuite);
return pageData.getHtmlО;
}
Функция проверяет, является ли страница тестовой страницей.
Если является, то в нее включаются начальные и конечные блоки.
Для страницы генерируется код HTML.
Возможно есть более доходчивые примеры или объяснение?
(Если грамотно выстроенная функция реализуется именно с учетом уровней абстракции (как описывает автор), то это очень важная и глубокая концепция, которую следует понимать.)
Ответ
Абстракция данных из википедии
Придание объекту характеристик, которые чётко определяют его
концептуальные границы, отличая от всех других объектов.
Основная идея состоит в том, чтобы отделить способ использования
составных объектов
данных от деталей их реализации в виде более простых объектов, подобно
тому, как функциональная абстракция разделяет способ использования
функции и деталей её реализации в терминах более примитивных функций,
таким образом, данные обрабатываются функцией высокого уровня с
помощью вызова функций низкого уровня.
Уровнем абстракции Вы можете разделять своё приложение. Например, Вам нужно сделать страницу отправки форм. У Вас будет:
- Подключение к бд (1 уровень )
- CRUD работа с бд (2 уровень)
- отправка конкретной формы (3 уровень)
То есть у Вас будет 3 уровня и Вам необходимо, допустим, добавить подключение к ещё одной бд, где это реализовать? Естественно, на 1-м уровне. А если необходимо сделать ещё одну форму, то на 3-м.
Уровни абстракции определяете Вы, и поэтому это достаточно сложный процесс. Пример выше является лёгким потому, что он хрестоматийный.
Возьмём Вашу функцию.
Эта функция renderPageWithSetupsAndTeardowns может иметь несколько названий в зависимости от того как Вы построили уровни абстракции.
ПО идее, она должна называться просто renderPage. А разбор и установка, которые являются частью названия, должны быть на другом уровне абстракции (то есть класс, который рендерит страницу может либо иметь родителя, либо содержать объект, который делает разборку сборку html страницы).
Всё зависит от того как вы декомпозируете задачу. Какие объекты вы выберете за основу. Насколько много у Вас будут простых элементов.
Комментариев нет:
Отправить комментарий