← Назад к вопросам

Что такое GRASP?

3.0 Senior🔥 61 комментариев
#Архитектура и паттерны#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

GRASP — General Responsibility Assignment Software Patterns

GRASP — это набор из 9 паттернов назначения ответственности в объектно-ориентированном проектировании. Он помогает разработчикам принимать лучшие решения при распределении функционала между классами.

Основные паттерны GRASP

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

class ShoppingCart {
  constructor(items) {
    this.items = items;
  }
  
  calculateTotal() {
    return this.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  }
}

2. Creator Класс B должен создавать объекты класса A, если B содержит/агрегирует A или имеет данные инициализации для A.

class Order {
  createLineItem(product, quantity) {
    return new LineItem(product, quantity);
  }
}

3. Controller Ответственность за обработку системных событий и делегирование работы другим объектам.

class OrderController {
  createOrder(customerData, items) {
    const customer = new Customer(customerData);
    const order = new Order(customer, items);
    order.save();
    return order;
  }
}

4. Low Coupling Классы должны быть слабо связаны (низкая зависимость друг от друга).

// Плохо: высокая связанность
class ReportGenerator {
  constructor(database) {
    this.database = database;
  }
}

// Хорошо: низкая связанность через интерфейс
class ReportGenerator {
  constructor(dataSource) {
    this.dataSource = dataSource;
  }
}

5. High Cohesion Элементы класса должны быть сильно связаны, работать на общую цель.

// Плохо: низкая когезия
class User {
  validateEmail() {}
  sendEmail() {}
  logToDatabase() {}
  generateReport() {}
}

// Хорошо: высокая когезия
class User {
  validateEmail() {}
  getEmail() {}
}

class EmailService {
  sendEmail(user) {}
}

6. Polymorphism Используй полиморфизм вместо условных операторов для обработки различных типов.

// Плохо: условные операторы
class PaymentProcessor {
  process(payment) {
    if (payment.type === 'credit_card') {
      // обработка
    } else if (payment.type === 'paypal') {
      // обработка
    }
  }
}

// Хорошо: полиморфизм
class PaymentProcessor {
  process(payment) {
    payment.process();
  }
}

7. Pure Fabrication Создавай классы, которые не имеют аналогов в предметной области, если это упрощает архитектуру.

class UserService {
  createUser(data) {
    const user = new User(data);
    user.validate();
    user.save();
    return user;
  }
}

8. Indirection Используй промежуточные объекты для снижения прямых зависимостей.

class DataRepository {
  constructor(database) {
    this.database = database;
  }
  
  getData() {
    return this.database.query();
  }
}

class ReportGenerator {
  constructor(repository) {
    this.repository = repository;
  }
}

9. Protected Variations Защищай классы от изменений в других классах через стабильный интерфейс.

class PaymentGateway {
  pay(amount) {
    // Интерфейс остаётся стабильным
  }
}

Почему GRASP важен

  • Лучшая архитектура — упрощает проектирование систем
  • Меньше ошибок — правильное распределение ответственности предотвращает баги
  • Проще поддерживать — код легче понять и модифицировать
  • Переиспользование — слабо связанные компоненты переиспользуются в других проектах

GRASP является фундаментом для более сложных паттернов (Design Patterns, Clean Architecture).

Что такое GRASP? | PrepBro