Почнемо з прикладу.
Скажімо, у мене є метод, який називається, 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
на основі схеми?