|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
singleton pattern
perchè si ricorre al attern singleton invece di usare una classe con soli membri statici? operativamente mi sembra la stessa cosa... o mi sfugge qualcosa?
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Il pattern singleton prevede che ci sia un metodo statico che ritorna una istanza (l'unica possibile) della classe.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
perchè usare il pattern singleton per fare quello che, se non sto prendendo cantonate, si può fare con una classe con soli membri statici? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Io il problema non me lo pongo, visto che non mi piacciono sia le classi con soli membri statici che il singleton pattern (tra l'altro l'uso, ma soprattutto l'abuso, è sconsigliato anche da chi l'ha messo su carta).
Comunque prima di tutto ci sono differenze a livello operativo: la classe con i soli metodi statici non ha un costruttore. Si può ovviare a questo mettendo un membro statico di controllo che richiami un membro statico "costruttore", ma crea notevoli ripetizioni nel codice, un codice con troppe ripetizioni non è un buon codice. Altri dubbi mi vengono dal significato che assume una classe con tutti membri statici...se le critiche mosse al singleton sono quelle di andare a ricreare una sorta di variabile globale quando anche nella programmazione non OO cercavamo di farne il più possibile a meno, le critiche che si possono fare alla classe di metodi statici sono ancora più serie: è la negazione della programmazione OO, in quanto di fatto si buttano dalla finestra le funzioni globali per reintrodurle da sotto la porta |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
io ritengo che l'abuso di qualsiasi cosa sia dannoso (salvo eccezioni che sarebbero OT Quanto al costruttore: creare un singleton con un parametro di costruzione è una cosa delicata di per sè... comuqnue questa situazione mi pare l'unica in cui un singleton è diverso da una classe con solo membri statici... è corretto? grazie a tutti per i vostri interventi passati e futuri |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Non è tanto il parametro del costruttore il problema, ma se l'oggetto istanziato una sola volta ha necessità di operazioni di inzializzazione. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Certo che va bene, ma in ogni altro metodo statico devi controllare se l'inizializzazione è già avvenuta e se non è avvenuta devi chiamare il metodo statico che fa l'inizializzazione.
if(!initDone) doInit(); Il che implica una duplicazione in ogni metodo statico. |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Odio il singleton pattern, abusato da molti perche` altrimenti non sanno come passare variabili nei metodi.
Si tratta dell'equivalente di scrivere codice C usando variabili globali invece che parametri e questa e` una cosa comunemente riconosciuta come sbagliata. Il singleton e` piu` accettato, secondo me, perche`: - E` un pattern quindi usarlo e` bene anche se leggendo i lpattern si son saltate un po` di righe... - E` object oriented. - E` sempre meglio che usare variabili globali. Comunque non so se ti riferisci a Java o C# ma in C++ il singleton viene usato principalmente perche` l'ordine di inizializzazione delle variabili globali e` undefined e se hai singleton che usano altri singleton nel costruttore (oddio!!!) avresti comportamento undefined. Ultima nota sul singleton pattern: si usa il singleton pattern quando il design esplicitamente richiede che esista UNA SOLA istanza di quell'oggetto e se mai nella vita del progetto dovessero esistere due o piu` istanze questo sarebbe un grave errore. |
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
Una variabile globale è assolutamente non protetta, un oggetto o una classe permettono l'incapsulamento, non è assolutamente la stessa cosa! "Generalmente" non significa "sempre" quanto alla tua lista di punti: - non uso cose perchè altri mi han detto che è bene: voglio sapere SE, QUANDO e PERCHE' è bene (e quali sono i compromessi)... per questo ho aperto il thread chiedendo la differenza tra una classe con membri static e un singleton - va beh, ma oop è un paradigma, non il dio supremo - ho già scritto a riguardo poche righe fa Quote:
|
||
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Una classe con metodi statici genera una dipendenza di definizione che, per l'orientamento agli oggetti, significa che oggetto è l'unione tra la definizione di quella classe e quella della classe utente.
E' corretto quando dici "l'unica differenza mi pare essere quella del costruttore con argomenti" perchè il confronto che fai è tra due forme Java che, sempre dal punto di vista dell'orientamento agli oggetti, generano entrambe dipendenza di definizione. Resta solo il "dettaglio tecnico" del costruttore. Al bocciofilo si dice che questo sia sbagliato. In verità è una questione di significati. L'orientamento agli oggetti è una prospettiva totalizzante. Non ci sono cose incompatibili con l'orientamento agli oggetti ma semplici alterazioni di significato. Dell'unico significato esistente nell'orientamento agli oggetti, vale a dire cosa sia oggetto e cosa sia parte della definizione di un oggetto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
soprattutto quando parli di dipendenza di definizione |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Quote:
Ricordo in diamonds i test che fallivano senza motivo per colpa del singleton pattern e l'uso oltrettutto era corretto... |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: Como
Messaggi: 709
|
Quote:
Il pattern singleton lo usi quando vuoi che ci sia una sola istanza di una classe per tutta la durata dell'applicazione, mediamente quando vuoi che ad una risorsa acceda sempre una classe per evitare problemi di concorrenza o di (mancanza di) atomicità sui dati. Esempio : un logger di sistema, ne vuoi uno solo che si occupi di memorizzare gli eventi sul sistema. Hai un'istanza, quindi hai un'oggetto con uno stato e i metodi che fornisce la classe modificano lo stato dell'oggetto (almeno in teoria, in pratica dipende dal tuo modo di vedere la programmazione ad oggetti).
__________________
Cristian ,il nOUS che invoglia i5-2500 (Sandy Bridge) Quad-Core 3,30 Ghz - Asus P8Z68-V PRO / GEN3 - 2x4GB DDR3 - GeForce GTX 550 Ti Pci-E 4 Gb ddr3 - Barracuda 7200.12 1 Tb Sata 600 Buffer 32 Mb 7200 Rpm |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Como
Messaggi: 709
|
Falso, il costrutto di default è sempre implicito. Tant'è che una buona classe di utilità dovrebbe definire esplicitamente il costruttore e con scope privato.
__________________
Cristian ,il nOUS che invoglia i5-2500 (Sandy Bridge) Quad-Core 3,30 Ghz - Asus P8Z68-V PRO / GEN3 - 2x4GB DDR3 - GeForce GTX 550 Ti Pci-E 4 Gb ddr3 - Barracuda 7200.12 1 Tb Sata 600 Buffer 32 Mb 7200 Rpm |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se io uso la classe con i soli metodi statici il costruttore di default non verrà mai chiamato. Allora mettiamola così: una classe con soli metodi statici non ha un costrutto equivalente al costruttore che permette di inizializzare la classe, almeno in C++ a quanto sembra. |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: Como
Messaggi: 709
|
Quote:
E' sbagliato che lo sia...e quindi si deve renderlo non istanziabile
__________________
Cristian ,il nOUS che invoglia i5-2500 (Sandy Bridge) Quad-Core 3,30 Ghz - Asus P8Z68-V PRO / GEN3 - 2x4GB DDR3 - GeForce GTX 550 Ti Pci-E 4 Gb ddr3 - Barracuda 7200.12 1 Tb Sata 600 Buffer 32 Mb 7200 Rpm |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:51.












,il nOUS che invoglia








