Orario: 23-05-2013, 17:05 Benvenuto ospite! (Log inRegistrati)


Rispondi 
Avere una sola istanza di un oggetto..
Autore Messaggio
Tano
Ninja Scientist

Messaggi: 1,409
Registrato: Nov 2008
Offline Offline
#1 Avere una sola istanza di un oggetto..
0
..e non usare una SingleTon.. Cioè mi spiego meglio. Nel gioco a cui sto lavorando ho (diverse) classi che hanno informazioni che devono essere passate a vari States di gioco. Ad esempio ho il mio "GamePlayStateManager" che si occupa di far passare da uno stato ad un altro. Di questo manager devo avere una sola istanza, di conseguenza sono due le scelte: Passo l'istanza agli states oppure lo dichiaro singleton..

Qualcuno ha qualche idea? Oppure non sono stato chiaro? Fermosu

"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
24-02-2010 12:43
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
_tommo_
Mod nerdcore

Messaggi: 5,896
Registrato: Nov 2008
Offline Offline
#2 RE: Avere una sola istanza di un oggetto..
0
Lascia sta, usa singleton.
Lo dico per esperienza Asd

Nel mio stesso gioco m'era venuta la scimmia di non usare Singleton (che poi, che t'ha mai fatto Singleton Asd) e mi sono inventato ogni genere di roba...
morale: dopo 2 anni mi sono scocciato e ho rimesso 10 Singleton (una per Manager) che sono più veloci, più leggibili e più mantenibili.

Ricorda: Keep it Simple, Stupid. Dovrebbe stare scritto nel marmo sopra ogni monitor Asd

Al massimo, puoi provare a ridurre il numero di classi che "devono" essere singole: spesso e volentieri il requisito non regge...

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
(Questo messaggio è stato modificato l'ultima volta il: 24-02-2010 12:49 da _tommo_.)
24-02-2010 12:47
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tano
Ninja Scientist

Messaggi: 1,409
Registrato: Nov 2008
Offline Offline
#3 RE: Avere una sola istanza di un oggetto..
0
(24-02-2010 12:47)_ToMmO_ ha scritto:  Lascia sta, usa singleton.
Lo dico per esperienza Asd

Nel mio stesso gioco m'era venuta la scimmia di non usare Singleton (che poi, che t'ha mai fatto Singleton Asd) e mi sono inventato ogni genere di roba...
morale: dopo 2 anni mi sono scocciato e ho rimesso 10 Singleton (una per Manager) che sono più veloci, più leggibili e più mantenibili.

Ricorda: Keep it Simple, Stupid. Dovrebbe stare scritto nel marmo sopra ogni monitor Asd

Al massimo, puoi provare a ridurre il numero di classi che "devono" essere singole: spesso e volentieri il requisito non regge...

Si certo. Ma non mi piaceva l'idea di "abusare" con i singleton.. Son sicuro che il concetto di K.I.S.S. valga sempre Sorriso ma il dubbio me lo devo porre per poter imparare! Tanto ora viene st4lk3r87 e dice la sua Sisi e mi da del nubbio Disapprovazione

"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
24-02-2010 12:50
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
CiroContinisio
That guy

Messaggi: 6,083
Registrato: Oct 2009
Offline Offline
#4 RE: Avere una sola istanza di un oggetto..
0
Puoi avere una variabile statica di quella classe che tiene conto di quante istanze di quella classe sono state create.
La prima volta che chiami il costruttore, mette quella variabile ad 1. Dalla seconda in poi, fallisce. Es in Flash:

