Хорошо это или нет иметь временные поля для сохранения дорогостоящей работы между модулями

Я имею:

  • Необработанный объект: содержит необработанные данные перед импортом в систему
  • Модуль № 1: Валидатор, который будет проверять необработанные объекты
  • Модуль № 2: Средство обновления, которое будет использовать проверенные необработанные данные (неверные данные были удалены) для создания реальных объектов

Модуль № 1 должен определить, существует ли ItemCode (просто пример, фактическое количество ключей десятки) в базе данных или нет. Модуль № 2 должен получить объект Item, запросив ItemCode в базе данных.

Разработчик хочет добавить чужое свойство .TempItem в необработанный объект, чтобы Модуль № 1 назначил объект Item свойству .TempItem (потому что это очень легко сделать), а Модуль № 2 просто должен использовать .TempItem без запрашивая базу данных во второй раз.

Мой технический эксперт советует, что это не хорошо.

Я хочу следовать принципам программирования и лучшим практикам, но понятия не имею, как.

Любая помощь приветствуется.

2 ответа

Решение

То, что у вас есть с модулями № 1 и № 2, является конвейерным процессом. Выход #1 переходит в #2. Любая информация, в которой нуждается # 2, которая уже установлена ​​#1, может (возможно, должна) быть кэширована.

Я бы создал дополнительный объект для передачи этой информации о состоянии через конвейер (@astander предлагает словарь, но во многих случаях жестко запрограммированный объект, который хранит именно те данные, которые вам нужны, будет прост в написании и намного более удобен в использовании / обслуживании)

Использование "tempitem" - это по сути тот же механизм, но плохая его реализация - хотя идея та же (не считывайте одну и ту же информацию из базы данных несколько раз)

Передавая объект состояния через ваш конвейер, вы сохраняете процессоры конвейера слабо связанными (# 2 не нужно знать о #1, он просто воздействует на передаваемую информацию о состоянии), что упрощает добавление новых этапов конвейера или рефакторинг ваших модулей в будущем. Передавая данные в отдельный класс, это также позволяет легко добавлять новые данные о состоянии, которые будут передаваться через систему.

Я не думаю, что вам нужно добавить временный элемент в необработанный объект.

Вы можете использовать кэширование и сохранить объект в словаре / списке и передать его в Module2, чтобы использовать для поиска.

Затем в Module2 вы можете проверить, находится ли объект в кэшированном словаре / списке (словарь должен быть проще, поскольку вы можете искать значение на основе ключа), и, если он отсутствует, загружать его только из базы данных.

Другие вопросы по тегам