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 разрешает спор в пользу поддерживаемости.