|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Se ci pensi bene è la stessa cosa che avviene quando, nel codice con lo switch, passi la costante STAMPA_PIPPO o STAMPA_PLUTO alla funzione che dovrà poi creare una delle due istanze: è il "chiamante" che avrà passato il valore che gli interessa. EDIT: Immagina di dover creare una lista di StampaPluto o StampaPippo. Al factory method passi il costruttore della classe che t'interessa, e lui provvede a generare la lista "giusta" e ritornartela. P.S. Ho modificato il mio precedente messaggio.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys Ultima modifica di cdimauro : 23-06-2006 alle 17:22. |
|
|
|
|
|
|
#22 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Mettiamo che il chiamante sia la GUI da cui l'utente può selezionare tra diversi tipi di file e ad ognuno (in base all'estensione) sia associato una appropriata classe Reader (interfaccia comune). Dalla GUI io al massimo posso ricevere il nome del file. Una classe Manager (tanto per rispettare il three level biz) demanderà ad un factory method il compito di istanziare la classe Reader appropriata, ma gli può passare solo l'estensione del file (oppure usare uno switch e decidere qual è la classe giusta Come associare l'estensione di un file all'appropriata classe Reader? |
|
|
|
|
|
|
#23 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
tomminno, quello che dici è vero: a monte uno statement decisionale c'è sempre, ma sempre meglio averne uno solo piuttosto che N con N uguale numero di classi derivate dalla classe base eventualmente moltiplicato per M numero di metodi astratti della classe base...
cioè, per spiegarmi meglio, ciò che non va fatto ed è rigorosamente da evitare, ma purtroppo spesso si fa, è la seguente cosa: istanziare un oggetto in base al tipo di operazione richiesta (e fin qua non ci si può far nulla, lo switch ci va per forza), dotare la classe di un campo Type che codifichi in qualche modo il tipo di oggetto, scegliere comportamenti successivi relativi all'oggetto in base al valore del campo Type; memorizzare un campo Type è ridondante perché è un'operazione già implicitamente fatta, implementata dal compilatore, e decidere il comportamento in base al valore di questo campo è una pessima scelta di design perché lo potrebbe già fare il compilatore attraverso il sistema delle funzioni virtuali, che guardacaso fek ci insegna risultare su molte architetture addirittura più efficiente dell'if o dello switch, e in fondo lo so pure io: sulla IA32 un CALL con operando di memoria costa sicuramente di meno di un CMP seguito da un Jcc, specialmente se anche il CMP ha operandi di memoria inoltre il CALL avviene per forza, mentre invece la CPU non può sapere se il Jcc avverrà, di conseguenza il CALL "sputtana" di meno la pipeline su questo sinceramente non so dirti di più perché conosco poco i meccanismi di branch prediction Ultima modifica di 71104 : 24-06-2006 alle 00:31. |
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
ciau |
|
|
|
|
|
|
#25 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Per quello che chiedi le soluzioni sono quelle "classiche": - catena hash; - albero binario di ricerca; - trie (un altro tipo di albero di ricerca, ma non binario); da aggiornare chiaramente quando viene aggiunta un'altra dll e relativa estensione (o estensioni). Non si possono usare né "switch" né catene di if, data la natura mutevole del problema (posso caricare quanti plug-in / dll voglio). Tornando al "togliere lo switch dal chiamate", di cui parlavi prima e ricollegandoci al problema iniziale, non vedo quale sia il problema: se un chiamante conosce ciò di cui ha bisogno, non c'è alcuno switch. Più chiaramente, se so che il factory dovrà creare liste di StampaPippo anziché StampaPluto, gli passerò il costruttore virtuale di StampaPippo. Ma non c'è alcuno switch né da parte del chiamante né da parte del factory.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#26 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:38.



















