<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7619098827979691186</id><updated>2011-12-26T06:19:37.679-08:00</updated><category term='linux'/><category term='Cohesión'/><category term='tools'/><category term='mug'/><category term='debugging'/><category term='silverlight'/><category term='ORM'/><category term='languages'/><category term='Acoplamiento'/><category term='Cohesion'/><category term='OOD'/><category term='NHibernate'/><category term='tdd'/><title type='text'>Grupo Arquitectura MUG</title><subtitle type='html'>Blog de la comunidad de Arquitectura del Microsoft User Group Argentina.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Martin Salias</name><uri>http://www.blogger.com/profile/00604319815514553479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.salias.com.ar/images/ms10.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-7565077606874351665</id><published>2008-09-19T10:01:00.000-07:00</published><updated>2008-09-19T10:16:35.634-07:00</updated><title type='text'></title><content type='html'>Pablo Allois nos envía desde Rosario estas sugerencias de seguridad de IIS y SQL Server&lt;br /&gt;&lt;br /&gt;Servidor:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Deshabilita toda la funcionalidad que no vayas a utilizar&lt;/li&gt;&lt;li&gt;Desinstala los componentes que no vayas a utilizar&lt;/li&gt;&lt;li&gt;Cerra todos los puertos que puedas en el firewall&lt;/li&gt;&lt;li&gt;Si tenes que exponer funcionalidad afuera, si es posible hacelo vía vpn&lt;/li&gt;&lt;li&gt;Parchealo&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;SQL Server:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No publicarlo a internet&lt;/li&gt;&lt;li&gt;Que el servicio corra con un usuario con minimos privilegios&lt;/li&gt;&lt;li&gt;Deshabilita toda la funcionalidad que no vayas a utilizar&lt;/li&gt;&lt;li&gt;Utiliza siempre que puedas seguridad integrada y, si es posible, deshabilita seguridad mixta&lt;/li&gt;&lt;li&gt;Si es posible deshabilita acceso remoto&lt;/li&gt;&lt;li&gt;Como minimo corre "SQL Server Surface Area Configuration"&lt;/li&gt;&lt;li&gt;Parchealo&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;IIS:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Que el application pool corra con un usuario con mínimos privilegios&lt;/li&gt;&lt;li&gt;Deshabilita toda la funcionalidad que no vayas a utilizar&lt;/li&gt;&lt;li&gt;Deshabilita las extensiones que no vayas a utilizar&lt;/li&gt;&lt;li&gt;Los usuarios para acceso anonimo del web site tienen que tener los privilegios mínimos, en especial en la base de datos y en el home de tu sitio&lt;/li&gt;&lt;li&gt;En el website deshabilita los verbos y las isapi extensions que no vayas a utilizar&lt;/li&gt;&lt;li&gt;Parchealo&lt;/li&gt;&lt;/ul&gt;Administración de la seguridad:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dediquenle tiempo a la administración de seguridad&lt;/li&gt;&lt;li&gt;Actualizarse sobre novedades en ataques y vulnerabilidades&lt;/li&gt;&lt;li&gt;Revisar logs de IIS - Servidor - SQL y cualquier aplicación que expongan&lt;/li&gt;&lt;/ul&gt;Espero que les sirva, si tienen ampliaciones o correcciones, por favor déjenlas en los comentarios.&lt;br /&gt;&lt;br /&gt;Muchas gracias&lt;br /&gt;&lt;br /&gt;Carlos Peix&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-7565077606874351665?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/7565077606874351665/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=7565077606874351665' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/7565077606874351665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/7565077606874351665'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2008/09/pablo-allois-nos-enva-desde-rosario.html' title=''/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-4201296318805788018</id><published>2008-09-18T12:47:00.000-07:00</published><updated>2008-09-18T12:59:01.688-07:00</updated><title type='text'>Reunión EAS (Empanadas y Arquitectura de Software) de Agosto</title><content type='html'>Hola,&lt;br /&gt;&lt;br /&gt;Les dejo las fotos de los asistentes a la reunión&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LkW4fIIwXK8/SNKxEGFmgRI/AAAAAAAAAC0/iHqwa9-11_M/s1600-h/DSC01622c.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_LkW4fIIwXK8/SNKxEGFmgRI/AAAAAAAAAC0/iHqwa9-11_M/s400/DSC01622c.JPG" alt="" id="BLOGGER_PHOTO_ID_5247451199751749906" border="0" /&gt;&lt;/a&gt;De izquierda a derecha: Damian Herrera, Daniel Calvin, Diego Jancic, Leandro Tuttini y Fabio Maulo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LkW4fIIwXK8/SNKxECvvmWI/AAAAAAAAAC8/wmGJrACm3KI/s1600-h/DSC01624c.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_LkW4fIIwXK8/SNKxECvvmWI/AAAAAAAAAC8/wmGJrACm3KI/s400/DSC01624c.JPG" alt="" id="BLOGGER_PHOTO_ID_5247451198854764898" border="0" /&gt;&lt;/a&gt;De izquierda a derecha: (alguien me recuerda el nombre de los dos primeros?) Claudio Meschini, Carlos Peix (yo), Santiago Casey, (otro que no recuerdo) y Angel "Java" Lopez&lt;br /&gt;&lt;br /&gt;Hablamos varias cosas, pero el debate mas encendido estuvo alrededor de las opciones para construir aplicaciones Web en ASP.NET: WebForms o MVC (ASP.NET MVC y Monorail).&lt;br /&gt;&lt;br /&gt;Tambien discutimos un poco sobre algunos preconceptos sobre SOA.&lt;br /&gt;&lt;br /&gt;¿Me olvido de algo?&lt;br /&gt;&lt;br /&gt;¿Las empanadas? Muuuuuuuuy buenas, por mucho lo mejor de la reunión.&lt;br /&gt;&lt;br /&gt;Un Saludo,&lt;br /&gt;&lt;br /&gt;Carlos Peix&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-4201296318805788018?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/4201296318805788018/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=4201296318805788018' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/4201296318805788018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/4201296318805788018'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2008/09/reunin-eas-empanadas-y-arquitectura-de.html' title='Reunión EAS (Empanadas y Arquitectura de Software) de Agosto'/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_LkW4fIIwXK8/SNKxEGFmgRI/AAAAAAAAAC0/iHqwa9-11_M/s72-c/DSC01622c.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-4055736091978044018</id><published>2008-02-21T15:38:00.000-08:00</published><updated>2008-02-22T04:05:03.425-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Dos jornadas sobre NHibernate en el MUG</title><content type='html'>Ayer y hoy tuvimos la oportunidad de escuchar a Fabio Maulo y a Darío Quintana (dos "commiters" del equipo de NHibernate), con el silencioso aporte de Diego Jancic.&lt;br /&gt;Una excelente introducción a NHibernate, el resto esta en sus manos.&lt;br /&gt;&lt;br /&gt;Mas de 70 personas participaron, un récord absoluto para las reuniones de arquitectura. Un buen trabajo de organización, además (Gracias Oscar, Sandra, Mónica y al MUG).&lt;br /&gt;&lt;br /&gt;Fue interesante la modalidad de la presentación: el primer día vimos las bases, la ideología de NHibernate. El segundo día fue a puro Visual Studio, todos los ejemplos fueron presentados utilizando las herramientas de Unit testing para ejecutarlos (aprovechando las capacidades de logging). Esto hizo que Fabio y Darío pudieran moverse ágilmente entre un ejemplo y otro.&lt;br /&gt;&lt;br /&gt;"Lean la documentación" fue la última recomendación de los oradores y no puedo mas que estar de acuerdo con esta frase. Lean, investiguen, prueben, es la manera mas rápida y sólida de aprender.&lt;br /&gt;&lt;br /&gt;Un agradecimiento a Fabio, por animarse, probo ser un orador divertido. Gracias también a Darío por molestarse viajando más de 1000 kilómetros de ida y de vuelta y a Diego por apoyar a los oradores con los ejemplos.&lt;br /&gt;&lt;br /&gt;Pueden descargar desde aquí la presentación y los ejemplos:&lt;br /&gt;&lt;a href="http://groups.google.com/group/NHibernate-Hispano/files"&gt;http://groups.google.com/group/NHibernate-Hispano/files&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Algunos enlaces útiles;&lt;br /&gt;&lt;a href="http://groups.google.com/group/NHibernate-Hispano"&gt;http://groups.google.com/group/NHibernate-Hispano&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.nhibernate.org/"&gt;http://www.nhibernate.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nos vemos en la próxima reunión!&lt;br /&gt;&lt;br /&gt;Carlos Peix&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-4055736091978044018?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/4055736091978044018/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=4055736091978044018' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/4055736091978044018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/4055736091978044018'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2008/02/dos-jornadas-sobre-nhibernate-en-el-mug.html' title='Dos jornadas sobre NHibernate en el MUG'/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-2036936346192807447</id><published>2007-10-18T05:05:00.000-07:00</published><updated>2007-10-18T05:12:01.540-07:00</updated><title type='text'>Modelos de datos, muchos</title><content type='html'>Un catálogo interesante de modelos de datos. Tiene doble utilidad para los que no hablamos nativamente en inglés y necesitamos nombrar objetos y propiedades en ese idioma.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.databaseanswers.org/data_models/index.htm"&gt;http://www.databaseanswers.org/data_models/index.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nos vemos&lt;br /&gt;Carlos Peix&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-2036936346192807447?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/2036936346192807447/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=2036936346192807447' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/2036936346192807447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/2036936346192807447'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/10/modelos-de-datos-muchos.html' title='Modelos de datos, muchos'/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-1147336195402051067</id><published>2007-08-31T07:40:00.000-07:00</published><updated>2007-08-31T07:43:37.881-07:00</updated><title type='text'>Un proyecto interesante de un colega</title><content type='html'>Hola gente,&lt;br /&gt;&lt;br /&gt;Los invito a ver el proyecto de Caludio Meschini, un colega. Vean &lt;a href="http://claudiomeschini.blogspot.com/"&gt;aquí&lt;/a&gt; la explicación que el mismo da de su bebé.&lt;br /&gt;&lt;br /&gt;El dice que todavía le falta pulir cosas, pero les viene bien para entretenerse el sábado a la tarde.&lt;br /&gt;&lt;br /&gt;Carlos Peix&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-1147336195402051067?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/1147336195402051067/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=1147336195402051067' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/1147336195402051067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/1147336195402051067'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/08/un-proyecto-interesante-de-un-colega.html' title='Un proyecto interesante de un colega'/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-8940599830108150876</id><published>2007-08-23T07:36:00.000-07:00</published><updated>2007-08-23T07:40:53.685-07:00</updated><title type='text'>Un caso de arquitectura (agil)</title><content type='html'>Hola gente,&lt;br /&gt;&lt;br /&gt;Me parece interesante la lectura &lt;a href="http://www.infoq.com/articles/changing-the-present-case-stud"&gt;este caso&lt;/a&gt; de aplicación web (basada en Ruby on rails) por su envergadura.&lt;br /&gt;&lt;br /&gt;Carlos Peix&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-8940599830108150876?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/8940599830108150876/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=8940599830108150876' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/8940599830108150876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/8940599830108150876'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/08/un-caso-de-arquitectura-agil.html' title='Un caso de arquitectura (agil)'/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-6495828447638271817</id><published>2007-08-18T11:00:00.000-07:00</published><updated>2008-12-11T21:10:34.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cohesion'/><category scheme='http://www.blogger.com/atom/ns#' term='Acoplamiento'/><title type='text'>El principio de las cosas... Parte 2 de 2</title><content type='html'>En la primer entrega hablamos de Responsabilidad única, Principio abierto / cerrado y el Principio de Sustitución.&lt;br /&gt;&lt;br /&gt;Nos quedaron en el tintero, se esperaba que por pocos días, Inversión de dependencia y Segregación de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;interface&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;d - Inversión de dependencia&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Modelamos, sea en papel, en &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;UML&lt;/span&gt;, en nuestra mente, como sea, lo hacemos. Creamos artefactos, clases por lo general, y relacionamos esos artefactos unos con otros.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cuando hacemos esto, relacionar artefactos, establecemos dependencia entre ellos. Un artefacto deberá conocer a otro. El artefacto B requiere un artefacto del tipo C y otro del tipo D.&lt;br /&gt;&lt;br /&gt;Vamos a implementar un pequeño modulo de registro de eventos para tener un ejemplo concreto de como nos afectan las dependencias en un modelo.&lt;br /&gt;&lt;br /&gt;Nuestro módulo de registro incluirá unas pocas clases, veamos un diagrama:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5100002716360733794" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_dDPyRo4YZho/RsbZcxY1dGI/AAAAAAAAABk/3eTYIoqjROg/s400/RegistroSimple.jpg" border="0" /&gt;Lo primero que se aprecia es la asignación correcta de responsabilidades, hemos asimilados los principios &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;OOD&lt;/span&gt; vistos hasta ahora. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Por supuesto siempre existe un contexto, ese contexto nos dará un marco para poder determinar problemas potenciales. &lt;/p&gt;&lt;p&gt;Si miramos el diagrama tenemos una violación potencial al principio Abierto / Cerrado. &lt;/p&gt;&lt;p&gt;Este modulo tiene como fin ser incluido en cualquier aplicación que desarrollemos y su objetivo es poder registrar información en algún dispositivo de salida.&lt;/p&gt;&lt;p&gt;Un ejemplo sería registrar errores en tiempo de ejecución, inicios de sesión por parte de los usuarios de un sistema, lo que creamos necesario.&lt;/p&gt;&lt;p&gt;Ese es mi contexto, puedo decir que mis mensajes serán muy uniformes, esos mensajes forman parte de mi dominio, son un concepto bien conocido, no existen grandes posibilidades de cambio en el corto plazo. Esto es una definición, no una estimación.&lt;/p&gt;&lt;p&gt;Por otra parte esa misma definición me habla de algún dispositivo de salida, allí la cosa es mas abierta, deberé de alguna manera estar preparado al cambio.&lt;/p&gt;&lt;p&gt;Volviendo al diagrama ahora puedo señalar algunas cuestiones:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;La clase &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;LogHelper&lt;/span&gt; depende de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Message&lt;/span&gt;&lt;/li&gt;&lt;li&gt;La clase &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;LogHelper&lt;/span&gt; depende de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;TextFile&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;El primer caso, teniendo en cuenta el contexto, la definición del negocio, esa dependencia no me preocupa. Alguien podría señalar que produce acoplamiento, en mi contexto no lo consideraré como tal. ( No hacer esto podría aportar complejidad innecesaria al modelo, una buena práctica es mantener la simplicidad. )&lt;br /&gt;&lt;br /&gt;El segundo caso es más complejo, mi definición habla de algún dispositivo de salida, mi primer dispositivo es &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;TextFile&lt;/span&gt;, cambiar o agregar algún otro dispositivo de salida implicará cambios profundos en &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;LogHelper&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Este último problema va más allá del acoplamiento, nuestro modelo esta acoplado y además es rígido.&lt;br /&gt;&lt;br /&gt;El principio de Inversión de dependencia nos ayuda a eliminar o acotar este tipo de problemas, que nos dice el principio?&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;Los módulos de nivel superior no deben depender de módulos de bajo nivel.&lt;br /&gt;Ambos deben depender de abstracciones.&lt;/p&gt;&lt;p align="center"&gt;Los detalles deben depender de abstracciones y no lo contrario.&lt;/p&gt;Veamos ahora algunos cambios en el diagrama que reflejen la aplicación del principio.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5100012453051593842" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_dDPyRo4YZho/RsbiThY1dHI/AAAAAAAAABs/d1r8OIwABZc/s400/RegistroSimpleIoD.jpg" border="0" /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;LogHelper&lt;/span&gt; ya no depende de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;TextFile&lt;/span&gt;, lo hace de&lt;em&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;OutPutProvider&lt;/span&gt;&lt;/em&gt;, la notación itálica nos indica que es una clase abstracta.&lt;/p&gt;Hemos logrado que nuestro modulo de registro no sea tan rígido, será mucho más simple lograr su reutilización.&lt;br /&gt;&lt;br /&gt;Quiero resaltar un concepto, en la definición del principio hablamos de &lt;strong&gt;Módulo de Nivel Superior&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Estos son menos propensos al cambio, son los que expresan nuestro negocio, representan el dominio del problema, su mención no es casual.&lt;br /&gt;&lt;br /&gt;En cada &lt;strong&gt;Nivel &lt;/strong&gt;atenderemos un &lt;strong&gt;Negocio&lt;/strong&gt; determinado, aplicar Inversión de dependencia implica conocer los límites, el borde de cada nivel.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;e - Segregación de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;interface&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;Existen situaciones en las que una misma clase será consumida por distintos clientes, agentes que solo necesitan conocer un conjunto acotado de responsabilidades de esa clase. Sin embargo esas clases siguen representando un concepto único en el modelo.&lt;br /&gt;&lt;br /&gt;Es una situación ambigua, la clase sigue siendo cohesiva y quienes la consumen manejan un concepto acotado de la misma en el dominio.&lt;br /&gt;&lt;br /&gt;Supongamos una clase Cliente, nuestra clase es consumida por agentes que están interesados en distintos aspectos:&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5100041066123719810" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_dDPyRo4YZho/Rsb8VBY1dII/AAAAAAAAAB0/t4KEX9_w7xc/s400/SegInt.jpg" border="0" /&gt; &lt;p&gt;Estos atributos parecen estar directamente vinculados con las responsabilidades de Cliente, no hemos violado ningún principio, nuestra clase es cohesiva.&lt;/p&gt;&lt;p&gt;En estos términos veamos ahora como afecta esto a los artefactos consumidores de Cliente.&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Despacho&lt;br /&gt;Solo necesita conocer el Domicilio&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;BuzonEletronico&lt;/span&gt;&lt;br /&gt;Solo necesita cono &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;cer&lt;/span&gt; la dirección electrónica.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Si vamos un poco mas allá nos damos cuenta también que estos artefactos que consumen la clase Cliente manejan conceptos que parciales respecto a la clase que consumen.&lt;/p&gt;&lt;p&gt;Un cambio en Cliente, implica cambios profundos nuevamente, la reutilización de Despacho y &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;BuzonElectronico&lt;/span&gt; se ve seriamente limitada, y la lista continúa....&lt;/p&gt;&lt;p&gt;Algo entonces esta fuera de lugar, veamos que nos dice el principio de segregación de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;interface&lt;/span&gt;:&lt;/p&gt;&lt;p align="center"&gt;Los clientes no deben ser forzados a depender de interfaces que no utilizan.&lt;/p&gt;&lt;p align="left"&gt;Apliquemos el principio, creemos interfaces acotadas que serán consumidas por &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;BuzonElectronico&lt;/span&gt; y por Despacho, Cliente ahora implementará esas interfaces.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5100041190677771410" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_dDPyRo4YZho/Rsb8cRY1dJI/AAAAAAAAAB8/wF4O1WdNfQ4/s400/SegIntNuevo.jpg" border="0" /&gt;Tenemos ahora un modelo mas elegante, mas cohesivo, poco acoplado.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conclusiones:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Los principios de diseño nos permiten adelantarnos a los problemas, son conceptos que debemos manejar en forma natural, debemos integrarlos a nuestra forma de pensar al modelar o implementar aplicaciones orientadas a objeto.&lt;/p&gt;&lt;p&gt;La cuestión no termina aquí, es el comienzo, sobre estos principios se construyen muchos conceptos teóricos mas avanzados, se construyen patrones, etc.&lt;/p&gt;&lt;p&gt;Me despido ahora, nos vemos pronto.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-6495828447638271817?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/6495828447638271817/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=6495828447638271817' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/6495828447638271817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/6495828447638271817'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/el-principio-de-las-cosas-parte-2-de-2.html' title='El principio de las cosas... Parte 2 de 2'/><author><name>Daniel Calvin</name><uri>http://www.blogger.com/profile/03445035019333408566</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_dDPyRo4YZho/SQdDdnh7Y6I/AAAAAAAAAFQ/PLriZjG8xtY/S220/DAC.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_dDPyRo4YZho/RsbZcxY1dGI/AAAAAAAAABk/3eTYIoqjROg/s72-c/RegistroSimple.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-2019365913267382862</id><published>2007-07-16T12:47:00.000-07:00</published><updated>2007-07-16T12:55:12.448-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>TDD y Arquitectura en Rosario</title><content type='html'>Hola gente,&lt;br /&gt;&lt;a href="http://carlospeix.blogspot.com/2007/07/tdd-y-arquitectura-en-rosario.html"&gt;Aquí&lt;/a&gt; les dejo el link a un post sobre dos jornadas en Rosario.&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-2019365913267382862?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/2019365913267382862/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=2019365913267382862' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/2019365913267382862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/2019365913267382862'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/07/tdd-y-arquitectura-en-rosario.html' title='TDD y Arquitectura en Rosario'/><author><name>Carlos Peix</name><uri>http://www.blogger.com/profile/05194967747763915942</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp3.blogger.com/_LkW4fIIwXK8/R78xbuxQ5oI/AAAAAAAAAAM/TOcQ4h6Uv3Y/S220/Foto_Peix.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-854048827436511243</id><published>2007-06-24T07:16:00.000-07:00</published><updated>2008-12-11T21:10:35.755-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cohesión'/><category scheme='http://www.blogger.com/atom/ns#' term='Acoplamiento'/><category scheme='http://www.blogger.com/atom/ns#' term='OOD'/><title type='text'>El principio de las cosas... Parte 1 de 2</title><content type='html'>&lt;div&gt;Hace unos días un amigo me planteaba su dificultad para comprender IoC, Inversion of Control, mientras conversábamos sobre el tema me di cuenta que el problema no radicaba en el principio en sí, si no en la necesidad de aplicarlo, el porque de su aparición es escena.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Me parecio un buen aporte entonces escribir esta entrada, la idea es mencionar algunos principios de diseño OO, Object Oriented, sobre todos aquellos implícitos en conceptos mas avanzados y que muchas veces damos por sentado que nuestro interlocutor conoce.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;La otra realidad que viene de la mano es que difícilmente quien se inicia, y algunos ya iniciados, logren diseños eficientes sin conocer estos principios o su significado concreto.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Principios de diseño:&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;a - Responsabilidad única.&lt;br /&gt;b - Principio Abierto / cerrado&lt;br /&gt;c - Principio de Sustitución&lt;br /&gt;d - Principio Inversión de dependencia&lt;br /&gt;e - Segregación de interfaz&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Veremos ahora que cuestión en el diseño ocupa a cada principio, personalmente me parece más didáctico explicar algunas cosas por el opuesto, mostrar el problema y asi entender la ventaja de aplicar el principio.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;a - Responsabilidad única.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vamos a tomar un pequeño conjunto de clases para nuestro ejemplo, empezaremos con una y veremos los males que nos aquejan.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_dDPyRo4YZho/Rn6hn8-YtLI/AAAAAAAAAAM/T9EvFRX2lxU/s1600-h/ClientePocoCohesivo.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5079675137475261618" style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://4.bp.blogspot.com/_dDPyRo4YZho/Rn6hn8-YtLI/AAAAAAAAAAM/T9EvFRX2lxU/s320/ClientePocoCohesivo.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Nuestra clase Cliente es verdaderamente potente, sabe hacer tantas cosas!!!!, con solo tener una instancia de ella puedo resolver una gran cantidad de problemas.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Veamos que cosas sabe hacer:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;1 - Persistirse&lt;/div&gt;2 - Eliminarse&lt;br /&gt;&lt;div&gt;3 - Crear una salida HTML que muestre sus atributos&lt;/div&gt;4 - Hacer reportes referidos a ella misma&lt;br /&gt;&lt;div&gt;5 - Calcular su edad en el mercado&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Todo parece muy cómodo, pero analicemos como se comporta esta clase frente al cambio, su capacidad de adaptación.&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cambio mi motor de base de datos, de XXSql paso a NNSql.&lt;br /&gt;Debo cambiar mi clase Cliente.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cambio la forma de crear la salida HTML&lt;br /&gt;Debo cambiar mi clase Cliente.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Agrego un reporte o modifico uno existente&lt;br /&gt;Debo cambiar mi clase Cliente.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cambio la política para calcular la presencia en el mercado&lt;br /&gt;Debo cambiar mi clase Cliente.&lt;/li&gt;&lt;/ul&gt;Esto evidentemente es malo, existen distintos eventos cuya consecuencia es un cambio en la clase Cliente.&lt;br /&gt;&lt;p&gt;Si vemos un poco mas allá de nuestras narices notaremos que además esto implicará cambios en aquellos artefactos que recurren a la clase Cliente para resolver alguna colaboración.&lt;/p&gt;Bueno el problema es que nuestra clase Cliente tiene muchas responsabilidades, incluso algunas que exceden claramente sus responsabilidades naturales, me refiero a las responsabilidades de Cliente en su contexto de negocio.&lt;br /&gt;&lt;div&gt;Se dice entonces que Cliente es poco &lt;strong&gt;cohesiva&lt;/strong&gt;, sabe hacer más de lo que necesita, maneja temas en los cuales no es experto.&lt;/div&gt;&lt;br /&gt;Posiblemente esa falta de cohesión nos lleve a otro problema, para mi es una regla que se cumple con rigor matemático, &lt;strong&gt;acoplamiento&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Un cambio en Cliente requerirá cambios en quienes consumen la clase Cliente, los cambios se propagan en nuestro diseño, el impacto de un cambio es alto, afecta a varios artefactos.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Pero, volvamos a nuestro principio de OOD, Object Oriented Design, Responsabilidad única.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Este principio ataca el problema descripto, su enunciado dice:&lt;/div&gt;&lt;div align="center"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;No debe existir más de una razón para cambiar una clase.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;En nuestro escenario Cliente debería ser algo parecido a la siguiente figura:&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5079836778569446690" style="margin: 0px auto 10px; display: block; text-align: center;" alt="" src="http://4.bp.blogspot.com/_dDPyRo4YZho/Rn80os-YtSI/AAAAAAAAABE/LYiyjukRWNg/s400/ClienteCohesivo.jpg" border="0" /&gt; Que sucede entonces con aquellos metodos que ya no existen en Cliente?, bueno será nuestro trabajo buscar quienes tienen la responsabilidad de resolver esas cuestiones. Lo importante aquí es que Cliente atienda sus responsabilidades directas, aquellas en las que es experto.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;También es destacable que deberá relacionarse, u otras clases deberán relacionarse con ella, para resolver las cuestiones en las que Cliente no es el experto, pero requieren de su colaboración.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Eso nos lleva a otros principios que ayudarán a manejar las colaboraciones en forma desacoplada.&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;b - Abierto / cerrado &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Volvamos ahora a nuestra nueva clase Cliente, en el punto anterior mejoramos su cohesión eliminando algunos métodos, todos sabemos que alguien deberá encargarse entonces de asumir la responsabilidad de implementar esa funcionalidad. &lt;/div&gt;&lt;br /&gt;Una posible solución para lo relacionado con la persistencia podría ser la siguiente:&lt;a href="http://1.bp.blogspot.com/_dDPyRo4YZho/Rn68WM-YtPI/AAAAAAAAAAs/TyWLBCJiecQ/s1600-h/ClienteCohesivoViolaAC.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5079704519346533618" style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://1.bp.blogspot.com/_dDPyRo4YZho/Rn68WM-YtPI/AAAAAAAAAAs/TyWLBCJiecQ/s400/ClienteCohesivoViolaAC.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_dDPyRo4YZho/Rn60aM-YtOI/AAAAAAAAAAk/NIU5GAShR4I/s1600-h/ClienteCohesivoViolaAC.jpg"&gt;&lt;/a&gt;Muy bien otra vez contamos con unas clases muy bonitas, las responsabilidades ahora parecen estar asignadas correctamente, y de hecho lo están.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Propongamos un cambio en el requerimiento y veamos.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Nuestra clase ClienteDB recurre a un susbsistemas de APIs específicas de XXSql. Ahora nos piden que debemos armar una implementación para que la base de datos sea ZZSql.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Nuevamente un cambio tiene impacto directo un cambio en el sistema de base de datos puede requerir un cambio en Ventas. Por caracter transitivo ventas ha quedado acoplado la API de XXSql.&lt;/div&gt;&lt;br /&gt;Problema planteado, que nos dice el principio Abierto/Cerrado?&lt;br /&gt;&lt;div align="center"&gt;Los artefactos software deben ser abiertos para su extensión, pero cerrados ante una modificación.&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;En resumidas cuentas lo que quiere decir esto es que un cambio en el entorno de un artefacto no debería implicar un cambio en el artefacto. Esto no solo es válido para clases, se aplica también a métodos y cualquier otro artefacto software.&lt;/div&gt;&lt;br /&gt;La aplicación del principio a nuestro problema podría ser agregar una interface o una clase abstracta que sea bien conocida por Ventas, ClienteDB debería implementar la interface o heredar de la clase abstracta.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_dDPyRo4YZho/Rn7AeM-YtQI/AAAAAAAAAA0/eL5DhOkZDfA/s1600-h/ClienteCohesivoNoViolaAC.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5079709054831998210" style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://1.bp.blogspot.com/_dDPyRo4YZho/Rn7AeM-YtQI/AAAAAAAAAA0/eL5DhOkZDfA/s400/ClienteCohesivoNoViolaAC.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En el diagrama se puede apreciar la implementación para una cuestión más terrenal, mockobjects y test unitarios.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="left"&gt;&lt;strong&gt;c - Sustitución&lt;/strong&gt;&lt;/p&gt;Vamos a aprovechar la capacidad de extensión que nos brindan los lenguajes OO, estamos frente a nuestra clase Cliente, con algunos cambios ya que los requerimientos del sistema han cambiado con el transcurso del tiempo y ahora un nuevo requerimiento nos exige considerar Clientes presenciales y Clientes virtuales.&lt;br /&gt;&lt;p align="left"&gt;Hacemos OOP, Object Oriented Poragramming, contamos con los beneficios de la herencia, heredemos de Cliente.&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;La funcionalidad nueva esta relacionada con la obtención de la autorización de una transacción comercial. &lt;a href="http://4.bp.blogspot.com/_dDPyRo4YZho/Rn7z78-YtRI/AAAAAAAAAA8/GflcgB0NdrI/s1600-h/ClienteCohesivoViolaSustitucion.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5079765641026123026" style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://4.bp.blogspot.com/_dDPyRo4YZho/Rn7z78-YtRI/AAAAAAAAAA8/GflcgB0NdrI/s400/ClienteCohesivoViolaSustitucion.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;El experto en autorización requiere que el cliente se identifique, pero el ClienteVirtual implementa el metodo Identificarse() disparando una Exception. Su lógica de negocio no provee un mecanismo de identificación.&lt;/p&gt;El método Obtener entonces deberá tener un tratamiento especial para ClienteVirtual.&lt;br /&gt;&lt;br /&gt;Posiblemente el programador haga algo así:&lt;br /&gt;&lt;br /&gt;   if( typeof...   )&lt;br /&gt;       //Tratamiento para ClienteVirtual&lt;br /&gt;   else&lt;br /&gt;      //Tratamiento para Cliente&lt;br /&gt;&lt;br /&gt;El problema entonces es que CentroAutorización ya no puede tratar a ClienteVirtual como Cliente, debe conocer las características de la sub clase porque esta altera el comportamiento de la clase Cliente. ( Comportamiento, no implementación de comportamiento).&lt;br /&gt;&lt;br /&gt;La solución en este caso es revisar eol diseño, posiblemente ClienteVirtual no este en la línea de herencia de Cliente, tal como pensamos en principio.&lt;br /&gt;&lt;br /&gt;No atender estas cuestiones hace que nuestro diseño sea críptico, que los programadores no puedan confiar en la extensión de las clases y deban conocer el comportamiento de de cada una de ellas.&lt;br /&gt;&lt;br /&gt;Bueno, para evitar esto debemos respetar el principio de sustitución. El mismo expresa:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Toda clase debe poder ser reemplazada por cualquiera de sus subclases&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;La aplicación de este principio garantiza de alguna manera el éxito en la aplicación de los principios de Responsabilidad única y Abierto / cerrado.&lt;br /&gt;&lt;br /&gt;En los próximos días completaré esta entrega con los principios restantes.&lt;br /&gt;&lt;br /&gt;Espero que pese a lo básico este post les resulte de interés.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-854048827436511243?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/854048827436511243/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=854048827436511243' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/854048827436511243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/854048827436511243'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/el-principio-de-las-cosas-parte-1-de-2.html' title='El principio de las cosas... Parte 1 de 2'/><author><name>Daniel Calvin</name><uri>http://www.blogger.com/profile/03445035019333408566</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://3.bp.blogspot.com/_dDPyRo4YZho/SQdDdnh7Y6I/AAAAAAAAAFQ/PLriZjG8xtY/S220/DAC.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_dDPyRo4YZho/Rn6hn8-YtLI/AAAAAAAAAAM/T9EvFRX2lxU/s72-c/ClientePocoCohesivo.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-3910436728592855323</id><published>2007-06-21T19:07:00.000-07:00</published><updated>2007-06-21T19:30:54.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Performance Bodyguard</title><content type='html'>Este no va a ser el post mas ingenioso de todos, pero realmente es muy util. Ayende publico en su blog ayer un HttpModule para ASP.NET que controla los queries que hace NHibernate por request, de esta forma se pueden ver los excesos de queries en la ejecucion de la pagina.&lt;br /&gt;El post es este:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ayende.com/Blog/archive/2007/06/20/Shocking-Rob.aspx"&gt;http://ayende.com/Blog/archive/2007/06/20/Shocking-Rob.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para hacerlo funcionar es necesario:&lt;br /&gt;- referencia a la DLL de &lt;a href="http://www.blogger.com/logging.apache.org/log4net"&gt;log4net&lt;/a&gt;&lt;br /&gt;- eliminar todos los using de Rhino.Commons&lt;br /&gt;- Agregar un item en los Settings del proyecto con el nombre MaxNumberOfQueriesPerRequest, de tipo Int y valor 30 (por ejemplo...)&lt;br /&gt;- Configurar log4net (Es importante configurar el Logger level de NHibernate.SQL a DEBUG)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-3910436728592855323?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/3910436728592855323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=3910436728592855323' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/3910436728592855323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/3910436728592855323'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/performance-bodyguard.html' title='Performance Bodyguard'/><author><name>Diego Jancic</name><uri>http://www.blogger.com/profile/05757820946421364916</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_iD_xEl9dQ-8/SWkJjunMzRI/AAAAAAAAAEk/bhmCh8B0Vso/S220/IMG+0052.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-814979287930382565</id><published>2007-06-21T08:16:00.000-07:00</published><updated>2007-06-21T08:27:23.508-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Arquitectura multi-plataforma: Silverlight@Linux = Moonlight</title><content type='html'>&lt;span style="font-family: trebuchet ms;"&gt;Un interesantísimo detalle sobre el &lt;a href="http://tirania.org/blog/archive/2007/Jun-21.html"&gt;proceso de implementación de Silverlight en Linux&lt;/a&gt;, por Miguel de Icaza.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;"&gt;Es notable el hecho de que tienen casi completa la implementación en 21 días. Creo que es un éxito del equipo, sin duda, pero también de la arquitectura de Silverlight.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;"&gt;Próximamente tendremos que empezar a discutir detalles importantes de arquitectura a tener en cuenta para producir aplicaciones para Silverlight. Hay mucha tela para cortar al respecto, desde separación de capas, patrones de comunicación, seguridad, paradigmas de UI, etc.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-814979287930382565?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/814979287930382565/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=814979287930382565' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/814979287930382565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/814979287930382565'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/arquitectura-multi-plataforma.html' title='Arquitectura multi-plataforma: Silverlight@Linux = Moonlight'/><author><name>Martin Salias</name><uri>http://www.blogger.com/profile/00604319815514553479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.salias.com.ar/images/ms10.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-5691128454314553347</id><published>2007-06-12T21:10:00.000-07:00</published><updated>2007-06-21T08:25:54.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Reflection en ASPX, eh?</title><content type='html'>Acceder a absolutamente todo mediante reflection es algo que se es poniendo cada vez mas de moda y puede traer varios problemas. Pero no voy a hablar de como solucionar los problemas sino de como usar Reflection aun mas :)&lt;br /&gt;&lt;br /&gt;En algunos casos puede ser muy util ver que controles hay en una pagina que de mi aplicacion, por ejemplo puede servir para configurar permisos sobre controles como Toolbars o Grillas, editar informacion dinamicamente en base a WebParts de otras paginas, etc..&lt;br /&gt;Cuando se crea un Toolbar en una pagina lo mas normal es cargar la informacion sobre que operaciones (botones) tiene en una base de datos manualmente, pero es aun mucho mejor si la pagina en la que se configuran esos permisos puede saber automaticamente que botones tiene cada pagina....&lt;br /&gt;&lt;br /&gt;Lo primero que hay que hacer para obtener una pagina es crear un PageHandler, para eso lo unico necesario es la URL, por ejemplo "/Carpeta/Pagina1.aspx":&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Creo un Request Mock, realmente no se va a realizar ningun Request.&lt;br /&gt;SimpleWorkerRequest request = new SimpleWorkerRequest("/Carpeta/Pagina1.aspx", string.Empty, TextWriter.Null);&lt;br /&gt;HttpContext mockContext = new HttpContext(request);&lt;br /&gt;&lt;br /&gt;// Obtengo el handler de la pagina en cuestion...&lt;br /&gt;IHttpHandler handler = PageParser.GetCompiledPageInstance(virtualPath, fileName, mockContext);&lt;br /&gt;&lt;br /&gt;// Si se quiere ya se puede leer el nombre de la clase de esa pagina :)&lt;br /&gt;className = handler.GetType().BaseType.FullName;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Una vez que tenemos el&lt;/span&gt; HttpHandler que se encarga de procesar la pagina, lo que tenemos que hacer es procesarla. Pero primero creemos un delegado que nos va a servir para indicarle a la pagina que cree los controles que nosotros queremos dinamicamente.&lt;br /&gt;Durante todo este ejemplo se obtienen controles Toolbar, que es hipoteticamente un control personalizado, pero podria ser cualquier otro tipo (incluso todos los controles).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;delegate Toolbar BuildToolbarDelegate();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora, el codigo que recorre todos los controles declarados y compara el tipo. Es importante notar que lo que en realidad se esta recorriendo no es la clase que nosotros creamos sino una clase que ASP.NET genera dinamicamente cuando se modifica un ASPX. Esa clase posee informacion sobre todos los controles y metodos necesitados por el runtime de .NET.&lt;br /&gt;&lt;br /&gt;&lt;div style="overflow-y: auto; overflow-x: scroll; width: 100%; height: 420px; white-space: nowrap;"&gt;&lt;br /&gt;&lt;table style="width: 100%; height: 420px; vertical-align: top;" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; IEnumerable&amp;lt;Toolbar&amp;gt; GetPageControls(IHttpHandler handler)&lt;br /&gt;{&lt;br /&gt;  Type handlerType = handler.GetType();&lt;br /&gt;&lt;br /&gt;  &lt;span class="rem"&gt;// Busco todos los controles definidos en la pagina&lt;/span&gt;&lt;br /&gt;  FieldInfo[] fields = handlerType.GetFields(BindingFlags.NonPublic  BindingFlags.Public  BindingFlags.Instance);&lt;br /&gt;  &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (FieldInfo field &lt;span class="kwrd"&gt;in&lt;/span&gt; fields)&lt;br /&gt;  {&lt;br /&gt;      &lt;span class="rem"&gt;// Si el field que estoy recorriendo actualmente es un control del tipo Toolbar...&lt;/span&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Toolbar).Equals(field.FieldType))&lt;br /&gt;      {&lt;br /&gt;          &lt;span class="rem"&gt;// Llamo a un metodo generado en runtime por ASP.NET para cargar la informacion del&lt;/span&gt;&lt;br /&gt;          &lt;span class="rem"&gt;// control, el metodo se llama "__BuildControl" + id_del_control&lt;/span&gt;&lt;br /&gt;          &lt;span class="kwrd"&gt;string&lt;/span&gt; MethodName = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"__BuildControl{0}"&lt;/span&gt;, field.Name);&lt;br /&gt;          MethodInfo BuildControl = handler.GetType().GetMethod(MethodName, BindingFlags.Instance  BindingFlags.NonPublic);&lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;// Forma simple y lenta de llamar a ese metodo:&lt;/span&gt;&lt;br /&gt;          &lt;span class="rem"&gt;//yield return (Toolbar)BuildControl.Invoke(handler, null);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;          &lt;span class="rem"&gt;// Forma rapida (aunque hay mejores aun):&lt;/span&gt;&lt;br /&gt;          BuildToolbarDelegate buildDelegate = (BuildToolbarDelegate) Delegate.CreateDelegate(&lt;br /&gt;                                                                          &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (BuildToolbarDelegate),&lt;br /&gt;                                                                          handler,&lt;br /&gt;                                                                          BuildControl,&lt;br /&gt;                                                                          &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;          Toolbar t1 = buildDelegate();&lt;br /&gt;          &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; t1;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Esta tecnica simple permite hacer muchas cosas y extender la configuracion de la aplicacion usando bastante poco codigo. Incluso si se quiesiese se podria definir los tamaños de todos los controles en runtime, y para setearlos no seria tan complicado. Al menos no tanto como si no se usase esta tecnica.&lt;/p&gt;&lt;p&gt;De todas formas hay que tener cuidado porque cuando se procesan varias paginas puede empezar a ser lento para el usuario, pero eso se puede solucionar con Cache...&lt;/p&gt;&lt;p&gt;Suerte!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-5691128454314553347?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/5691128454314553347/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=5691128454314553347' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/5691128454314553347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/5691128454314553347'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/reflection-en-aspx-eh.html' title='Reflection en ASPX, eh?'/><author><name>Diego Jancic</name><uri>http://www.blogger.com/profile/05757820946421364916</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_iD_xEl9dQ-8/SWkJjunMzRI/AAAAAAAAAEk/bhmCh8B0Vso/S220/IMG+0052.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-6345948657073048631</id><published>2007-06-12T07:55:00.001-07:00</published><updated>2007-06-12T08:08:24.458-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Smalltalk en la plataforma .NET?</title><content type='html'>Así es. Mientras que otros proyectos como Smallscript (o S#) quedaron frizados en el tiempo, Peter Fisk realmente avanzó con su implementación de Vista Smalltalk para la plataforma Microsoft.&lt;br /&gt;&lt;br /&gt;Vista Smalltalk está profundamente basado en Windows Presentation Foundation y actualmente Peter está trabajando fuertemente en su implementación sobre  &lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt;, que avanza permamentemente como puede seguirse en &lt;a href="http://vistasmalltalk.wordpress.com/"&gt;su blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Smalltalk es un lenguaje que -en mi opinión- coincide perfectamente con la arquitectura de soluciones con clientes del tipo WPF/Silverlight basados en ambientes distribuidos, y para todos los viejos que tuvimos nuestro romance con él, es bueno verlo volver en una plataforma moderna y cercana a nuestro trabajo cotidiano.&lt;br /&gt;&lt;br /&gt;Home page de &lt;a href="http://vistascript.net/"&gt;Vista Smalltalk&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-6345948657073048631?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/6345948657073048631/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=6345948657073048631' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/6345948657073048631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/6345948657073048631'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/smalltalk-en-la-plataforma-net.html' title='Smalltalk en la plataforma .NET?'/><author><name>Martin Salias</name><uri>http://www.blogger.com/profile/00604319815514553479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.salias.com.ar/images/ms10.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-9017163503412154716</id><published>2007-06-11T20:03:00.000-07:00</published><updated>2007-06-12T21:06:08.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Testing de Repositorios</title><content type='html'>Bueno, despues de algunos dias amenazando con que iba a hacer este post me digne a escribirlo...&lt;br /&gt;&lt;br /&gt;Cada vez que empiezo con un nuevo proyecto me pregunto como testear mejor los repositorios, o al menos de una formas mas sencilla. Esta vez hice 2 clases bases para eso:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- BaseMemoryRepository.cs:&lt;/strong&gt; Es una clase abstracta que tiene 2 tipos genericos (&lt;tentity,&gt;&lt;tentity,&gt;). El TEntity indica cual es la clase que se debe persistir, por ejemplo puede ser un simple Customer, el TIdentity es el tipo de Id.&lt;br /&gt;&lt;br /&gt;Si el TIdentity especificado es del tipo numerico (Int16, 32 ó 64) o GUID, la misma clase se encarga de la generacion automatica, pero si se quiere usar algo muy complicado la unica solucion es hacer un override del metodo object GetNextId().&lt;br /&gt;&lt;br /&gt;De esta forma, un repositorio simple quedaria asi:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomerRepository : BaseMemoryRepository,&lt;br /&gt;                                  ICustomerRepository&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetEntityId(Customer ent)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ent.Id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetEntityId(Customer ent)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ent.Id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetEntityId(Customer ent, &lt;span class="kwrd"&gt;int&lt;/span&gt; ident)&lt;br /&gt;    {&lt;br /&gt;        ent.Id = ident;&lt;br /&gt;    }&lt;br /&gt;} &lt;/pre&gt;&lt;br /&gt;- &lt;strong&gt;CustomerRepositoryTests.cs:&lt;/strong&gt; Esta clase es un poco mas compleja de usar que la anterior. Provee la funcionalidad para realizar CRUD todo junto, si bien no es lo mejor que se puede hacer en TDD, normalmente testear las operaciones basicas es resuelto de la misma forma. Por ejemplo si se usa un ORM lo mas probable es que funciona todo o no funciona nada.&lt;br /&gt;Es importante implementar 4 metodos en esta clase, estos se encargan de:&lt;br /&gt;- Crear un objeto de Testing&lt;br /&gt;- Devolver el Id de una entidad, necesario por el desconocimiento de cual es la propiedad Id de un objeto&lt;br /&gt;- Validar si el id de un objeto es valido; una vez que se crea un objeto se espera que un nuevo Id se le asigne, por eso con validar solamente que sea mayor a 0 alcanza en la mayoria de los casos.&lt;br /&gt;- El Test :) (que tiene que llamar a base.BasicOperationsTest())&lt;br /&gt;&lt;br /&gt;Aca va un ejemplo:&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;[TestFixture]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomerRepositoryTests : BaseRepositoryTests&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BuildTestEntity(&lt;span class="kwrd"&gt;out&lt;/span&gt; Customer e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;// Tengo que crear un nuevo Customer y configurar&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// informacion de prueba &lt;/span&gt;&lt;br /&gt;        e = &lt;span class="kwrd"&gt;new&lt;/span&gt; Customer();&lt;br /&gt;        e.Name = &lt;span class="str"&gt;"Name"&lt;/span&gt;;&lt;br /&gt;        e.Gender = Gender.Male;&lt;br /&gt;        e.BornDate = DateTime.Now;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; GetEntityId(Customer ent)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ent.Id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValidEntityId(Customer entity)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;// Una validacion simple &lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; entity.Id &amp;gt; 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    [Test]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; BasicOperationsTest()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="rem"&gt;// Aca hago el trabajo real! &lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.BasicOperationsTest();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Y listo, una vez que implementamos esas 2 clases por repositorio ya tenemos todos los test simples...&lt;br /&gt;&lt;br /&gt;El codigo completo con los 2 ejemplos de implementacion los pueden bajar de &lt;a href="http://cedev.com.ar/files/TestingRepositories.rar"&gt;acá&lt;/a&gt; o de &lt;a href="http://file-share.biz/file.php?file=fdac8d91f88d1cb3a1fbe21449199637"&gt;acá&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-9017163503412154716?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/9017163503412154716/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=9017163503412154716' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/9017163503412154716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/9017163503412154716'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/testing-de-repositorios.html' title='Testing de Repositorios'/><author><name>Diego Jancic</name><uri>http://www.blogger.com/profile/05757820946421364916</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://2.bp.blogspot.com/_iD_xEl9dQ-8/SWkJjunMzRI/AAAAAAAAAEk/bhmCh8B0Vso/S220/IMG+0052.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-4985308138780652308</id><published>2007-06-08T19:54:00.001-07:00</published><updated>2007-06-12T08:03:18.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Add-In de PowerShell para Reflector</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;El inefable &lt;/span&gt;&lt;a href="http://www.clariusconsulting.net/kzu"&gt;&lt;span style="font-family:trebuchet ms;"&gt;KZU&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; (léase kazu) publicó recientemente este Add-In de &lt;/span&gt;&lt;a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx"&gt;&lt;span style="font-family:trebuchet ms;"&gt;PowerShell &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;para Reflector.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.codeplex.com/reflectoraddins/Wiki/View.aspx?title=PowerShellLanguage"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Disponible en el sitio de Add-Ins de Reflector&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-4985308138780652308?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/4985308138780652308/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=4985308138780652308' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/4985308138780652308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/4985308138780652308'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/add-in-de-powershell-para-reflector.html' title='Add-In de PowerShell para Reflector'/><author><name>Martin Salias</name><uri>http://www.blogger.com/profile/00604319815514553479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.salias.com.ar/images/ms10.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-6648027062297186772</id><published>2007-06-08T18:49:00.000-07:00</published><updated>2007-06-21T08:22:53.912-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Debugging Avanzado en .NET</title><content type='html'>Un interesante artículo de Rodolfo "Rodo" Finochietti ubicado en el blog del &lt;a href="http://blogs.msdn.com/latamarchitectnewsletter/default.aspx" target="_blank"&gt;LATAM Architect Newsletter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/latamarchitectnewsletter/archive/2007/06/08/debugging-avanzado-en-net.aspx"&gt;http://blogs.msdn.com/latamarchitectnewsletter/archive/2007/06/08/debugging-avanzado-en-net.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-6648027062297186772?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/6648027062297186772/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=6648027062297186772' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/6648027062297186772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/6648027062297186772'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/debugging-avanzado-en-net.html' title='Debugging Avanzado en .NET'/><author><name>Martin Salias</name><uri>http://www.blogger.com/profile/00604319815514553479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.salias.com.ar/images/ms10.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7619098827979691186.post-513023757210545006</id><published>2007-06-08T18:36:00.000-07:00</published><updated>2007-06-08T18:40:52.555-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mug'/><title type='text'>Puntapié inicial</title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;Este blog surgió como una idea de comunicación complementaria a a lista &lt;a href="mailto:arquitectura@mug.org.ar"&gt;arquitectura@mug.org.ar&lt;/a&gt; en ún desayuno de trabajo esta mañana en la sede del MUG.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;El objetivo del logs intercambiar noticias, conceptos e ideas entre participantes del grupo de Arquitectura del MUG. Cualquier miembro del grupo que tenga matrial interesante para compartir puede solicitar su habilitación como autor en la lista.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;Esperamos que el recurso sea un buen complemento a la actividad de debate tradicional de la lista de correos.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7619098827979691186-513023757210545006?l=arq-mug.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arq-mug.blogspot.com/feeds/513023757210545006/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7619098827979691186&amp;postID=513023757210545006' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/513023757210545006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7619098827979691186/posts/default/513023757210545006'/><link rel='alternate' type='text/html' href='http://arq-mug.blogspot.com/2007/06/puntapi-inicial.html' title='Puntapié inicial'/><author><name>Martin Salias</name><uri>http://www.blogger.com/profile/00604319815514553479</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://www.salias.com.ar/images/ms10.jpg'/></author><thr:total>0</thr:total></entry></feed>