Codice:
package indievault
{
  public class Tommo
  {
    static private var quantiTommi:uint = 0;

    public function Tommo()
    {
      if(Tommo.quantiTommi == 1)
      {
        //genera l'errore - non mi ricordo come si fa :P
      }
      else
      {
        quantiTommi++;
      }
  }
}

Ciro Continisio
Tiny Colossus

[Immagine: fxTQO] [Immagine: facebook.png] [Immagine: youtube.png] [Immagine: indiedb.png] [Immagine: greenlight.png]
24-02-2010 12:54
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Tano
Ninja Scientist

Messaggi: 1,409
Registrato: Nov 2008
Offline Offline
#5 RE: Avere una sola istanza di un oggetto..
0
Si Ciro, ma il mio problema non è impedire di creare più istanze di un oggetto. Ma trovare un metodo "architetturale" che mi permetta di avere il controllo del mio StateManager senza dichiararlo singleton oppure passare un istanza in tutte le classi utilizzatrici. Smile.

"..Credevamo di aver successo un giorno, al teatro delle commedie, con due soli spettatori.." Takeshi Kitano.

[Immagine: linkedin-icon.png]
Gaetano Lenoci
Studio Leaves
Coward Knight
24-02-2010 12:58
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
enigma
Posting Freak

Messaggi: 1,871
Registrato: Nov 2009
Offline Offline
#6 RE: Avere una sola istanza di un oggetto..
0
Anche io, per quello che devi fare, ti consiglio singleton.
Poi se ci sono soluzioni migliori, sono curioso anche io di ascoltarle.

Andrea Benedetti
twitter | LinkedIn
Il tempo è un grande maestro, ma sfortunatamente uccide tutti i suoi allievi.
24-02-2010 12:59
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
_tommo_
Mod nerdcore

Messaggi: 5,896
Registrato: Nov 2008
Offline Offline
#7 RE: Avere una sola istanza di un oggetto..
0
(24-02-2010 12:58)Tano ha scritto:  Si Ciro, ma il mio problema non è impedire di creare più istanze di un oggetto. Ma trovare un metodo "architetturale" che mi permetta di avere il controllo del mio StateManager senza dichiararlo singleton oppure passare un istanza in tutte le classi utilizzatrici. Smile.

Ero sicuro ci fosse dietro lui Fermosi
Ma il vero mandante è Programmer di GPI Asd

Comunque nah, è vero che non bisogna abusare Singleton, ma va inteso nel senso che devi limitare le classi ad istanza singola globale.
Se quelle classi cel'hai beh puoi usarci tranquillamente Singleton.

Io avevo costruito un singleton manager: lui era singleton e teneva una lista di Manager non singleton.
Conclusioni dopo 2 anni? Uso troppo lungo, difficilmente mantenibile, aggiunge overhead di O(logn) dove singleton è O(1) e pure inline.
Nah, singleton è perfetta per fare quello che deve fare.

@Ciro: il vantaggio principale di Singleton non è tanto il counter quanto l'accesso globale, in quel modo non cel'hai Ahsisi

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
24-02-2010 13:11
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
CiroContinisio
That guy

Messaggi: 6,083
Registrato: Oct 2009
Offline Offline
#8 RE: Avere una sola istanza di un oggetto..
0
Ma infatti io quella cosa non la uso. E fra l'altro, in Flash non esistono i singleton nativamente. Sì possono implementare con un 'trucco', il mio preferito è questo:

Codice:
package managers
{
    public class UserMan
    {
        private static var instance:UserMan;        
        //================================================================================​====
        public function UserMan(_enf:SingletonEnforcer):void
        {
            
        }        
        //================================================================================​====
        public static function getInstance():UserMan
        {
            if(instance == null) instance = new UserMan(new SingletonEnforcer());
            return instance;
        }
    }
}

internal class SingletonEnforcer {}

E poi si accede ovunque tramite:

Codice:
UserMan.getInstance()

L'unica rogna è che non puoi passare parametri in fase di costruzione, anche se lo puoi fare in un secondo momento.

Questo era il mio umile contributo alla programmazione mondiale.

Ah,

Codice:
Tommo.getInstance() = null

Ciro Continisio
Tiny Colossus

[Immagine: fxTQO] [Immagine: facebook.png] [Immagine: youtube.png] [Immagine: indiedb.png] [Immagine: greenlight.png]
(Questo messaggio è stato modificato l'ultima volta il: 24-02-2010 13:18 da CiroContinisio.)
24-02-2010 13:17
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
hurricane86
Posting Freak

Messaggi: 1,266
Registrato: Jun 2009
Offline Offline
#9 RE: Avere una sola istanza di un oggetto..
0
se devi avere una SOLA istanza di una classe usa la singleton. Non c'è altro di meglio. La singleton è facile e sopratutto veloce!
Secondo me non c'è un vero e proprio abuso nell'uso di singleton...cioè usare o no la singleton dipende appunto dalla necessità di avere una e una sola istanza di una classe nell'intero progetto. Se si sceglie la singleton e questo principio non è valido si sta commettendo un errore di design grosso come una casa!

Citazione:E fra l'altro, in Flash non esistono i singleton nativamente.

In nessun linguaggio, che io sappia, la singleton è nativa.

Martino Giovanelli
(Questo messaggio è stato modificato l'ultima volta il: 24-02-2010 14:00 da hurricane86.)
24-02-2010 13:59
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
CiroContinisio
That guy

Messaggi: 6,083
Registrato: Oct 2009
Offline Offline
#10 RE: Avere una sola istanza di un oggetto..
0
(24-02-2010 13:59)hurricane86 ha scritto:  In nessun linguaggio, che io sappia, la singleton è nativa.

Ah no? Non lo sapevo... c'è una cosa però che è tipica di Flash: non puoi fare costruttori private Piange
Cioè non so se possano servire Linguaccia ma non si possono fare Piange

PS: Tano m'hai fatto morire nel post di apertura... "una SingleTon"... ah ah ah... con la T maiuscola diventa "una singola tonnellata" ah ah... Linguaccia

Ciro Continisio
Tiny Colossus

[Immagine: fxTQO] [Immagine: facebook.png] [Immagine: youtube.png] [Immagine: indiedb.png] [Immagine: greenlight.png]
24-02-2010 15:01
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
z4g0
zetaquattrogizero

Messaggi: 1,028
Registrato: Sep 2004
Offline Offline
#11 RE: Avere una sola istanza di un oggetto..
0
The Singleton is da way!

Tempo fa provai a fare un'implementazione generalizzata del singleton astraendo dalla classe, perchè dover copia/incollare/modificare ogni volta quella manciata di righe per ogni nuova classe con singleton mi sgridava dentro.., provai di tutto... interfaces, reflection etc, ma o la tiravi da una parte o dall'altra c'era sempre qualche intoppo... alla fine ci ho rinunciato: per ogni classe singleton gli scrivo quelle 2 o 3 righe "standard" 'hardcodate' per quella precisa classe.. e chi si è visto si è visto Sorriso

[Immagine: signevil.png][Immagine: signvgc.png][Immagine: signall21.png]
Fabrizio 'z4g0' Zagaglia
(Blog)
(Questo messaggio è stato modificato l'ultima volta il: 24-02-2010 15:17 da z4g0.)
24-02-2010 15:08
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
hurricane86
Posting Freak

Messaggi: 1,266
Registrato: Jun 2009
Offline Offline
#12 RE: Avere una sola istanza di un oggetto..
0
(24-02-2010 15:08)z4g0 ha scritto:  The Singleton is da way!

Tempo fa provai a fare un'implementazione generalizzata del singleton astraendo dalla classe, perchè dover copia/incollare/modificare ogni volta quella manciata di righe per ogni nuova classe con singleton mi sgridava dentro.., provai di tutto... interfaces, reflection etc, ma o la tiravi da una parte o dall'altra c'era sempre qualche intoppo... alla fine ci ho rinunciato: per ogni classe singleton gli scrivo quelle 2 o 3 righe "standard" 'hardcodate' per quella precisa classe.. e chi si è visto si è visto Sorriso

poi tranquillamente usare una classe Singleton template e la tua la estende. Anche Ogre, ad esempio, fa codesta cosa

Martino Giovanelli
24-02-2010 16:44
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
CiroContinisio
That guy

Messaggi: 6,083
Registrato: Oct 2009
Offline Offline
#13 RE: Avere una sola istanza di un oggetto..
0
(24-02-2010 16:44)hurricane86 ha scritto:  poi tranquillamente usare una classe Singleton template e la tua la estende. Anche Ogre, ad esempio, fa codesta cosa

Ma sei un fottuto genio! Ora modifico UFHO2!!

Ciro Continisio
Tiny Colossus

[Immagine: fxTQO] [Immagine: facebook.png] [Immagine: youtube.png] [Immagine: indiedb.png] [Immagine: greenlight.png]
24-02-2010 17:05
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
z4g0
zetaquattrogizero

Messaggi: 1,028
Registrato: Sep 2004
Offline Offline
#14 RE: Avere una sola istanza di un oggetto..
0
(stavo sottointendendo "in flash", niente Template Piange , l'impossibilità dell'estensione è dovuta alla tipizzazione forzata, se non nel valore di ritorno, che può essere l'Object , un'astratta o un'interfaccia generica, almeno nella chiamata al costruttore, che, tra l'altro, essendo in un metodo statico non c'è modo di risalire nemmeno al nome della classe per chiamarlo via reflection )

[Immagine: signevil.png][Immagine: signvgc.png][Immagine: signall21.png]
Fabrizio 'z4g0' Zagaglia
(Blog)
(Questo messaggio è stato modificato l'ultima volta il: 24-02-2010 17:12 da z4g0.)
24-02-2010 17:06
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Zed
3 di ♠

Messaggi: 607
Registrato: Jan 2010
Offline Offline
#15 RE: Avere una sola istanza di un oggetto..
0
(24-02-2010 12:43)Tano ha scritto:  ..e non usare una SingleTon.. Cioè mi spiego meglio. Nel gioco a cui sto lavorando ho (diverse) classi che hanno informazioni che devono essere passate a vari States di gioco. Ad esempio ho il mio "GamePlayStateManager" che si occupa di far passare da uno stato ad un altro. Di questo manager devo avere una sola istanza, di conseguenza sono due le scelte: Passo l'istanza agli states oppure lo dichiaro singleton..

Qualcuno ha qualche idea? Oppure non sono stato chiaro? Fermosu

molto interessante questo topic.

imho potresti avere nei vari manager, degli objects che inapsulano le informazioni del manager(lo status del Manager), che tu vuoi far viaggiare da una parte ad' un altra.

la classe di questi status potrebbe implementare un' interfaccia che utilizzi per far viaggiare i vari status in maniera omogenea.

quando un qualche manager destinatario si prende in pancia lo status di un altro manager mittente, a quel punto puo'fare la sua logica.

L'idea permette di evitare di usare singleton e, invece che passare i riferimenti di manager interi, passi solo una mascherina dello status...
(Questo messaggio è stato modificato l'ultima volta il: 24-02-2010 17:23 da Zed.)
24-02-2010 17:22
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: