Parliamo un po’ di produttività… ma non tanto in termini di linee di codice scritte in una unità di tempo quanto piuttosto di come e quanto cali la nostra, la mia sicuramente, resa a causa della noia che scrivere codice sempre uguale produce…

Se usate Wpf (o in generale sviluppo di applicazione rich client) questo è un esempio di noia mortale:

private String _myValue = null;
public String MyValue
{
    get { return this._myValue; }
    set
    {
        if( value != this.MyValue )
        {
            this._myValue = value;
            this.OnPropertyChanged( () => this.MyValue );
        }
    }
}

il supporto per INotifyPropertyChanged è veramente tedioso da scrivere e ad esempio in un’applicazione Wpf basata su M-V-VM lo scrivere decinaia e decinaia di volte :-)

Code Snippets

Perchè quindi non farsi un Code Snippet? che scritta una cosa del genere:

image

esploda in questo?:

image

permettendoci di ridurre all’osso quello che dobbiamo scrivere.

How to…

Un Code Snippet è semplicemente un file xml con estensione “.snippet” che opportunamente piazzato viene egregiamente digerito da Visual Studio e dall’intellisense:

image

Il Code Snippet che produce quella proprietà è questo:

<?xml version="1.0" encoding="UTF-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Creates a Property with PropertyChanged Support using lambda expressions.</Title>
      <Author>topics.it</Author>
      <Description></Description>
      <Shortcut>ppcl</Shortcut>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>PropertyName</ID>
          <Default>PropertyName</Default>
        </Literal>
        <Literal Editable="true">
          <ID>PropertyField</ID>
          <Default>propertyField</Default>
        </Literal>
        <Literal Editable="true">
          <ID>PropertySystemType</ID>
          <Default>System.Object</Default>
        </Literal>
        <Literal Editable="true">
          <ID>PropertyDefaultValue</ID>
          <Default>null</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[private $PropertySystemType$ _$PropertyField$ = $PropertyDefaultValue$;
public $PropertySystemType$ $PropertyName$
{
    get { return this._$PropertyField$; }
    set 
    {
        if( value != this.$PropertyName$ )
        {
            this._$PropertyField$ = value;
            this.OnPropertyChanged( () => this.$PropertyName$ );
        }
    }
}$end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Le 2 cose degne di nota sono la sezione “Declarations”:

<Declarations>
  <Literal Editable="true">
    <ID>PropertyName</ID>
    <Default>PropertyName</Default>
  </Literal>
</Declarations>

che serve per aggiungere elementi editabili durante la fase di editing, appunto :-), dello snippet, usando il tabulatore sarà possibile “navigare” tra i vari elementi all’interno dell’editor, e la sezione “Code”:

<Code Language="csharp">
  <![CDATA[private $PropertySystemType$ _$PropertyField$ = $PropertyDefaultValue$;
public $PropertySystemType$ $PropertyName$
{
    get { return this._$PropertyField$; }
    set 
    {
        if( value != this.$PropertyName$ )
        {
            this._$PropertyField$ = value;
            this.OnPropertyChanged( () => this.$PropertyName$ );
        }
    }
}$end$]]>
</Code>

In cui inserire il blocco di codice che vogliamo snippettare :-)

Ci sono svariati tool per la gestione degli snippet ma secondo me l’unico che merita, oltre naturalmente ad un decente editor per file xml (ad esempio Visual Studio :-) ) è questo add-in del “compare” Alessandro… che è un bravo ragazzo nonstante il set di che ha sul blog sembri dire tutto il contrario :-P

Happy snippetting… ok, ok, scusate :-)

.m