mercoledì 20 luglio 2011

Snippet for Dummies...

Benchè assomigli molto ad un How To in realtà tratterei questo argomento in modo isolato tornando un così alle origni.

Uno snippet non è altro che un brano di codice che ci torna comodo quando dobbiamo implementare qualcosa in modo ossessivo, posto un esempio per tutti.. se abbiamo
30 entità da realizzare vale pur sempre il copia incolla, vale pur sempre un comodo
ORM che fa tutto per noi. Ma vale anche la pena di scrivere un "sorgente" chiaro
leggibile e che sia fatto da noi.

Ora se in questo ci può tornare comodo un aiutino, allora armiamoci di fantasia e
realizziamoci una serie di snippet nostri che ci diano il beneficio di lavorare
al meglio.

Ciò detto ... cominciamo.

A)Per prima cosa aprite visual studio io sto lavorando con il 2010.
B)Sceliete nuovo file XML ( non nuova solozione o affini .. nouovo file )

Il linguaggio per creare uno snippet è XML puro o quasi con qualche cData,
ma nulla di più, la cosa importante sono i tag.

Iniziamo con una cosa semplice semplice la scrittura di una classe
con almeno qualche commento in più, le region, e almeno il costruttore.

Volendo potrà essere un esercizio in più crearsi pure il distruttore...

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>FA_class</Title>
<Shortcut>FA_class</Shortcut>
<Description>Code snippet for class designed by Fabio Arosio</Description>
<Author>Fabio Arosio @ CSharpLight.blogspot.com</Author>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>name</ID>
<ToolTip>Class name</ToolTip>
<Default>FA_Class</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
/// <summary>
/// Author: Fabio Arosio
/// Type: class
/// Scope: [write here scope of class]
/// Project: [write here project Name]
/// Data: [insert here data of class creation]
/// </summary>
public class $name$
{
#region Events & Delegate
//
// insert here public events
// es public event EventHandler MyEvent;
#endregion

#region Private Fields
//
// insert here private fields
// es. private int _id;
#endregion

#region Public Properties
//
// insert here public properties
// es. public int id {get {return _id;} set {_id = value;}}
#endregion

#region Builders
///<summary>
/// default builder
///</summary>
public $name$()
{
}
#endregion

#region Private Methods
//
// insert here private fields
// es. private void DoMore();
#endregion

#region Public Methods
//
// insert here public Method
// es. public int DoMoreWrapper();
#endregion

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


Giusto per comprendere qualche cosa in più

Header / Title ( è il testo che apparirà nel codice )
Header / Shortcut ( è come richiamarlo ) secondo me sono la stessa ruffa..
Header / Description ... la descrizione
Header / Author ( ma dai ??)

Questi dati appariranno anche nell'import.

Snippet / Declarations è il nodo dedicato alle variabili che userete
Snippet / Declarations / literal sono le variabili

Snippet / Code ( sarà mai il codice ?? )


Quando salverete ricordatevi di salvare il file selezionando *.* come tipo
e indicando come estensione .snippet.

Solitamente li salvo in Documents\Visual Studio 2010\Code Snippets\Visual C#
Almeno poi mi ricordo dove li ho messi, nulla ci vieta di creare un repository condiviso con altri...

A questo punto se l'XMl che avete "scritto" o copiato è giusto, possiamo procedere con l'import.

C) Sempre da visual studio menu Tools\Code Sinpett Manager "verificate di aver scelto dal combo con HTML" il linguaggio Visual C#" se no non troverete le cartelle giuste.

D) Tramite il pulsante import selezioniamo il nostro file dalla cartella

Fatto.

Ora create una consoleApplication e divertitevi ..

E se proprio volete fare qualche prova in più ... vi lascio anche questo esempio che male male non è.

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>FA_entity</Title>
<Shortcut>FA_entity</Shortcut>
<Description>Code snippet for class designed by Fabio Arosio</Description>
<Author>Fabio Arosio @ CSharpLight.blogspot.com</Author>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>name</ID>
<ToolTip>Class name</ToolTip>
<Default>FA_Entity</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
/// <summary>
/// Author: Fabio Arosio
/// Type: class
/// Scope: [write here scope of class]
/// Project: [write here project Name]
/// Data: [insert here data of class creation]
/// </summary>
public class $name$
{
#region Events & Delegate
//
// insert here public events
// es public event EventHandler MyEvent;
#endregion

#region Private Fields
/// <summary>
/// Internal value of ID
/// </summary>
private int _id;
/// <summary>
/// Internal value of Name
/// </summary>
private string _Name;
/// <summary>
/// Internal value of Description
/// </summary>
private string _Description;
#endregion

#region Public Properties
/// <summary>
/// Get or Set Id of $name$
/// </summary>
public int id
{
get { return _id; }
set { _id = value; }
}
/// <summary>
/// Get or Set Name of $name$
/// </summary>
public string Name
{
get { return _Name; }
set { _Name = value; }
}

/// <summary>
/// Get or Set Description of $name$
/// </summary>
public string Description
{
get { return _Description; }
set { _Description = value; }
}
#endregion

#region Builders
///<summary>
/// default builder
///</summary>
public $name$()
{
}
#endregion

#region Private Methods
/// <summary>
/// Linearize Class
/// </summary>
/// <returns>Return a string</returns>
private string Trace()
{
return "$name$:" + this.id.ToString() + "|" + this.Name + "|" + this.Description;
}
#endregion

#region Public Methods
/// <summary>
/// Ovveride of ToString()
/// </summary>
/// <returns>Class in inline text</returns>
public override string ToString()
{
return Trace();
}
#endregion

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



Unica nota " non rimuovete l'intestazione del XML.. se non va..."

Nessun commento: