Cominciamo con un esempio.
Diciamo che ho un metodo chiamato export
che dipende fortemente dallo schema del DB. E per "dipende fortemente" intendo che so che l'aggiunta di una nuova colonna a una determinata tabella spesso (molto spesso) porta alla export
modifica del metodo corrispondente (di solito è necessario aggiungere anche il nuovo campo ai dati di esportazione).
I programmatori spesso dimenticano di cambiare export
metodo poiché non è davvero chiaro che dovresti anche guardare questo. Il mio obiettivo è costringere il programmatore a prendere esplicitamente una decisione per determinare se si è dimenticato di esaminare il export
metodo o semplicemente non desidera aggiungere un campo ai dati di esportazione. E sto cercando la soluzione di progettazione per questo problema.
Ho due idee, ma entrambe hanno dei difetti.
Wrapper "Leggi tutto" intelligente
Posso creare il wrapper intelligente che garantisce che tutti i dati vengano letti in modo esplicito.
Qualcosa come questo:
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
afferma se table_row
contiene altri campi che non sono stati letti. Ma tutto questo sembra un po 'pesante e (forse) influenza la perfomance.
"Controlla quel metodo" unittest
Posso solo creare il unittest che ricorda l'ultimo schema della tabella e fallisce ogni volta che la tabella viene cambiata. In tal caso il programmatore vedrebbe qualcosa come "non dimenticare di controllare il export
metodo". Per nascondere il programmatore di avvertenze, sarebbe (o non sarebbe - questo è un problema) il check-out export
e manualmente (è un altro problema) risolvere il test aggiungendo nuovi campi al suo interno.
Ho alcune altre idee ma sono troppo problematiche da implementare o troppo difficili da capire (e non voglio che il progetto diventi un enigma).
Il problema sopra è solo un esempio della più ampia classe di problemi che incontro di volta in volta. Voglio associare alcuni pezzi di codice e / o infrastruttura, quindi cambiando uno di essi si avverte immediatamente il programmatore per controllarne un altro. Di solito hai alcuni strumenti semplici come estrarre la logica comune o scrivere unittest affidabile, ma sto cercando lo strumento per casi più complessi: forse alcuni modelli di design di cui sono ora a conoscenza.
export
ha tutto ciò di cui hai realisticamente bisogno?
export
sulla base dello schema?