Ответ
GRASP (General Responsibility Assignment Software Patterns) — это набор из 9 принципов-паттернов, помогающих корректно распределять обязанности (responsibilities) между классами и объектами в ООП.
Основные паттерны GRASP:
- Информационный эксперт (Information Expert): Ответственность должна быть назначена тому классу, который обладает всей необходимой для ее выполнения информацией (данными).
- Создатель (Creator): Класс
Aдолжен создавать экземпляры классаB, если:Aсодержит или агрегируетB.Aзаписывает или часто используетB.Aобладает данными для инициализацииB.
- Контроллер (Controller): Не следует смешивать логику UI и приложения. Для обработки системных событий следует выделить отдельный класс-контроллер.
- Слабое зацепление (Low Coupling): Стремиться к минимальным зависимостям между классами для повышения гибкости и упрощения изменений.
- Высокое сцепление (High Cohesion): Класс должен иметь четкую, узконаправленную ответственность, а его методы должны быть тесно связаны с этой ответственностью.
- Полиморфизм (Polymorphism): Для обработки альтернативных вариантов поведения на основе типа следует использовать полиморфные операции (интерфейсы, абстрактные классы).
- Чистая выдумка (Pure Fabrication): Если ни один из существующих классов не подходит по принципам High Cohesion и Low Coupling, можно создать искусственный, "сервисный" класс.
- Посредник (Indirection): Для уменьшения прямой связанности между компонентами следует ввести промежуточный объект-посредник.
- Устойчивость к изменениям (Protected Variations): Выделять точки потенциальной изменчивости и инкапсулировать их за стабильным интерфейсом.
Пример "Информационный эксперт":
class ShoppingCart {
private List<Item> items; // Данные о товарах здесь
// Этот класс — "эксперт" по данным корзины, поэтому он вычисляет итог.
public double calculateTotal() {
return items.stream()
.mapToDouble(item -> item.getPrice() * item.getQuantity())
.sum();
}
}