Oggi ho visto il seguente schema: hai un oggetto A e un oggetto B. L'oggetto B accetta un puntatore ad A nel suo costruttore.
Una volta che B è stato creato, esiste un metodo B.doCalc () che esegue un calcolo (internamente usando le informazioni di A). Il risultato è ottenuto con il metodo B.getResult ().
Per eseguire un altro calcolo, A viene modificato e B.doCalc () viene chiamato di nuovo.
Qual è la tua opinione su questa scelta? L'avrei progettato diversamente, ma voglio sentire la tua voce.
Modifica : nota che la mia obiezione principale è modificare A per avere un risultato diverso da B, senza toccare B.
Sebbene sia simile, penso che proprio questa disciplina esprima una sensazione molto migliore di ciò che sta accadendo. Invece di
a = new A
a.whatever = 5
b = new B(a)
b.doCalc()
res = b.getResult()
a.whatever = 6
b.doCalc()
res = b.getResult()
Ottieni l'oggetto puntatore da b stesso.
a = new A
a.whatever = 5
b = new B(a)
b.doCalc()
res = b.getResult()
a = b.getAPointer()
a.whatever = 6
b.doCalc()
res = b.getResult()
perché rende più esplicito il fatto che a è preso da b e quindi modificato. Non mi piace ancora, però ...
Modifica 2 : uno dei motivi per cui B accetta A al costruttore è perché deve configurare i dati interni per il calcolo. Questi dati
- dipende dalla natura di A
- devono essere letti dal disco, che può essere lento
- B può essere eseguito molte volte sullo stesso A, anche se leggermente modificato A. La natura di queste modifiche non invalida i dati interni di B. Non vogliamo caricare nuovamente le informazioni ogni volta che doCalc () viene invocato, né correre il rischio di eseguire doCalc (a) con i dati interni di B che sono incoerenti con l'A inoltrato.