Добавил:
выбрасываю тут свой мусор, надеюсь, что он кому-то может пригодится... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP-KONEChNYJ.docx
Скачиваний:
20
Добавлен:
03.12.2023
Размер:
7.72 Mб
Скачать

44. Формулировка, назначение и примеры использования принципа наименьшего знания (plk).

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

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

45. Назначение и формулировка шаблона Controller. Основные виды контроллеров и управление сложностью функционирования ис.

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

  • Класс представляет всю систему в целом, устройство или подсистему (внешний контроллер)

  • Класс представляет сценарий некоторого прецедента, в рамках которого выполняется обработка всех системных событий. Для всех системных событий в рамках одного сценария прецедента используется один и тот же класс-контроллер.

Прецедент (или вариант использования) описывает некоторый целостный фрагмент поведения системы, не вдаваясь при этом в особенности внутренней структуры субъекта.

Первым типом контроллеров является внешний контроллер (facade controller или Front Controller), представляющий всю систему, устройство или подсистему. Если применяется контроллер прецедента (use case controller), то для каждого прецедента должен существовать отдельный контроллер. Не объект предметной области, а искусственная конструкция.

Проблема: кто должен отвечать за обработку системных событий?

Системное событие – это событие высокого уровня, генерируемое внешним исполнителем (событие с внешним входом). Системные события связаны с системными операциями, т.е. операциями, выполняемыми системой в ответ на внешние воздействия.

Решение: делегирование обязанностей по обработке системных сообщений классу, удовлетворяющему одному из следующих условий:

  • класс представляет всю систему в целом (внешний контроллер);

  • класс представляет активный объект из реального мира (например, роль человека), который может участвовать в решении задачи (контроллер роли);

  • класс представляет искусственный обработчик всех системных событий некоторого прецедента использования системы и обычно называется <Прецедент>Handler (контроллер прецедента);

  • для системных событий множества родственных сценариев для всех прецедентов используется один и тот же контроллер. Например, для сценария создания и удаления пользователя, можно иметь один UserController, вместо двух отдельных контроллеров вариантов использования;

  • для всех системных событий одного нетривиального сеанса используется один контроллер. Сеанс - это реализация взаимодействия с исполнителем. Сеансы могут иметь произвольную длину, но зачастую организованы в рамках одного прецедента (сеанса прецедента

Контроллер – это объект, не относящийся к интерфейсу пользователя и отвечающий за обработку системных событий. Контроллер определяет методы для выполнения системных операций. Выбор наиболее подходящего контроллера определяется другими факторами, в частности степенью зацепления и связыванием

Первым типом контроллеров является внешний контроллер, представляющий всю «систему». Основная идея сводится к выбору некоторого класса, имя которого охватывает все слои приложения. Этот класс обеспечивает главную точку вызова всех служб из интерфейса пользователя и обращения к остальным слоям. Этот класс может представлять физический объект, например систему управления продажами или всю программную часть системы, или любые другие понятия, выбранные разработчиком для представления системы в целом.

Если применяется искусственный контроллер прецедента (use case controller), то для каждого прецедента должен существовать отдельный контроллер. Заметим, что это не объект из предметной области, а искусственная конструкция, поддерживающая функционирование системы. Например, если в системе розничной торговли используются прецеденты Buy Item и Return Item, то в ней должны быть реализованы контроллеры BuyItemHandler и ReturnItemHandler.

Достоинства:

  • улучшение условий для повторного использования компонентов. Этот шаблон обеспечивает обработку процессов предметной области на уровне реализации объектов, а не на уровне интерфейса. Обязанности контроллера могут быть технически реализованы в объектах интерфейса, однако в этом случае программный код и логические решения, относящиеся к процессам предметной области, будут жестко связаны с элементами интерфейса;

  • контроль состояния прецедента. Иногда необходимо удостовериться, что системные операции выполняются в некоторой определенной последовательности. Например, необходимо гарантировать, чтобы операция «Сделать оплату» выполнялась только после операции «Завершить продажу», для чего необходимо накапливать информацию о последовательности событий. Для этой цели удобно использовать контроллер, особенно контроллер прецедента.

Плохо спроектированный класс контроллера имеет низкую степень зацепления: он выполняет слишком много обязанностей и является несфокусированным. Такой контроллер называется раздутым (bloated controller). Признаки раздутого контроллера таковы.

  • в системе имеется единственный класс контроллера, получающий все системные сообщения, которых поступает слишком много. Такая ситуация зачастую возникает при использовании внешнего или ролевого контроллера;

  • контроллер сам выполняет все задачи, не делегируя обязанности другим классам. Обычно это приводит к нарушению основных принципов шаблонов «Эксперт» и «Сильное зацепление»;

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

Соседние файлы в предмете Объектно-ориентированное программирование