- PVSM.RU - https://www.pvsm.ru -
Наименование: Functional Decomposition (функциональная декомпозиция)
Другие наименования: No Object-Oriented AntiPattern «No OO»
Масштаб: приложение
Рефакторинг: объектно-ориентированный реинжиниринг
Функциональная декомпозиция — хорошая практика процедурного программирования, так как она позволяет разделить приложение на отдельные функциональные модули.
К сожалению функциональную декомпозицию невозможно напрямую отразить в иерархии классов и поэтому иногда возникают проблемы, описываемые в статье.
Зачастую антипаттерн проявляется, когда опытные в процедурном программировании разработчики начинают проектировать и реализовывать программу на объектно-ориентированном языке. Если разработчики привыкли к наличию главной подпрограммы, которая вызывает другие подпрограммы, то они склонны выполнить каждую подпрограмму в виде класса, полностью игнорируя при этом иерархию классов (и в целом объектно-ориентированный подход).
Результирующий код похож на конструкции структурного языка программирования, реализованные в виде классов. Такой код может быть невероятно сложным, так как опытные разработчики могут придумывать хитрые способы повторить в объектно-ориентированной архитектуре оправданные временем техники процедурного программирования.
С антипаттерном зачастую можно столкнуться, когда С-программист начинает писать на C++, или пытается подключить CORBA интерфейсы, а также пытается использовать какую-либо объектную технологию. В долгосрочной перспективе порой бывает проще нанять программистов с объектно-ориентированным
Функциональная декомпозиция приемлема, если не требуется объектно-ориентированного решения. Данное исключение также может быть применено в тех случаях, когда в сущности чисто функциональное решение обернуто в классы для того, чтобы предоставить объектно-ориентированный интерфейс.
Если все еще возможно определить изначальные основные требования к ПО, то необходимо сооздать аналитическую модель ПО, которая бы описывала наиболее важные возможности ПО с пользовательской точки зрения. Это очень важно для определения назначения большинства программных конструкций в кодовой базе. На всех этапах рефакторинга антипаттерна необходимо детально документировать вносимые изменения — это облегчит жизнь тем, кто в будущем будет сопровождать систему.
Далее создайте модель проектирования, которая включает основные части существующей системы. Фокусируйтесь не на улучшении модели а на создании основы для описания как можно большей части системы.
В идеальном случае модель проектирования оправдает наличие большинства программных модулей. Разработка модели проектирования существующей кодовой базы очень важно — процесс дает понимание того, как система функционирует в целом.
Логично ожидать, что некоторые части системы существуют по причинам, уже неизвестным. Для классов, которые выпадают из проектной модели, используйте следующие правила:
Исследуйте архитектуру и найдите схожие подсистемы — это кандидаты для повторного использования. В рамках сопровождения программы выполняйте рефакторинг кодовой базы для повторного использования кода в схожих подсистемах (см. решение антипаттерна Spaghetti Code («спагетти-код») для детального описания рефакторинга).
Основой функциональной декомпозиции является последовательный вызов функций, выполняющих манипуляцию данными, например с использованием методов структурированного программирования Джэксона (Jackson Structured programming — JSP). Функции зачастую являются методами в объектно-ориентированном контексте. Распределение функций основывается на разных парадигмах ООП, которые приводят к разному группированию функций и связанных с ними данных в классах.
Простой пример на рисунке ниже демонстрирует процедурную версию сценария расчета кредита для клиента:
Сценарий расчета:
Следующий рисунок демонстрирует объектно-ориентированный взгляд на приложение расчета кредита. Процедурные функции отображаются на методы объектов.
Если на разработку системы уже затрачено значительно усилий, то вы можете применить подход, похожий на альтернативное решение проблемы антипаттерна Blob.
Вместо рефакторинга снизу-вверх сразу всей иерархии классов вы сможете расширить класс «главная подпрограмма» до класса «координатор», который будет управлять всем функционалом системы.
Функциональные классы могут затем быть трансформированы в квази-объектно-ориентированные классы путем их комбинирования а также переноса части их функционала в класс «координатор». В результате должна получиться более работоспособная иерархия классов.
Автор: snasoft
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/83586
Ссылки в тексте:
[1] мышлением: http://www.braintools.ru
[2] Источник: http://habrahabr.ru/post/251089/
Нажмите здесь для печати.