Beginnen wir mit einem Beispiel.
Nehmen wir an, ich habe eine Methode namens export
, die stark vom DB-Schema abhängt. Und mit „stark abhängig“ meine ich, dass das Hinzufügen einer neuen Spalte zu einer bestimmten Tabelle oft (sehr oft) zu einer entsprechenden export
Methodenänderung führt (normalerweise sollten Sie das neue Feld auch zu den Exportdaten hinzufügen).
Programmierer vergessen oft, die export
Methode zu ändern , da nicht klar ist, ob man sich das überhaupt ansehen sollte. Mein Ziel ist es, den Programmierer zu einer expliziten Entscheidung zu zwingen, um festzustellen, ob er die export
Methode vergessen hat oder einfach kein Feld zu den Exportdaten hinzufügen möchte. Und ich suche nach einer Designlösung für dieses Problem.
Ich habe zwei Ideen, aber beide haben Fehler.
Intelligenter Wrapper "Alles lesen"
Ich kann den Smart Wrapper erstellen, der sicherstellt, dass alle Daten explizit gelesen werden.
Etwas wie das:
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
Bestätigt also, checker
wenn table_row
andere Felder enthalten, die nicht gelesen wurden. Aber all das sieht irgendwie schwer aus und beeinflusst (vielleicht) die Leistung.
„Überprüfen Sie, dass die Methode“ Unittest
Ich kann gerade das unittest verursachen, das sich das letzte Tabellenschema erinnert und jedes Mal fehlschlägt, wenn die Tabelle geändert wird. In diesem Fall würde der Programmierer so etwas wie "Vergiss nicht, die export
Methode zu überprüfen " sehen. Das Ausblenden der Warnung Programmierer würde (oder würde nicht - das ist ein Problem) auschecken export
und manuell (das ist ein anderes Problem) den Test beheben, indem neue Felder hinzugefügt werden.
Ich habe ein paar andere Ideen, aber sie sind zu mühsam umzusetzen oder zu schwer zu verstehen (und ich möchte nicht, dass das Projekt zu einem Rätsel wird).
Das obige Problem ist nur ein Beispiel für die größere Gruppe von Problemen, auf die ich von Zeit zu Zeit stoße. Ich möchte einige Teile des Codes und / oder der Infrastruktur binden, sodass das Ändern eines davon den Programmierer sofort darauf hinweist, einen anderen zu überprüfen. Normalerweise haben Sie einige einfache Tools wie das Extrahieren allgemeiner Logik oder das Schreiben zuverlässiger Unittest, aber ich suche das Tool für komplexere Fälle: Vielleicht sind mir einige Entwurfsmuster bekannt.
export
alles vorhanden ist, was Sie wirklich benötigen?
export
basierend auf dem Schema generieren ?