Commençons par un exemple.
Disons que j'ai une méthode appelée exportqui dépend fortement du schéma DB. Et par «dépend fortement», je veux dire que je sais que l'ajout d'une nouvelle colonne à une certaine table conduit souvent (très souvent) au exportchangement de méthode correspondant (en général, vous devez également ajouter le nouveau champ aux données d'exportation).
Les programmeurs oublient souvent de changer de exportméthode car il n'est pas vraiment clair que vous devriez même y regarder. Mon objectif est de forcer le programmeur à prendre explicitement une décision pour déterminer s'il a oublié de regarder la exportméthode ou s'il ne veut tout simplement pas ajouter un champ aux données d'exportation. Et je cherche la solution de conception pour ce problème.
J'ai deux idées, mais les deux ont des défauts.
Emballage intelligent «Tout lire»
Je peux créer le wrapper intelligent qui s'assure que toutes les données sont lues explicitement.
Quelque chose comme ça:
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
Ainsi, checkeraffirme si table_rowcontient d'autres champs qui n'ont pas été lus. Mais tout cela semble plutôt lourd et (peut-être) affecte la performance.
«Vérifiez cette méthode»
Je peux simplement créer le plus unitaire qui se souvient du dernier schéma de table et échoue à chaque fois que la table est modifiée. Dans ce cas, le programmeur verrait quelque chose comme «n'oubliez pas de vérifier la exportméthode». Pour cacher l'avertisseur, le programmeur vérifierait (ou non - c'est un problème) exportet corrigerait manuellement (c'est un autre problème) le test en y ajoutant de nouveaux champs.
J'ai quelques autres idées mais elles sont trop gênantes à mettre en œuvre ou trop difficiles à comprendre (et je ne veux pas que le projet devienne un puzzle).
Le problème ci-dessus n'est qu'un exemple de la classe plus large de problèmes que je rencontre de temps en temps. Je veux lier certains morceaux de code et / ou infrastructure, donc changer l'un d'eux alerte immédiatement le programmeur pour qu'il en vérifie un autre. Habituellement, vous avez des outils simples comme extraire une logique commune ou écrire des tests fiables, mais je recherche l'outil pour des cas plus complexes: peut-être certains modèles de conception dont je suis maintenant au courant.
exporttout ce dont vous avez réellement besoin?
exportsur la base du schéma?