Хорошо это или нет иметь временные поля для сохранения дорогостоящей работы между модулями
Я имею:
- Необработанный объект: содержит необработанные данные перед импортом в систему
- Модуль № 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 вы можете проверить, находится ли объект в кэшированном словаре / списке (словарь должен быть проще, поскольку вы можете искать значение на основе ключа), и, если он отсутствует, загружать его только из базы данных.