Более сложный пример инкапсуляции.
В каталоге плохих запахов кода Мартина Фаулера есть такой запах, который называется
"Связанные данные" (Data clumps).
Начинающие рефактореры редко обращают на него внимание, и очень зря. Ибо для того,
чтобы научиться писать хороший обектно-ориентированный код нужно выработать
особенно тонкое чутье к этому запаху. Ибо он устраняется с помощью рефакторинга
"Выделение класса" (Extract class).
Что это такой за запах?
Это когда у нас есть некоторый набор данных, довольно тесно связанных друг с другом.
Когда некоторый набор данных неразрывно путешествует друг за другом из метода в метод,
из функции в функцию. Когда этот набор невозможно разделить на составляющие - это
верный признак того, что из этих данных нужно составить новый класс.
Нужно ИНКАПСУЛИРОВАТЬ эти данные в класс.
А методы, в которые эти данные передавались как параметры - станут первыми кандидатами
на то, чтобы стать методами данного класса.
Ведь что такое класс в самом общем смысле этого слова? Это некоторые данные, и методы
работы с ними. Данные первичны.
Пример.
Есть у меня достаточно хитрая система расчета зарплаты. И в рамках этой системы мне
довольно часто нужно знать коэффициент выполнения менеджером плана по бренду. А так
же коэффициент выполнения менеджером общего плана продаж. Естественно, эти кэффициенты
меняются каждый месяц. И у каждого менеджера эти коэффициенты разные.
Соответственно, у нас есть плотная связка данных: Менеджер + Месяц. И пара методов для
работы с ними: КВПП_Общий() и КВПП_Бренда(Бренд). Обратите внимание, мне нет надобности
передавать в свои методы менеджера и месяц в качестве параметров. Эти данные уже там
есть. Они инкапсулированы в классе.
Даже создание таких маленьких классов (два параметра и два метода) позволяет довольно
сильно разгрузить код от подробностей. А говорят, что иногда такие наборы данных
могут довольно сильно разрастись, и что в таком случае подобная инкапсуляция - это
верное средство от расстройства рассудка. Охотно верю.
ООП. Инкапсуляция, часть 3.
12.12.08
Разработка - Математика и алгоритмы
Заключительная серия размышлений об инкапсуляции в 1С.