YoProgramo.NET Blog
Anotaciones de Programador

Rediseñando el logo de AltnetHispano

Jorge, José y todos los muchachos de AltnetHispano necesitan de nuestra ayuda, buscan nuevas alternativas para el logo de la comunidad.

Quisiera dar un pequeño aporte y aquí va.

Logo 1:

Altnet

Logo 2:

Altnet

Logo 3:

Altnet

Logo 4:

Altnet 

Me gustaría escuchar *leer* sus opiniones.

December 9, 2009 18:11 by fabianfigueredo
Categorías: General

TDD Falsos Repositorios para Servicios

Ayer, Mario y Ángel me señalaron algunos errores en mi post anterior, en realidad es posible evitar tener que escribir la clase FalsoPostRepositorio.

Aquí les muestro como quedo mi test Crear_post_Test() donde utilizo Callback de moq.

        [TestMethod()]
        public void Crear_post_Test()
        {
            Dictionary<long, IPost> posts = new Dictionary<long, IPost>();
            var falso_repositorio = new Mock<IPostRepositorio>();
            falso_repositorio
                .Setup(x => x.Agregar(It.IsAny<IPost>()))
                .Callback((IPost p) => posts.Add(p.Id, p));
            
            IPostServicio servicioPost = new PostServicio(falso_repositorio.Object);
            IPost post = new Post();
            post.Id = 1;
            post.Title = "Prueba";

            servicioPost.Crear(post);

            Assert.AreEqual(posts.Count, 1);
            Assert.AreEqual(posts[1], post);
        }

y el test que prueba la actualización seria el siguiente:

        [TestMethod()]
        public void Actualizar_post()
        {
            Dictionary<long, IPost> posts = new Dictionary<long, IPost>();
            IPost post = new Post();
            post.Id = 1;
            post.Title = "Prueba";
            posts.Add(1, post);
            var falso_repositorio = new Mock<IPostRepositorio>();
                falso_repositorio
                    .Setup(x => x.Actualizar(IsAny<IPost>()))
                    .Callback<IPost>((p) => posts.ActualizarPost(p));

            IPostServicio servicioPost = new PostServicio(falso_repositorio.Object);
            post = new Post();
            post.Id = 1;
            post.Title = "Prueba actualizada";

            servicioPost.Actualizar(post);

            Assert.AreEqual(posts[1].Title, "Prueba actualizada");
        }

ActualizarPost() es un método de extensión.

December 3, 2009 08:10 by fabianfigueredo
Categorías: C# | TDD

TDD diseñando Servicios y Repositorios

obreros

Estoy en medio de una *BIG REFACTORY* del código fuente de yoprogramo.net, pero el motivo de este post no es contarles eso si no comentarles como estoy realizando mis tests para diseñar Servicios y Repositorios.

Lo primero, tenemos que tener algo en claro, para programar bien #TDD es necesario conocer algunas cosas, que ya ayer Carlos Peix explico muy bien en su WebCast. Para que nuestra capa de servicios sea optima para TDD es necesario que apliquemos el patrón Inyección de Dependencias y que utilicemos algún contenedor IoC para trabajar con ellas.

Si no tienes conocimientos de estas herramientas y patrones te invito a que veas mi video tutorial sobre contenedores IoC.

Usare como ejemplo, algo del mundo real –copiándole a José- que aplique en yoprogramo.net para diseñar mis servicios.

Diseñando el servicio IPostServicio:

Este servicio estará en la capa infraestructura de la aplicación:

namespace YoProgramo.Nucleo
{
    public interface IPostServicio {
        IList TraerTodos();
        IList TraerTodosSinSpam();
        IList TraerPostsParaHome(int? top);
        IPost TraerPorId(long id);
        IList TraerPorTag(ITag tag);
        IList TraerPorUsuario(IUser usuario);
        IList TraerFavoritosPorUsuario(IUser usuario);
        IList TraerTodosLosPostsSinRespuestas();
        IList GetByCategory(ICategoria categoria);
        IPost TraerPorSlug(string slug);
        void Crear(IPost obj);
        void Actualizar(IPost obj);
        void Borrar(IPost obj);
    }
}

