Программа курса← Объектно ориентированное программирование
1История ООП
2Объект и Класс
3Базовые концепции ООП
4Принцип проектирования GRASP
5Принцип проектирования SOLID
6Паттерны GOF

Pure Fabrication (Чистая выдумка)

TODO: отвалидировать – текст собран автоматически из материалов курса на Google Drive, проверьте формулировки и код.

Создание объекта, не отражающего никакую сущность предметной области, а нужного лишь для уменьшения зацепления, усиления связности и лёгкости переиспользования.

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

Зачем выдумывать сущности

По Information Expert сохранять заказ должен сам заказ: у него есть все данные. Но тогда доменный объект начнёт знать про SQL, соединения и транзакции – связность упадёт, а зацепление вырастет.

Выход – придумать класс, которого нет в предметной области:

// В предметной области нет никакого «репозитория» – это чистая выдумка,
// зато заказ ничего не знает про базу данных
public class OrderRepository
{
    public void Save(Order order) { }
    public Order GetById(int id) => null;
}
// В предметной области нет никакого «репозитория» – это чистая выдумка,
// зато заказ ничего не знает про базу данных
class OrderRepository {
public:
    void Save(const Order& order) {}

    std::optional<Order> GetById(int id) { return std::nullopt; }
};
// В предметной области нет никакого «репозитория» – это чистая выдумка,
// зато заказ ничего не знает про базу данных
type OrderRepository struct{}

func (OrderRepository) Save(order Order) error { return nil }

func (OrderRepository) GetByID(id int) (Order, error) { return Order{}, nil }
# В предметной области нет никакого «репозитория» – это чистая выдумка,
# зато заказ ничего не знает про базу данных
class OrderRepository:
    def save(self, order: Order) -> None:
        pass

    def get_by_id(self, order_id: int) -> Order | None:
        return None
// В предметной области нет никакого «репозитория» – это чистая выдумка,
// зато заказ ничего не знает про базу данных
class OrderRepository {
    save(order: Order): void {}

    getById(id: number): Order | null {
        return null;
    }
}
// В предметной области нет никакого «репозитория» – это чистая выдумка,
// зато заказ ничего не знает про базу данных
public class OrderRepository {
    public void save(Order order) { }

    public Order getById(int id) {
        return null;
    }
}
// В предметной области нет никакого «репозитория» – это чистая выдумка,
// зато заказ ничего не знает про базу данных
class OrderRepository {
    fun save(order: Order) = Unit

    fun getById(id: Int): Order? = null
}

Это тот случай, когда принципы GRASP спорят друг с другом, и Pure Fabrication разрешает спор в пользу поддерживаемости.