sábado, 28 de julio de 2007

Code Snippets (II)

Trasteando con los code snippets

Como vimos en el anterior post, los code snippets ayudan a escribir código, y el Visual Studio incluye una gran cantidad de ellos, vamos a ver cómo encontrarlos.
Seleccionamos Herramientas -> Code Snippets Manager, y nos muestra la siguiente ventana:



Seleccionamos el lenguaje que estemos utilizando, y nos actualiza las categorías que trae por defecto, si os fijáis existe la categoría My Code Snippets para incluir los que creemos.

Bien, vamos a buscar el code snippet que utilizamos en el post anterior:



Si echáis un vistazo a todas las categorías y los code snippets que se incluyen podéis ver que están contempladas muchas acciones comunes, pero ¿qué pasa si no encontramos el code snippet que nos hace falta? Pues aquí tenemos 2 opciones:

- Modificar uno existente para que incluya un cambio o crear uno nuevo a partir de uno existente
- Buscar code snippets que alguien haya creado

Modificar un code snippet existente

Si nos fijamos en la imagen anterior, al seleccionar un code snippet nos muestra dónde está, en este caso el que define una propiedad se encuentra en C:\Archivos de programa\Microsoft Visual Studio 8\Vb\Snippets\1033\common code patterns\properties and procedures\DefineAProperty.snippet.

Con esta ruta podemos ver un par de cosas: que cada code snippet se guarda en un fichero .snippet y las colecciones están agrupadas en directorios, por lo que la agrupación física y la lógica coinciden.

Vamos a modificar este snippet para que el tipo de la propiedad siempre sea string. Abrimos el fichero DefineAProperty.snippet con el Visual Studio (o con el bloc de notas), y podemos observar la estructura de un code snippet sencillo:


<?xml version="1.0" encoding="UTF-8"?>
<CodeSnippets mlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Define a Property</Title>
<Author>Microsoft Corporation</Author>
<Description>Defines a Property with a backing field.</Description>
<Shortcut>Property</Shortcut>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>PropertyName</ID>
<Type>String</Type>
<ToolTip>Replace with property name.</ToolTip>
<Default>NewProperty</Default>
</Literal>
<Literal>
<ID>PropertyType</ID>
<Type>
</Type>
<ToolTip>Replace with the property type.</ToolTip>
<Default>Integer</Default>
</Literal>
<Object>
<ID>PrivateVariable</ID>
<Type>Object</Type>
<ToolTip>Replace this with the private variable name.</ToolTip>
<Default>newPropertyValue</Default>
</Object>
</Declarations>
<Code Language="VB" Kind="method decl">
<![CDATA[
Private $PrivateVariable$ As $PropertyType$
Public Property $PropertyName$() As $PropertyType$
Get
Return $PrivateVariable$
End Get
Set(ByVal value As $PropertyType$)
$PrivateVariable$ = value
End Set
End Property
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>


Vaya si es XML. ¿Qué más podemos ver?
Que hay una cabecera Header donde poner los datos del creador del code snippet, su descripción y el ShortCut o alias del code snippet.
Que hay un elemento Declarations donde se definen los literales del code snippet (los que se muestran en un cuadrado verde) y se especifica el texto que se debe mostrar cuando se pase el ratón sobre él.
Y que hay un elemento Code, que es donde se está el código que va a aparecer cuando introduzcamos un snippet. Aquí podemos ver los literales que se defienen arriba y se deben reemplazar por el nombre de la variable o el tipo de dato.

Parece fácil, así que vamos a hacer una pequeña modificación para que la propiedad siempre sea de tipo String, para ello tenemos que comentar el literal PropertyType y en el elemento Code poner en su lugar String, algo así:


<?xml version="1.0" encoding="UTF-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Define a string Property</Title>
<Author>bousan</Author>
<Description>Defines a string Property with a backing field.</Description>
<Shortcut>SProperty</Shortcut>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>PropertyName</ID>
<Type>String</Type>
<ToolTip>Replace with property name.</ToolTip>
<Default>NewProperty</Default>
</Literal>
<!--<Literal>
<ID>PropertyType</ID>
<Type>
</Type>
<ToolTip>Replace with the property type.</ToolTip>
<Default>Integer</Default>
</Literal>-->
<Object>
<ID>PrivateVariable</ID>
<Type>Object</Type>
<ToolTip>Replace this with the private variable name.</ToolTip>
<Default>newPropertyValue</Default>
</Object>
</Declarations>
<Code Language="VB" Kind="method decl">
<![CDATA[
Private $PrivateVariable$ As string
Public Property $PropertyName$() As string
Get
Return $PrivateVariable$
End Get
Set(ByVal value As string)
$PrivateVariable$ = value
End Set
End Property
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>


Como se puede ver, he cambiado el shorcut, la descripción, he comentado el literal PropertyType y lo he sustituido en el elemento Code por string.

Ahora tenemos 2 opciones: guardarlo con en el mismo fichero que estaba, lo cual no es muy recomendable porque no siempre vamos a querer crear propiedades de tipo string, o guardarlo en un fichero diferente, por ejemlplo DefineAStringProperty.snippet, que es lo que vamos a hacer.
Si volvemos al Code Snippet Manager podemos encontrar el snippet que acabamos de crear.

También podemos crear un snippet desde cero y añadirlo a una de las carpetas que ya están registradas por el Code Snippet Manager.


Buscar code snippets

Como yo sé que no soy el único programador del universo siempre que se me plantea un problema, y antes de empezar a devanarme los sesos, busco en Internet si alguien tuvo el mismo problema y ha encontrado una solución. Con los code snippets ocurre lo mismo, hay muchos en diferentes webs que han sido creados por otros programadores que posiblemente se han encontrado en la misma situación que nosotros. Sólo hay que poner "code snippet" en vuestro buscador favorito (el mío es Google, por si alguien lo quiere saber) y tener un poco de suerte.

Una vez que encontremos el snippet que nos hace falta, creamos un fichero .snippet y lo copiamos en él. Si el fichero está en uno de los directorios que están referenciados en el Code Snippet Manager, el nuevo snippet aparecerá en la lista de los existentes. Pero si lo creamos en otro directorio, por ejemplo uno de red para que puedan acceder todos los programadores de un grupo de trabajo, hay que añadir ese directorio al Code Snippet Manager, aunque lo más fácil es mantener la estructura lógica que ya nos presenta Visual Studio.

Casi se me olvida, en MSDN podéis encontrar un editor de Code Snippets en Visual Basic, para no tener que pelearos con el XML.

Y con esto finalizan los posts sobre Code Snippets, por ahora, porque prometo más.