Luego de crear la interface, empecé con el diseño y creación de los tests. El primero que les mostraré es uno para probar el método TraerTodos(). Es necesario utilizar alguna librería de mock *yo utilizo moq* para poder mockear el repositorio que utiliza el servicio.

Se dice que estos tests son de diseño, porque en realidad la clase PostServicio no existe y luego de crear el test iremos refactorizando hasta lograr tener terminada la clase con todos sus métodos funcionando.

namespace YoProgramo.Infraestructura.Tests
{
    [TestClass()]
    public class PostServicioTest
    {
        public IList HacerListaDePosts()
        {
            var lista = new List();
            IPost post = new Post();
            lista.Add(post);
            post = new Post();
            lista.Add(post);
            return lista;
        }

        [TestMethod()]
        public void Traer_todos_y_comprobar_que_no_sea_nulo_y_que_sean_2()
        {
            var falso_repositorio = new Mock();
            falso_repositorio
                .Setup(x => x.TraerTodos()).Returns(HacerListaDePosts());
            IPostServicio servicioPost = new PostServicio(falso_repositorio.Object);

            var list_de_posts = servicioPost.TraerTodos();

            Assert.IsNotNull(list_de_posts);
            Assert.AreEqual(list_de_posts.Count(), 2);            
        }
    }
}

Primero creamos un mock – un mock es un objeto proxy – para así luego modificar su comportamiento, en este caso indicamos que al llamar al método TraerTodos() retorne una lista de objetos Post. Luego este objeto mock lo utilizamos para enviarlo al servicio a través de su constructor.

Refactoring, refactoring…

Al terminar el test el mismo falla y aquí es donde comienza el trabajo verdadero en TDD, hay que refactorizar para lograr superar nuestras pruebas.

Mi clase PostServicio luego del refactoreo:

namespace YoProgramo.Infraestructura.Servicios
{
    public class PostServicio : IPostServicio
    {
        protected IPostRepositorio _postRepositorio;

        public PostServicio(IPostRepositorio postRepositorio)
        {
            _postRepositorio = postRepositorio;
        }

        #region IPostServicio Members

        public IList TraerTodos()
        {
            return this._postRepositorio.TraerTodos();
        }

        public IList TraerTodosSinSpam()
        {
            throw new NotImplementedException();
        }

        public IList TraerPostsParaHome(int? top)
        {
            throw new NotImplementedException();
        }

        public IList TraerPorTag(ITag tag)
        {
            throw new NotImplementedException();
        }

        public IList TraerPorUsuario(IUser user)
        {
            throw new NotImplementedException();
        }

        public IList TraerFavoritosPorUsuario(IUser user)
        {
            throw new NotImplementedException();
        }

        public IList TraerTodosLosPostsSinRespuestas()
        {
            throw new NotImplementedException();
        }

        public IList GetByCategory(ICategoria categoria)
        {
            throw new NotImplementedException();
        }

        public IPost TraerPorSlug(string slug)
        {
            throw new NotImplementedException();
        }

        public void Crear(IPost obj)
        {
            _postRepositorio.Agregar(obj);            
        }

        public void Actualizar(IPost obj)
        {
            _postRepositorio.Actualizar(obj);            
        }

        public void Borrar(IPost obj)
        {
            _postRepositorio.Borrar(obj);  
        }

        public IPost TraerPorId(long id)
        {
            return _postRepositorio.Get(id);
        }

        #endregion
    }
}

Solo implemente los métodos que utilizo para estas pruebas especificas, los demás serán para otros tests.

Falsos repositorios:

No siempre podemos mockear, en ocasiones tendremos que diseñar falsos objetos a pata, lo feo de esto es que este código es solo para las pruebas, no se usa en otra parte. Puede hacernos perder tiempo pero es necesario para que nuestras pruebas sean óptimas. Ahora veamos este test…

        [TestMethod()]
        public void Actualizar_post()
        {
            var falso_repositorio = new FalsoPostRepositorio();
            IPostServicio servicioPost = new PostServicio(falso_repositorio);
            IPost post = new Post();
            post.Id = 1;
            post.Title = "Prueba";

            servicioPost.Crear(post);
            IPost postParaActualizar = servicioPost.TraerPorId(1);
            postParaActualizar.Title = "Prueba actualizada";
            servicioPost.Actualizar(postParaActualizar);

            IPost postEsperado = servicioPost.TraerPorId(1);

            Assert.IsNotNull(postEsperado);
            Assert.AreEqual(postEsperado.Title, "Prueba actualizada");
        }

