Рефакторинг instanceOf, перемещение логики в POJO, когда она взаимодействует с базой данных

Рефакторинг instanceOf, перемещение логики в POJO, когда она взаимодействует с базой данных
Рефакторинг instanceOf, перемещение логики в POJO, когда она взаимодействует с базой данных - muhamad_arzan @ Unsplash

похоже на хрестоматийный случай шаблона "Посетитель".

Вы можете иметь RecordValidationVisitor и RecordDaoVisitor, которые "посещают" каждый тип записи соответственно. Таким образом, вы можете свободно комбинировать вещи, которые обрабатывают записи, как вы хотите.

Вы определите своего посетителя следующим образом:

interface RecordVisitor {
  void visitRecordA(value: RecordA)
  void visitRecordB(value: RecordB)
}

, а ваши классы как:

class RecordA {
  void accept(visitor: RecordVisitor) {
    visitor.visitRecordA(this) 
  }
}

И затем вы можете иметь следующих посетителей:

class RecordDaoVisitor extends RecordVisitor {
  
  void visitRecordA(value: RecordA) {
    recA_dao.create(value);
  }

  void visitRecordB(value: RecordB) {
    recB_dao.create(value);
  }
}

class RecordDaoVisitor extends Visitor {
  // Implementation...
}

И, наконец, вы можете использовать их следующим образом:

var record = ??? // RecordA or RecordB doesn't matter

record.accept(recordDaoVisitor);
record.accept(recordValidationVisitor);

имеет несколько преимуществ по сравнению с вашим текущим подходом:

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

LetsCodeIt, 24 января 2023 г., 13:51

Похожие посты

Хранение как скомпилированного сервиса для контейнера Docker, так и самого контейнера в репозитории. Хорошая практика, плохая практика или нет прецедента?Оптимальный способ реализации сеансового кэшаШаблон для преобразования различных типов одинаковых неизменяемых объектов в один и тот же объектВнедрение зависимостей против статических зависимостейКак рефакторить этот код, чтобы он подчинялся принципу "открыто-закрыто"?Как реализовать конвертеры без необходимости реализовывать каждую перестановкуПроектировать на будущее или сделать его тесно связанным с реализациейОпределение "коллабораторов" (объекта) в проектировании программного обеспечения?Разоблачение только геттеров одноэлементного интерфейса в C++Как создать интерфейс на C, который может работать с двумя идентичными структурами с полями с разными именами