Pure Fabrication

«Чистая выдумка» — абстракция, которой нет в предметной области, но которая нужна машине: Repository, Storage, Promise, Socket, Array, DAO. Создаётся ради snижения coupling и separation of concerns.

Что это / Зачем

  • Не каждая абстракция должна моделировать реальный мир.
  • Машино-ориентированные абстракции (буферы, очереди, репозитории) — Pure Fabrication.
  • Они снижают зацепление между доменной логикой и инфраструктурой.

Признаки правильного применения

  • Класс не имеет аналога в предметной области (бухгалтер, заказ, пациент).
  • Класс существует ради техники: хранение, кеш, очередь, доступ к данным.
  • Можно подменить реализацию без изменения домена.

Пример: Storage как Pure Fabrication

// домен ничего не знает о файлах
class UserService {
  constructor(storage) { this.storage = storage; }
  async register(user) { return this.storage.save('users', user); }
}

// Pure Fabrication
class FileStorage {
  constructor(path) { this.path = path; }
  async save(collection, data) { /* writeFile */ }
  async load(collection, id)   { /* readFile  */ }
}

Многослойность Pure Fabrication

бизнес-логика
  ↓
Repository      ← Pure Fabrication (домен думает в терминах "найти пользователя")
  ↓
Loader/DAO      ← Pure Fabrication (выбор источника: SQL / HTTP / память)
  ↓
драйвер БД      ← Pure Fabrication (TCP-протокол к Postgres)

Антипаттерн

// домен знает про SQL, fs, TCP — нет Pure Fabrication
class Order {
  save {
    const conn = require('pg').Client;
    conn.query(`INSERT INTO orders…`);
  }
}

🎓 Источники

  • 🎓 [GRASP Pure Fabrication] · 2021-03-10 · YouTube
    • «Чистая выдумка улучшает coupling, делает separation of concerns».
    • Примеры из реальности: Promise, Socket, Array, DAL.
    • Pure Fabrication часто многослойна: репозиторий → загрузчик → драйвер.

См. также