понедельник, 7 декабря 2015 г.

Принципы GRASP

Сегодня поговорим о более абстрактных вещам, а именно о GRASP.
Что же это такое и для чего это нужно? Давайте попробуем разобраться.

GRASP (General Responsibility Assignment Software Principles) - общие принципы распределения обязанностей, иногда их называют GRASP шаблоны.
Название "шаблоны", мне не нравятся и кажется,что "принципы" будет более подходящее определение. Т.к. GRASP не несет в себе каких то строгих структур, это скорее набор неких правил примененимых к ООП, принципов проверенных временем. В первые, они были упомянуты в книге  Крейга Лармана "Применение UML и шаблонов проектирования". GRASP является полезным иструментом разработчика в проектировании и создании программного обеспечения.

Всего принципов девять, название умышленно не буду переводить: Controller, Creator, Indirection, Information Expert, High Cohesion, Low Coupling, Polymorphism, Protected Variations и Pure Fabrication.

И так, начнем с самого простого.

Polymorphism (Полиморфизм) - этот принцип, является основным в концепции объектно-оринтированного программирования. Он обозначает, способность некоторого объекта изменять свое поведение. А именно, есть объект класс Animal, данный класс реализует два интерфейса - Predator и Herbivore, таким образом в зависимости от типа интерфейсной ссылки объект может обладать поведением хищника или травоядного, волком или безобидной овечкой.

Information Expert - информационный эксперт, принцип, который определяет, объект какого класса будет выполнять какую то логику. Он гласит, объект имеющий информацию для выполнения какого то действия и должен выполнять это действие. Вполне разумно :)

Controller - контроллер. Это некоторый объект имеющий методы для обработки некоторых событий, которые он делегирует уполномоченным классам. Всем известен шаблон MVC, да-да буква C - это тот самый контроллер.

Creator - создатель, принцип, определяющий, кто должен создавать объекты. Данный принцип содежит несколько правил, а именно - класс А должен создавать класс Б, если он удовлетворяет как минимум одному из требований:

  • класс А содержит или агрегирует экземпляры класса Б
  • класс А активно использует объекты класса Б
  • класс А обладает информацией для инициализации объектов класса Б
  • класс А записывает экземплятры класса Б

Indirection (Перенаправление) - принцип, определяющий объект, который является промежуточным звеном между двумя другими. Он нужен для уменьшения связанности (что такое связанность читайте ниже). Таким объектом может выступать, например, сервис, обеспечивающий прослойку между слоем DAO (уровнь абстракции, отвечающий за сохранение данных в БД), и контроллерами.

Low Coupling (низкая сцепленность) - этот принцип, пропагандирует низкую взаимосвязь между двумя классами, компонентами системы. Благодаря, такому подходу достигается высокое повторное использование кода и минимизация влияния изменений в одном класса на другие. В качестве примера можно привести такую ситуацию, классы взаимодействуют друг с другом через определенный интерфейс, при этом не зная деталей реализации. Это позволяет легко менять реализацию на какую то другую, или изменять внутреннюю логику, не нарушив при этом работу других компонентов системы.

High Cohesion (Высокая связанность) - принцип, говорящий о том, что каждый класс должен иметь четкую сфокусированную цельную функциональность. Класс не должен выполнять разнородные операции, а иметь какую то определенную, вырожденную цель. Например, класс Car не должен иметь методы, не относящийся к нему, вроде подсчета определения ближайшего автосервиса или расчет процента по автокредиту.

Protected Variations (Сокрытие реализации) - очень похож на инкапсуляцию - еще один принцип ООП. Он защищает объекты от изменения другими элементами, путем вынесения взаимодействия в фиксированный интерфейс.

И наконец, надеюсь, я вас не утомил и вы дочитали до этого момента, Pure Fabrication (Чистая выдумка) - принцип, определяющий объекты, которые не имеют объекта в предметной области, но позволяют вынести ту функциональность, которая не относится напрямую к классу, например, сохранение в БД или отображение на UI. Таким образом, вводя дополнительный объект, мы достигаем повышения связанности класса, являющимся экземпляром предметной области.
Надеюсь, статья вам помогла разобраться в том, что же такое GRASP.