Iniziamo con un esempio.
Diciamo che ho un metodo chiamato export
che dipende pesantemente dallo schema del DB. E per "dipende pesantemente" intendo che so che aggiungere una nuova colonna a una certa tabella spesso (molto spesso) porta al corrispondente cambio di metodo export
(di solito dovresti aggiungere anche il nuovo campo ai dati di esportazione).
I programmatori dimenticano spesso di cambiare il metodo export
, dal momento che non è molto chiaro che dovresti anche guardarlo. Il mio obiettivo è forzare il programmatore esplicitamente a prendere una decisione per determinare se ha dimenticato di guardare il metodo export
o semplicemente non vuole aggiungere un campo ai dati di esportazione. E sto cercando la soluzione di design per questo problema.
Ho due idee, ma entrambe hanno difetti.
Smart "Leggi tutto" wrapper
Posso creare lo smart wrapper che assicura che tutti i dati siano letti esplicitamente.
Qualcosa del genere:
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
Quindi, checker
asserisce se table_row
contiene altri campi che non sono stati letti. Ma tutta questa cosa sembra piuttosto pesante e (forse) influisce sulla perfomance.
"Controlla che metodo" unittest
Posso semplicemente creare l'unittest che ricorda l'ultimo schema della tabella e fallisce ogni volta che la tabella viene cambiata. In quel caso il programmatore vedrebbe qualcosa come "non dimenticare di controllare il metodo export
". Per nascondere il programmatore di avviso sarebbe (o non sarebbe - questo è un problema) check out export
e manualmente (che è un altro problema) risolvere il test aggiungendo nuovi campi in esso.
Ho qualche altra idea, ma sono troppo fastidiose da implementare o troppo difficili da comprendere (e non voglio che il progetto diventi un puzzle).
Il problema precedente è solo un esempio della più ampia classe di problemi che incontro di volta in volta. Voglio legare alcune parti di codice e / o infrastruttura in modo che cambiando uno di loro immediatamente avvisi programmatore per controllare un altro. Di solito hai alcuni strumenti semplici come estrapolare la logica comune o scrivere un unittest affidabile, ma sto cercando lo strumento per casi più complessi: forse alcuni schemi di progettazione di cui sono ora a conoscenza.