Como ven, aquí no utilizo mock dado que para actualizar objetos necesitamos algo de interacción con el repositorio, de hecho estamos realizando dos pasos, uno para crear un objeto y otro para modificarlo.

Mi Falso Repositorio:

namespace YoProgramo.Infraestructura.Tests.FalsosRepositorios
{
    public class FalsoPostRepositorio : IPostRepositorio
    {
        private Dictionary<long, IPost> posts;

        public FalsoPostRepositorio()
        {
            posts = new Dictionary<long, IPost>;
        }


        #region IRepositorio Members

        public IPost Get(long id)
        {
            return posts[id];
        }

        public IList TraerTodos()
        {
            throw new NotImplementedException();
        }

        public void Borrar(IPost entidad)
        {
            posts.Remove(entidad.Id);
        }

        public void Agregar(IPost entidad)
        {
            posts.Add(entidad.Id ,entidad);
        }

        public void Actualizar(IPost entidad)
        {
            posts[entidad.Id] = entidad;
        }

        public IList FindAll()
        {
            throw new NotImplementedException();
        }

        public IList FindAll(System.Linq.Expressions.Expression> expression)
        {
            throw new NotImplementedException();
        }

        public IQueryable Find()
        {
            throw new NotImplementedException();
        }

        public IQueryable Find(long id)
        {
            throw new NotImplementedException();
        }

        public IQueryable Find(System.Linq.Expressions.Expression> expression)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

Y esto es todo por hoy, nada más que decir sobre el tema. Con el webcast de ayer me entusiasme mas con esto y ahora ya es tarde para escaparme jeje.

December 2, 2009 08:45 by fabianfigueredo
Categorías: C# | TDD

Grupo en Facebook para YoProgramo.NET

Grupo YoProgramo.NET

Unos días atrás he creado un grupo en Facebook para este sitio con la finalidad de compartir temas relacionados a programación y en especial sobre esta comunidad.

Te esperamos, gracias!

November 27, 2009 05:27 by fabianfigueredo
Categorías: YoProgramo

Wrapper vs Abstracción

Wrapper vs Abstracción 

Hoy por la mañana decía lo siguiente por twitter..

“Tratando de entender qué diferencia hay entre un Wrapper y una Abstracción.”

Esto de los conceptos muchas veces a nosotros los programadores nos cuesta entenderlos y esto hace que cometamos errores.

Wrapper:

Yo siempre lo asocio con un cascarón, envase o capsula de un elemento y sus propiedades. Solemos utilizarlos para simplificar y para aislamiento de componentes.

Por ejemplo, si quiero hacer un Wrappper/Api de un cliente IRC yo haría algo así:

ClienteIrc.Server<ircx>(s => “irc.miserverirc.com”).Port(6600).Conectar;

Abstracción:

Si leemos el concepto de Abstracción es muy similar -a mi modo de ver-, estamos aislando y ocultando cosas. Suelo escribir código de abstracción para simplificar Apis.

Y el ejemplo para abstracción del cliente IRC seria:

ClienteIrc.Conectar(“irc.miserverirc.com”);

¿Que opinan los programadores?

RickyAH definió los dos conceptos muy bien:

Abstracción es una visión global de algo, normalmente para simplificar” Twitt

Wrapper es encapsular, y tiene que ver mas con la ocultación de datos” Twitt

Wrapper rs también otro nombre del patrón diseño façade que busca justamente encapsular datos con un nuevo interface” Twitt

Foto: flickr.com

November 17, 2009 08:13 by fabianfigueredo
Categorías:

Eres Arquitecto si cumples estos ítems

Eres Arquitecto si cumples estos ítems

  • Llevas desarrollando software por varios años, mínimo 5 o 6.
  • Conocimientos sólidos de 2 lenguajes OOP y otros 2 de yapa :P
  • Sabes quién es Martin Fowler y leíste alguno de sus libros.
  • Sabes quién es Eric Evans y leíste su libro sobre DDD.
  • Dominas TDD.
  • Haber desarrollado en dos o más plataformas.
  • Tienes sólidos conocimientos de al menos 2 motores de bases de datos.
  • Tienes sólidos conocimientos de normalización de bases de datos.
  • Tienes buen manejo de frameworks para persistencia de datos.
  • Posees alguna certificación para avalar tus conocimientos, ya sea de grado/tecnicatura o certificaciones especializadas como por ejemplo las de Microsoft.
  • Tienes buenos conocimientos de UML.
  • Tienes conocimientos de herramientas de generación de código.
  • Utilización de patrones, los más utilizados para el diseño de aplicaciones.
  • Buena comunicación.
  • Sólidos conocimientos de dos o más modelos de arquitectura, como por ejemplo modelo de 3 capas y DDD.
  • Buen razonamiento y capacidad de abstracción para los problemas planteados.
  • Conocimientos de Gestión de Proyectos.
  • Haber participado en desarrollos de sistemas importantes ya sea como PM o Líder de grupo.
  • Saber diseñar casos de uso.
  • Buena redacción.
  • Conocimientos de MS Projects o similar.

Y por ultimo y quizás el ítem más importante, que tu jefe te reconozca como “Arquitecto” ;)

Mas sobre este tema: Lo que pienso de: Arquitectos de Software

Foto: flickr.com

November 16, 2009 07:04 by fabianfigueredo
Categorías: Arquitectura | General

Como hacer interfaces fluidas en C#

Todo framework importante o conocido las usa, son las interfaces que exponen métodos que fluyen logrando que nuestro trabajo pueda ser un poco más sencillo.

Una interface fluida (Fluent Api) es una interface o conjunto de ellas que exponen métodos que concatenados forman frases o simplemente verbos, de esta manera se obtiene un código fácil de leer y comprender por los programadores.

Como hacer interfaces fluentes en C#

Ejemplo de Interface fluida:

Como dije, necesitaremos crear una interface con los métodos que necesitamos, como se ve aquí:

    public interface IFooFluent : IOcultarMiembros
    {
        IFooFluent Palabra(string palabra);
        IFooFluent Recortar(int length);
        IFooFluent PasarMayusculas();
        IFooFluent PasarMinusculas();
        string DameString();
    }

Vemos que la interface IFooFluent hereda IOcultarMiembros que es la encargada de ocultar los métodos que expone System.Object (GetType, GetHasCode, ToStgring, Equals)

    [EditorBrowsable(EditorBrowsableState.Never)]
    public interface IOcultarMiembros
    {
        [EditorBrowsable(EditorBrowsableState.Never)]
        Type GetType();

        [EditorBrowsable(EditorBrowsableState.Never)]
        int GetHashCode();

        [EditorBrowsable(EditorBrowsableState.Never)]
        string ToString();

        [EditorBrowsable(EditorBrowsableState.Never)]
        bool Equals(object obj);
    }

Y las clases Foo y Fluente:

    public class Foo : IFooFluent
    {
        private string _palabra;

        public IFooFluent Palabra(string palabra)
        {
            _palabra = palabra;
            return this;
        }


        public IFooFluent Recortar(int length)
        {
            _palabra = _palabra.Substring(0, length);
            return this;
        }

        public IFooFluent PasarMayusculas()
        {
            _palabra = _palabra.ToUpper();
            return this;
        }

        public IFooFluent PasarMinusculas()
        {
            _palabra = _palabra.ToLower();
            return this;
        }

        public string DameString()
        {
            return _palabra;
        }
    }

    public class Fluente : IOcultarMiembros
    {
        public static IFooFluent Hacer()
        {
           return new Foo();
        }
    }

El resultado:

Fluente

Puntos a tener en cuenta al crear una interface fluent:

  • La propiedad EditorBrowsable no funciona si la interface se encuentra en el mismo assembly. Deberán hacer dos proyectos, uno para las librerías donde estará la interface fluente y en el otro hacer referencia a este por medio de la DLL, (No hacer referencia por proyecto).
  • Si utilizas Resharper es posible que no funcione EditorBrowsable.

Más sobre interfaces fluidas:

November 13, 2009 09:35 by fabianfigueredo
Categorías: C#

Struct vs Clases – ¿Cuales son las diferencias?

Si observamos la sintaxis, struct y clases en C# son casi idénticas. ¿Pero cual es la diferencia entre estos?

Struct:

  • Es un Value Type
  • Se almacena en Stack Memory.
  • Es un tipo compuesto o conjunto de una serie de otros tipos.
  • No pueden tener constructores explícitos sin parámetros.
  • No pueden tener destructores.
  • No pueden implementar herencias.
  • Mas rápidas y no necesitan del Garbage Collector.
  • Dentro del framework .NET hay muchos Struct como por ejemplo System.Int32, System.Single, etc.
  • Cuando es pasado por parámetro de método, es pasado “por valor”

Clase:

  • Es Reference Type.
  • Se almacena en “heap”.
  • Soporta herencias.
  • Para instanciar es necesario usar el operador “new”.
  • Cuando es pasado por parámetro de método, es pasado “por referencia”.
November 8, 2009 08:56 by fabianfigueredo
Categorías: C#

Arquitectura de software y generación de código

En estos días he podido disponer de algo de tiempo dado que terminé muchos de los trabajos que tenia apilados de meses, aprovechando este tiempo extra es que decidí escuchar algunos podcasts y ver webcasts, algunos me parecieron muy interesantes y otros no tanto.

Llamaron mi atención dos podcasts, uno sobre arquitectura de software y otro –que en realidad es webcast- sobre generación de código.

  • Conferencia: Arquitectura de Aplicaciones .NET
    Este podcast es en realidad una grabación de una conferencia de Carlos Walzer realizada en la universidad UTN.
    Me gusto mucho la claridad para la exposición por parte de Carlos, sin vueltas y al grano. De comienzo a fin ,todo sobre arquitectura de software, capas, buenas practicas, componentes, servicios, etc.
    Para escuchar la charla deberás descargar los archivos de audio y también están disponibles los materiales que Carlos utilizo en la exposición.
  • Generación de Código (AjGenesis)
    El webcast es una VAN de ALT.NET Hispano impartida por AjLopez, la misma trata sobre generación de código. La exposición tiene muchos puntos enriquecedores y valiosos. Sin duda escuchar un poco de la historia como programador de AjLopez ayuda a tener una mejor óptica de donde estamos parados hoy y gracias a que es que disponemos de las herramientas actuales para el desarrollo de software.
    Los ejemplos de generación de código con AjGenesis también fueron interesantes, pero la parte donde Angel generó una aplicación entera -que utilizaba NHIbernate- fue lo que mas me shockeó o–O . Generó todo, las entidades, mapas, las DAOs, etc.
November 7, 2009 05:52 by fabianfigueredo
Categorías: NHIbernate | Arquitectura

Herramientas open source que utilizo para programar

  • NHIbernate
    NHIbernate
    Un port para .NET del popular framework ORM Hibernate de JAVA. Con NHIbernate podremos mapear fácilmente nuestros objetos. NHibernate ayuda muchísimo aliviar el eterno dolor de cabeza para desarrolladores -las bases de datos relacionales –. ¿O no? ;)
  • ASP.NET MVC
    ASP.NET MVC 
    Una herramienta totalmente gratis de Microsoft que brinda facilidades a programadores para construir sitios robustos que implementan el patrón MVC.
  • S#arp Architecture
    S#arp Architecture
    Una herramienta template que nos ayudara a crear aplicaciones robustas, utilizando el poder de ASP.NET MVC, NHIbernate y contenedores IoC – entre otras cosas.
  • Windsor IoC
    ioc
    Un poderoso framework IoC para .NET.
  • NUnit
    nunit
    Un port de JUnit para .NET, con NUnit hago mis pruebas unitarias.
  • Moq
    moq
    Librería de mocking para .NET que utiliza todas las características del Framework 3.5.
  • JQuery
    jquery 
    Quizás la librería de javascript mas conocida en el mundo. Pequeña, rápida y eficiente.
  • TortoiseSVN
    svn 
    El mejor cliente de Subversion para Windows.
  • AgroUML
    AgroUML
    Una gran herramienta para modelado de objetos UML.
  • Codeblocks
    Codeblocks
    Para mi, el mejor IDE de C++.
  • PSPAD
    pspad 
    Utilizo PSPAD pada editar archivos planos de texto, ejemplo CSS, HTML, XML etc.
November 5, 2009 09:04 by fabianfigueredo
Categorías: General