posts - 463, comments - 1515, trackbacks - 139

Singleton snippet per C#

Non che io sia un fan scatenato degli snippet, però per certe cose sono proprio comode.

All'ennesima classe singleton che dovevo costruire mi sono fermato, ho scritto uno snippet ed eccolo qui:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="
http://atd.vevy.com/CodeSnippet">
 <CodeSnippet Format="1.0.0">
  <Header>
   <Title>singleton</Title>
   <Shortcut>singleton</Shortcut>
   <Description>Code snippet for singleton pattern</Description>
   <Author>Raffaele Rialdi</Author>
   <SnippetTypes>
    <SnippetType>Expansion</SnippetType>
   </SnippetTypes>
  </Header>
  <Snippet>
   <Declarations>
    <Literal Editable="false">
     <ID>classname</ID>
     <ToolTip>Class name</ToolTip>
     <Function>ClassName()</Function>
     <Default>ClassNamePlaceholder</Default>
    </Literal>
   </Declarations>
   <Code Language="csharp">
    <![CDATA[private static $classname$ _Instance = null;
  private $classname$ ()
  {
  }
  public static $classname$ GetInstance()
  {
   if(_Instance == null)
    _Instance = new $classname$();
   return _Instance;
  }

$end$
]]>
   </Code>
  </Snippet>
 </CodeSnippet>
</CodeSnippets>

Per farlo funzionare è sufficiente salvarlo in un file chiamato singleton.snippet e metterlo nella cartella:
My Documents\Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets

Non rimane quindi che provarlo ed all'interno di una classe C# scrivere singleton<tab> per ottenere l'espansione del codice.

Sicuramente sarebbe stato più adatto il wiki in modo che tutti possano rifinire, aggiungere, limare e modificare lo snippet. Me ne scuso ma il tempo mi sta addosso e ho fatto prima qui.

Print | posted on venerdì 20 gennaio 2006 10.18 |

Feedback

Gravatar

# re: Singleton snippet per C#

I Singleton non esistono. Soffrivo tempo fa di un'acuta forma di Singletonitis, scrivevo Singleton in continuazione. Mi sono iscritto all'Associazione Singletonitis Anonimi (A.S.A.) ed ora finalmente sono guarito. Non uso piu' Singleton, il mio codice mi ha ringraziato, i test pure, i miei colleghi anche. Ed ora sono un programmatore felice :)

Se non volete far piangere Gesu' Bambino non usate i Singleton.
20/01/2006 11.00 | Francesco Carucci
Gravatar

# re: Singleton snippet per C#

Grazie Raf per la citazione del Wiki di ugidotnet (se c'è qualcuno che ancora non lo conosce... ma c'è davvero? :D è qui http://wiki.ugidotnet.org/) !

X ki è interessato al tema Pattern, Singleton (Francesco vedo che ne hai da dire sul tema, non mancare!), etc. e magari vuole scoprire come migliorare l'implementazione del singleton in .NET etc... tenete d'occhio la prox uscita della RRRRubriki (http://blogs.ugidotnet.org/rubriki/ , rss feed http://blogs.ugidotnet.org/rubriki/category/1594.aspx/rss).
20/01/2006 11.38 | Luca Minudel
Gravatar

# re: Singleton snippet per C#

Ciao Francesco, non sono uno che abusa di singleton ma ci sono casi in cui oggettivamente la presenza di più istanze è incoerente con il modello e dannosa.

In particolare il progetto su cui stavo lavorando è di automazione industriale dove leggo dei dati da un PLC.
Da malato di oop ho creato tanti oggetti quanti sono le componenti del sistema e da un thread separato un oggetto aggiorna costantemente le proprietà degli oggetti sulla base dei bit di uscita del PLC.
Ora:
- può esistere più di un oggetto che legge le out del PLC? No
- può esistere più di un serbatoio nel sistema? No
- etc. etc.
Quindi non vedo soluzione migliore del singleton per evitare dannose new su fantomatici oggetti che ucciderebbero il modello.

Vuoi un altro esempio meno industriale?
L'oggetto che fa da server di remoting in una applicaizone n-tier. Prima o poi ci deve essere un singleton che conosce tutti i client. Altrimenti le notifiche per i client che qualcosa è cambiato chi le fa? Non vorremo mia tornare al client server dove tutti fanno query al db? Grazie al cielo quell'epoca è morta e defunta.

A presto ;-)
20/01/2006 13.25 | Raffaele Rialdi
Gravatar

# re: Singleton snippet per C#

Ciao Raffaele, come scritto in un articolo segnalato da Simone Busoli
http://www.yoda.arachsys.com/csharp/singleton.html
quell'implementazione del pattern singleton sembra non essere corretta perché non è thread-safe (e lo dice uno che l'ha usata tantissimo)
Tu cosa ne dici?

A presto
20/01/2006 13.59 | Marco De Sanctis
Gravatar

# re: Singleton snippet per C#

Sono daccordo e come ho precisato nel mio post sarebbe stato più giusto metterlo nel wiki perchè tutti potessero creare le numerose varianti possibili.
Il mio target infatti non è certo quello di creare l'implementazione di singleton per antonomasia anche perchè non credo che ce ne possa essere una "universale".

Nel mio caso specifico il progetto è si multithreading ma non durante la fase di prima istanziazione per cui a me il problema non toccava.
C'è chi preferisce pre-istanziare nel costruttore statico, c'è chi preferisce fare un bel lock con il doppio if come anche Ricciolo suggeriva.

Insomma, leggeere attentamente le avvertenze, usare con cautela e non somministrare ai programmatori al di sotto dei 12 anni :-)
20/01/2006 14.09 | Raffaele Rialdi
Gravatar

# re: Singleton snippet per C#

>Quindi non vedo soluzione migliore del singleton per evitare >dannose new su fantomatici oggetti che ucciderebbero il modello.

Ciao. Io vedo una soluzione magliore in un Factory Method pattern e rendendo il costruttore privato. L'oggetto che gestisce l'istanza della tua classe ne prende possesso e lo passa a chi interessato e solo chi effettivamente lo usa ha questa visibilita'.

Il Male del Singleton risiede nel fatto che altro non e' che una maschera per nascondere dei dati globali e farli passare per buoni, il problema sta proprio in quel metodo statico GetInstance(): questo vuol dire che chiunque nel sistema e' in grado di prendere l'istanza di quella classe e "fare danni". Con il modello che ti ho proposto, al contrario, l'unico possessore dell'istanza ne garantisce l'uso passandolo esplicitamente e chiunque ne volesse creare una seconda copia sarebbe bloccato dal Factory Method.

Fatevi un favore, non usate i Singleton, c'e' (quasi) sempre una soluzione migliore.
20/01/2006 14.41 | Francesco Carucci
Gravatar

# re: Singleton snippet per C#

Se l'implementazione che ho postato semplicemente contenesse una throw invece del return _Instance, ti avrei fatto contento ;-) Ma permettimi di dissentire che questa sia sempre la soluzione migliore.
Che questo snippet si possa implementare in mille modi differenti è stata proprio la mia iniziale precisazione.
20/01/2006 16.57 | Raffaele Rialdi
Gravatar

# C# Singleton Code Snippet

20/01/2006 17.53 | STEFANO DEMILIANI WeBlog
Gravatar

# re: Singleton snippet per C#

Ecco l'eccezione sarebbe stata perfetta :D

Ne parliamo nel wiki? Il discorso e' interessantissimo e avendo sofferto di una forma acuta di questa malattina mi tocca molto da vicino :(
20/01/2006 21.20 | Francesco Carucci

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 6 and 6 and type the answer here:

Powered by: