Давайте начнем с примера.
Допустим, у меня есть метод, export
который сильно зависит от схемы БД. И под «сильно зависит» я имею в виду, что я знаю, что добавление нового столбца в определенную таблицу часто (очень часто) приводит к изменению соответствующего export
метода (обычно вы также должны добавить новое поле к данным экспорта).
Программисты часто забывают изменить export
метод, потому что не совсем понятно, стоит ли на это смотреть. Моя цель - заставить программиста явным образом принять решение, чтобы определить, забыл ли он посмотреть на export
метод или просто не хочет добавлять поле в данные экспорта. И я ищу дизайнерское решение для этой проблемы.
У меня есть две идеи, но у них обоих есть недостатки.
Умная оболочка «Читать все»
Я могу создать умную оболочку, которая обеспечивает явное чтение всех данных.
Что-то вроде этого:
def export():
checker = AllReadChecker.new(table_row)
name = checker.get('name')
surname = checker.get('surname')
checker.ignore('age') # explicitly ignore the "age" field
result = [name, surname] # or whatever
checker.check_now() # check all is read
return result
Таким образом, checker
утверждает, что table_row
содержит другие поля, которые не были прочитаны. Но все это выглядит довольно тяжело и (возможно) влияет на производительность.
«Проверьте этот метод»
Я могу просто создать unittest, который запоминает последнюю схему таблицы и завершается ошибкой при каждом изменении таблицы. В этом случае программист увидит что-то вроде «не забудьте проверить export
метод». Чтобы скрыть предупреждение, программист должен (или не хочет - это проблема) проверить export
и вручную (это еще одна проблема) исправить тест, добавив в него новые поля.
У меня есть несколько других идей, но они слишком сложны для реализации или слишком сложны для понимания (и я не хочу, чтобы проект стал загадкой).
Вышеупомянутая проблема - только пример более широкого класса проблем, с которыми я сталкиваюсь время от времени. Я хочу связать некоторые фрагменты кода и / или инфраструктуры, поэтому изменение одного из них немедленно предупреждает программиста о необходимости проверки другого. Обычно у вас есть несколько простых инструментов, таких как извлечение общей логики или написание надежного юнит-теста, но я ищу инструмент для более сложных случаев: возможно, некоторые шаблоны проектирования, о которых я сейчас знаю.
export
есть ли у вас все, что вам реально нужно?
export
на основе схемы?