High Cohesion (Сильное сцепление)

High Cohesion — это принцип, который задаёт свойство сильного зацепления внутри подсистемы. Классы (подсистемы) таким образом получаются сфокусированными, управляемыми и понятными. Зацепление (cohesion) (или более точно, функциональное зацепление) — это мера связности и сфокусированности обязанностей класса. Считается, что объект (подсистема) обладает высокой степенью зацепления, если его обязанности хорошо согласованы между собой и он не выполняет огромных объемов работы.

Класс с низкой степенью зацепления выполняет много разнородных функций или не связанных между собой обязанностей. Такие классы создавать нежелательно, поскольку они приводят к возникновению следующих проблем:

· трудность понимания;

· сложность при повторном использовании;

· сложность поддержки;

· ненадежность, постоянная подверженность изменениям.

Классы с низкой степенью зацепления, как правило, являются слишком «абстрактными» или выполняют обязанности, которые можно легко распределить между другими объектами.

 

Реализация прецедента "Получение билета"

В рамках реализации конкретного прецедента создаются проектные решения для каждой системной операции на основе текста сценария использования и описания операции.

Проектное решение: takeCard

Сначала необходимо выбрать класс-контроллер для обработки сообщений системной операции takeCard. Согласно шаблону Controller, в качестве контроллера может выступать класс, удовлетворяющий одному из следующих условий.

· Класс представляет всю систему в целом, "корневой объект", специализированное устройство или подсистему.

· Класс является получателем или обработчиком всех системных событий для некоторого сценария прецедента.

Выбор внешнего контроллера обусловлен в том случае, если в приложении существует всего несколько системных операций и на внешний контроллер будет возложено не слишком много обязанностей. Контроллеры прецедентов удобно использовать при наличии множества системных операций для распределения обязанностей между различными классами во избежание перегрузки классов-контроллеров. В нашей конкретной ситуации (малое количество прецедентов и системных операций, см. рис.1) будем использовать внешний контроллер GeneralController.

Согласно шаблону Creator класс GeneralController является подходящим кандидатом для создания объектов класса Card, т.к. он обладает данными для инициализации объектов Card.

С одной стороны, можно было бы поручить классу GeneralController напрямую взаимодействовать с классами хранилищ и передачи объекту Card всей необходимой информации для генерации представления билета выбранного конкретным студентом. Однако это привело бы к уменьшению степени зацепления для класса GeneralController, что противоречит шаблону High Cohesion. Таким образом, после создания объекта Card класс GeneralController должен передать некоторому объекту сообщение для начала генерации представления билета.

Для определения конкретного класса, реализующего генерацию представления билета, будем использовать шаблон Information Expert. Для этого дадим ответ на вопрос, какая информация нужна для данного действия. Ответ можно найти в описании прецедента: нужно знание о номерах тем и оценках конкретного студента на коллоквиумах и номера тем для выбранного студентом билета. Знание о темах билета содержится в классе описания билета, идентификатор конкретного объекта которого находится в объекте Card с момента его создания, а идентификатор объекта класса Student передается в качестве аргумента конструктора. Таким образом класс Card является информационным экспертом.

Классы CardStorage и MarkStorage являются частичными информационными экспертами в силу агрегации и, как следствие, обладания знанием об объектах Mark и Topic. Результат построения диаграммы взаимодействия приведен на рис. 5.

 

Рисунок 5 - Диаграмма взаимодействия для takeCard

 

Теперь рассмотрим пример построения диаграммы классов проектирования для данного проектного решения.

И диаграмма взаимодействия, и диаграмма классов проектирования должны обеспечивать выполнение постусловий соответствующего описания операции и быть построенными на базе взвешенного использования принципов проектирования GRASP. Два указанных вида диаграмм должны не противоречить друг другу, а взаимно дополнять. Таким образом на диаграмме классов проектирования дается информация, дополняющая рассуждения по составлению диаграммы взаимодействия. На следующем рисунке (рис. 6) представлена диаграмма классов проектирования для проектного решения takeCard.

 

Рисунок 6 - Диаграмма классов проектирования для takeCard

На рис. 6 показано, что объект GeneralController отвечает за создание и удаление объектов Card (этот факт дополнительно подчеркивается отношением композиции). Также показано, что в соответствии с шаблоном High Cohesion, класс Card содержит в качестве атрибутов ссылки на объекты типов CardStorage и MarkStorage для делегирования этим классам части своих обязанностей. Классы Card и Mark имеют зависимости от класса Student. Концептуальные классы Topic и Task не нашли отражения в самостоятельных классах проектирования, но показаны как коллекции объектов в классах хранилищах.



/footer.php"; ?>