GRASP
GRASP (General Responsibility Assignment Software Patterns) — набор принципов “кому из классов поручить эту ответственность”. Если SOLID говорит, каким должен быть готовый класс, то GRASP помогает решить, какому именно классу доверить ту или иную логику ещё на этапе проектирования.
Самые практичные принципы:
Information Expert. Ответственность должна лежать на классе, у которого есть данные, чтобы её выполнить:
class Order {
private List<Item> items;
int calculateTotal() { // у Order есть items — он и считает
return items.stream().mapToInt(Item::getPrice).sum();
}
}
Low Coupling (слабая связанность). Классы должны как можно меньше знать друг о друге — чем меньше связей, тем легче менять один класс, не затрагивая другие.
High Cohesion (высокая связность). Внутри одного класса методы и поля должны быть тесно связаны общей целью — это, по сути, то же самое, что SRP, только сформулировано как положительная цель, а не запрет.
Копнуть глубже
Low Coupling и High Cohesion — две стороны одной медали. Хороший дизайн стремится к высокой связности внутри класса (всё в нём логично объединено одной целью) и слабой связанности между классами (минимум зависимостей друг от друга). Плохой дизайн — наоборот: класс делает кучу несвязанных вещей (низкая связность), и при этом любое изменение в одном месте ломает половину системы (высокая связанность).
GRASP и SOLID не конкурируют, а дополняют друг друга. GRASP — более общие, “философские” принципы про распределение ответственности в самом начале проектирования. SOLID — более конкретные правила про то, каким должен получиться итоговый класс/интерфейс. На практике их используют вместе: GRASP помогает решить “кто за что отвечает”, SOLID — “как сделать это правильно технически”.
• разницу Low Coupling и High Cohesion и как GRASP соотносится с SOLID (если дошёл до 2-го слоя).