Tuesday, August 29, 2006

Escondiendo la complejidad de los tipos genericos segunda parte

En articulos anteriores hable sobre tipos genericos complejos

tipos genericos multidimensionales en C#

y como hacer esos tipos genericos mas legibles usando genericos con alias

Escondiendo la complejidad de los tipos genericos

using System.Collections.Generic;
using FilesList = List<string>;
using FoldersWithFiles = Dictionary<string, List<string>>;
using ComputersWithFiles = Dictionary<string, Dictionary<string, List<string>>>;

Aqui les presento otra tecnica para lograr codigo legible mientras que usamos tipos genericos complejos.


Podemos crear subclases de tipos genericos de la siguiente manera:

class FilesList2 : List<string> { }
class FoldersWithFiles2 : Dictionary<string, List<string>> { };
class ComputerFiles2 : Dictionary<string, Dictionary<string, List<string>>> { }
class ComputersWithFiles2 : Dictionary<string, Dictionary<string, List<string>>> { }

El codigo para usarlos es practicamente el mismo que cuando usamos genericos "aliasados", pero hay un pequeño "problema", KeyValuePair es un struct, y como tal no soporta herencia, entonces no podemos usar esta tecnica con este tipo, lo que podemos hacer es combinar tipos aliasados para el tipo KeyValuePair y subclases para el resto.


Esto nos lleva a otra cosa, cuando tenemos codigo como este:

Console.WriteLine("Lista de directorios con archivos");
FoldersWithFiles2 foldersWithFiles = GetFoldersWithFiles();
foreach (FoldersWithFilesPair kv in foldersWithFiles) {
Console.WriteLine(string.Format(" Folder: [{0}]", kv.Key));
ListFiles((FilesList2)kv.Value); //***type casting required here!!
}

Si queremos usar FoldersWithFilesPair.Value como un tipo FilesList2 tenemos que hacerle una conversion de tipo, esto es porque FilesList2 es un tipo nuevo y FoldersWithFilesPair.Value es List<string>; recuerda que C# es un lenguaje type-safe (como se dice en español!!!??)


Crear sub clases de tipos genericos de esta manera nos puede dar mas beneficios ademas del codigo legible, como cualquier otra clase puede implementar sus propios metodos y podrias asignarle tareas (o metodos) que reflejen mas correctamente su responsabilidad.


Hay una gran diferencia entre usar tipos aliasados y subclases de genericos, los tipos aliasados son exactamente el mismo tipo, solo con un nombre diferente, las subclases de genericos tienen un nombre diferente y son en si un tipo nuevo.


Eso es todo por ahora, ahi te dejo esta herramienta para tu arsenal, como todo lo demas en esta vida, no hay que abusar de esta tecnica!


Espero ver algun codigo que implemente estas tecnicas


Como les habia prometido, aqui esta el codigo fuente, el codigo es gratis tal cual como en la licencia LGPL


salu2

No comments: