Commençons par un exemple.
Disons que j'ai une méthode appelée export
qui 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 export
changement 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 export
mé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 export
mé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, checker
affirme si table_row
contient 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 export
méthode». Pour cacher l'avertisseur, le programmeur vérifierait (ou non - c'est un problème) export
et 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.
export
tout ce dont vous avez réellement besoin?
export
sur la base du schéma?