Zacznijmy od przykładu.
Powiedzmy, że mam wywoływaną metodę, export
która zależy w dużym stopniu od schematu DB. Przez „mocno zależy” rozumiem, że dodanie nowej kolumny do określonej tabeli często (bardzo często) prowadzi do zmiany odpowiedniej export
metody (zwykle należy również dodać nowe pole do danych eksportu).
Programiści często zapominają o zmianie export
metody, ponieważ nie jest tak naprawdę jasne, że powinieneś nawet na to spojrzeć. Moim celem jest zmuszenie programisty do wyraźnego podjęcia decyzji, czy zapomniał spojrzeć na export
metodę, czy po prostu nie chce dodawać pola do danych eksportu. I szukam rozwiązania tego problemu.
Mam dwa pomysły, ale oba mają wady.
Inteligentne opakowanie „Przeczytaj wszystko”
Mogę utworzyć inteligentne opakowanie, które zapewni, że wszystkie dane zostaną odczytane.
Coś takiego:
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
Sprawdza więc, czy table_row
zawiera inne pola, które nie zostały odczytane. Ale wszystko to wygląda na ciężkie i (może) wpływa na wydajność.
„Sprawdź tę metodę” najczystsze
Mogę po prostu utworzyć unittest, który zapamiętuje ostatni schemat tabeli i zawiedzie przy każdej zmianie tabeli. W takim przypadku programista zobaczyłby coś w rodzaju „nie zapomnij sprawdzić export
metody”. Aby ukryć programator ostrzegający (lub nie chciałby - to problem), sprawdź export
i ręcznie (to kolejny problem) napraw test, dodając do niego nowe pola.
Mam kilka innych pomysłów, ale są one zbyt kłopotliwe do wdrożenia lub zbyt trudne do zrozumienia (i nie chcę, aby projekt stał się zagadką).
Powyższy problem jest tylko przykładem szerszej klasy problemów, które od czasu do czasu napotykam. Chcę powiązać niektóre fragmenty kodu i / lub infrastruktury, więc zmiana jednego z nich natychmiast ostrzega programistę, aby sprawdził inny. Zwykle masz kilka prostych narzędzi, takich jak wyodrębnianie wspólnej logiki lub pisanie rzetelnych, choć nieszablonowych, ale szukam tego narzędzia w bardziej skomplikowanych przypadkach: może niektóre wzorce projektowe są mi teraz znane.
export
ma wszystko, czego naprawdę potrzebujesz?
export
na podstawie schematu?