<?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-8888861936546733138</id><updated>2012-02-16T15:26:32.063-08:00</updated><category term='php5'/><category term='fallos'/><category term='Orientación a objetos'/><category term='Calidad'/><category term='Pruebas'/><category term='Principios'/><category term='Catch'/><category term='defectos'/><category term='Diseño'/><category term='Patrones'/><category term='management.'/><category term='Costos'/><category term='SVN'/><category term='Implementación'/><category term='Casos de Uso'/><category term='Requisitos'/><category term='Try'/><title type='text'>Leo Barrientos :: Software Business</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-8616883684160890697</id><published>2008-10-25T13:46:00.000-07:00</published><updated>2008-10-25T13:56:35.400-07:00</updated><title type='text'>Buscando Grupo Scout en Providencia.</title><content type='html'>Sigo buscando un Grupo Scout en Providencia donde pueda volver al movimiento como dirigente, actividad que abandoné por razones de estudio hace 4 años y quiero retomar.&lt;br /&gt;&lt;br /&gt;Hoy he ido al grupo Carmen MacPhee a preguntar y me dijeron que no hay cupos como dirigente y que sólo aceptan gente del colegio [... plop], lo cual me pareció raro, a todo esto no oí ni el ruido típico de una enérgica tropa o una manada familia feliz.&lt;br /&gt;&lt;br /&gt;Sigo buscando, ahora creo pasaré a la de Nuestra Señora de la Divina Providencia, a ver que tal.&lt;br /&gt;&lt;br /&gt;Si alguien sabe de un grupo Scout por acá en Providencia avísenme en los comentarios, se agradece.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-8616883684160890697?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/8616883684160890697/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=8616883684160890697' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/8616883684160890697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/8616883684160890697'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/10/buscando-grupo-scout-en-providencia.html' title='Buscando Grupo Scout en Providencia.'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-5054396369827161232</id><published>2008-10-09T12:38:00.000-07:00</published><updated>2008-10-09T12:42:53.837-07:00</updated><title type='text'>Open Sistemas Chile y Appfuse</title><content type='html'>Hola, &lt;a href="http://www.appfuse.org"&gt;Appfuse&lt;/a&gt; es un maravilloso framework Java para aplicaciones WEB y con el cual se hacen aplicaciones profesionales enterprise usando algunas de las mejores tecnologías y herramientas conocidas en el mundo de la ingeniería de software.&lt;br /&gt;&lt;br /&gt;Acá el &lt;a href="http://www.appfuse.org/display/APF/Consulting+Providers"&gt;Link&lt;/a&gt; donde pueden encontrarnos como proveedores de servicios Appfuse en Chile, en especial Spring con Hibernate. Si necesitas soporte con appfuse escribe a chile[at]opensistemas.com&lt;br /&gt;&lt;br /&gt;También somos especialistas en Symfony en PHP5.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-5054396369827161232?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.appfuse.org/display/APF/Consulting+Providers' title='Open Sistemas Chile y Appfuse'/><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/5054396369827161232/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=5054396369827161232' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5054396369827161232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5054396369827161232'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/10/open-sistemas-chile-y-appfuse.html' title='Open Sistemas Chile y Appfuse'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-3952761075401400193</id><published>2008-09-30T17:38:00.000-07:00</published><updated>2008-09-30T17:44:17.463-07:00</updated><title type='text'>Open Sistemas en Chile</title><content type='html'>Hola a todos, anuncio que Open Sistemas ya está en Santiago de Chile - Luego de algunos años trabajando en España y con mi máster de ingeniería de software bajo el brazo estoy de regreso junto a Pamela Castro.&lt;br /&gt;&lt;br /&gt;Ya estamos ofreciendo servicios de desarrollo y asesoría en Ing de software (Más info en www.opensistemas.com) así que pida su información a chile@opensistemas.com  &lt;br /&gt;&lt;br /&gt;La info oficial de la franquicia aquí: &lt;a href="http://www.opensistemas.com/prensa/noticias/muestra_noticia/period/1222735282/article/26/306/"&gt;http://www.opensistemas.com/prensa/noticias/muestra_noticia/period/1222735282/article/26/306/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Va a ir todo excelente y esta primera semana ha sido muy interesante por Santiago. Un poco de marketing viral y de referencias si que nos ayudaría por parte de ustedes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-3952761075401400193?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.opensistemas.com/prensa/noticias/muestra_noticia/period/1222735047/article/26/306/' title='Open Sistemas en Chile'/><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/3952761075401400193/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=3952761075401400193' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3952761075401400193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3952761075401400193'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/09/open-sistemas-en-chile.html' title='Open Sistemas en Chile'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-5160632811999116363</id><published>2008-08-17T14:58:00.001-07:00</published><updated>2008-08-17T14:58:47.082-07:00</updated><title type='text'>Probando Flock</title><content type='html'>Hola, estoy probando el editor del navegador Flock, basado en firefox.&lt;br /&gt;   &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-5160632811999116363?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/5160632811999116363/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=5160632811999116363' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5160632811999116363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5160632811999116363'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/08/probando-flock.html' title='Probando Flock'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-7946603245599247056</id><published>2008-03-31T12:06:00.000-07:00</published><updated>2008-03-31T12:22:58.630-07:00</updated><title type='text'>Presentación UPM</title><content type='html'>Aceptando un invitación de &lt;a href="http://lucio.ls.fi.upm.es/miembros/nelson/"&gt;Nelson Medinilla  quien es mi tutor de tésis de Master[1], &lt;/a&gt;el día Viernes 28 de Abril he realizado una presentación sobre mi experiencia en desarrollo de software. El objetivo de dicha presentación fue intentar responder algunas dudas que tenemos cuando estudiamos la carrera de informática.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para mi fue una experiencia muy enriquecedora y agradezco a todos los que participaron en ella, en especial a Nelson y Xavi por hacer de esta una tarde muy interesante de ingeniería de software.&lt;br /&gt;&lt;br /&gt;A continuación los archivos de esa presentación: &lt;a href="http://rapidshare.com/files/103867795/20080327_UPM.ppt"&gt;PPT&lt;/a&gt; - &lt;a href="http://rapidshare.com/files/103867932/DiagramaDeCasosDeUso_Iter_001.png"&gt;Diagrama de Casos de Uso EventNet&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] Nelson ha escrito este &lt;a href="http://www.ewh.ieee.org/reg/9/etrans/vol5issue4July2007/5TLA4_11MedinillaMartinez.pdf"&gt;Paper&lt;/a&gt; muy interesante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-7946603245599247056?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/7946603245599247056/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=7946603245599247056' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/7946603245599247056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/7946603245599247056'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/03/presentacin-upm.html' title='Presentación UPM'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-6705113347582510928</id><published>2008-03-26T18:09:00.000-07:00</published><updated>2008-03-26T18:26:30.933-07:00</updated><title type='text'>No más sistemas de información administrativa</title><content type='html'>La maldición de dirigir proyectos sistemas de información administrativos (Un crear/editar/borrar/mostrar por aquí, otro por aquí) ya me han reventado el cerebro, es que el software se ensucia si no se usa con elegancia y no es elegante hacer una aplicación donde sea básicamente un front-end de un medio persistente (Mountains Gandalf! Mountains Gandalf!). &lt;br /&gt;&lt;br /&gt;Si bien estos últimos 2 años han sido una curva exponencial de power empezando por typo3, symfony, spring y próximamente grails, creo que debo dejar de programar que me estoy desencantando y dedicar mi tiempo libre a programar juegos. He estado buscando un juego tipo Commandos 2 para participar en el proyecto aplicando patrones y cosas interesantes y desafiantes y que por favor no sea un SIA (nada de crear/editar/borrar/mostrar nada, ni una pistola!), pero no encuentro así que mejor pido ayuda a quien lea. &lt;br /&gt;&lt;br /&gt;Apropósito esto debe ser una especie de crisis recurrente en la gente que nos dedicamos a este tema, me gustaría saber de otros casos.&lt;br /&gt;&lt;br /&gt;Pues este ha sido mi post a las 2:23 de la mañana imprimiendo tésis de master que espero entregar este mes y poder dedicarme a otra cosa por las tardes luego de OpenSistemas.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-6705113347582510928?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/6705113347582510928/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=6705113347582510928' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/6705113347582510928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/6705113347582510928'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/03/no-ms-sistemas-de-informacin.html' title='No más sistemas de información administrativa'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-5354610529174690287</id><published>2008-02-16T16:13:00.001-08:00</published><updated>2008-02-21T06:30:45.924-08:00</updated><title type='text'>Respuestas que me gustaría dar, pero no puedo - Escenario 1</title><content type='html'>mysql_connect("localhost", "root");&lt;br /&gt;                                //Consultas aqui&lt;br /&gt;                                //Un poco de html por aqui....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;Respuesta deseada:&lt;/span&gt; ¿Are you from the past? (Ver The IT Crowd).&lt;br /&gt;        &lt;span style="font-weight: bold;"&gt;Respuesta correcta:&lt;/span&gt; Hay varios ORM para php, debes utilizar capa de persistencia como Doctrine o Propel. Además puedes usar un framework de desarrollo llamado Symfony que integra todo y mucho más.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-5354610529174690287?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/5354610529174690287/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=5354610529174690287' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5354610529174690287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5354610529174690287'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/02/respuestas-que-me-gustara-dar-pero-no.html' title='Respuestas que me gustaría dar, pero no puedo - Escenario 1'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-6691357061652515940</id><published>2008-02-16T14:44:00.000-08:00</published><updated>2008-02-16T16:01:06.357-08:00</updated><title type='text'>Appfuse y el talón de Aquiles del desarrollo de Software.</title><content type='html'>&lt;span style="font-style: italic;"&gt;En esta entrada hablaré de un libro de historia interesante y de mi experiencia con Appfuse (www.appfuse.org) y como aquel libro de historia me ha hecho reflexionar.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;He terminado recientemente de leer "El Economista camuflado", libro que ha vuelto a despertar en mí la sensación de tener muchas ganas de aprender leyendo de cosas que no tengan que ver con software - sensación que no experimentaba desde "El último Catón" [Matilde Asensi]. En el intertanto han pasado varios libros de software que recomiendo ferviéntemente: "The pragmatic programmer" y la serie de los libros "Head First", en especial el de patrones de diseño.&lt;br /&gt;&lt;br /&gt;Comentaba que he terminado de leer "El economista camuflado" por que a continuación de dicho libro he comprado otro que me ha parecido muy interesante, su nombre es "El talón de Aquíles" [Cesar Vidal] y cuenta sobre cuales han sido las debilidades de personajes de la historia que los han hecho sumirse en grandes derrotas - todo gracias a su talón de Aquíles. Interesantes antecedentes históricos que me hicieron pensar en cuál es el talón de Aquíles de nosotros los ingenieros de software.&lt;br /&gt;&lt;br /&gt;Hablar de cuales son las debilidades que padecemos los ingenieros de software puede tomar bastantes horas, incluso hay asignaturas completas que rezan sobre las causas de la crisis del software, o de porqué el software carece de una visión industrial desde su concepción. Desde mi punto de vista creo que el talón de Aquiles de esta profesión es que carece desde un principio de la conexión entre la teoría y la práctica, ¿Cuántos profesores han hecho un mapping de persistencia con Hibernate?, ¿Un paginador?, ¿Han validado la vista W3C?, ¿Una estrategia de búsqueda?, ¿Objetos en caché? salvo casos destacados. Así pues nos vemos enfrentados a un mundo de clientes que esperan resultados concretos - no podemos responder a las tareas de un proyecto con ejercicios mentales.&lt;br /&gt;&lt;br /&gt;Desde algunos años existen Frameworks de desarrollo de software que vienen precisamente a aportar lo industrial pues orquestan las piezas de una aplicación aportando los mecanismos necesarios para que todo funcione apropiadamente y obviamente reutilizando bibliotecas usadas millones de veces a lo largo y ancho del mundo. A pesar de todos estos beneficios me impresiona la cantidad de personas ligadas al mundo del software que conoce muy poco de estos temas; personalmente fuí muy ignorante de esto hasta que aprendí Ruby On Rails hace un par de años.&lt;br /&gt;&lt;br /&gt;Existen frameworks para todos los gustos y tecnologías, de los que he utilizado y/o visto puedo hablar con propiedad de dos de ellos: Symfony para php5 y Spring para Java. En el encabezado de este post señalaba que hablaría de Appfuse, pues bien Appfuse (www.appfuse.org) es un organizador de distintas herramientas utilizadas para construir software con java; en términos concretos puedes elegir un arquetipo de appfuse y en un par de minutos tendrás configuradas tus herramientas favoritas listas para comenzar a desarrollar tu aplicación.&lt;br /&gt;&lt;br /&gt;La configuración de appfuse que utilizo es Spring + Hibernate, a continuación les doy 6 razones para desarrollar software con Appfuse:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Gestión de usuarios: Desde el momento de la primera ejecución appfuse provée un sistema de gestión de usuarios que incluye login, creación, roles, recuperar contraseñas. En fin todo lo que nos demandaba tiempo y era aburrido. ¿Alguien se ha divertido haciendo las clases para escribir cookies y validar sesiones?.&lt;/li&gt;&lt;li&gt;Plugin de generación de código: Una vez diseñada tu base de datos con su integridad referencial por supuesto, basta ejecutar una orden para que se genere el código - si eres bueno diseñando bases de datos estarás encantado. Esta generación de código escribe las clases con anotaciones JPA que permitirá conectar tu modelo orientado a objetos con la persistencia (Tengo un post relacionado llamado orientación de objetos v/s Bases de datos).&lt;/li&gt;&lt;li&gt;Generación de CRUD: Si la aplicación va de muchos "Crear/Editar/Borrar/Mostrar" de seguro esto te solucionará muchos de tus problemas. No sólo se genera el código para el CRUD si no que los test y datos de prueba. Evidentemente no te puedes quedar sólo con lo que te generara - si necesitas customizar lo generado es muy fácil de refactorizar - pues Appfuse crea managers y Daos genéricos que luego puedes fácilmente reemplazar por tus clases.&lt;/li&gt;&lt;li&gt;Jetty: Appfuse incluye un mini-tomcat por decirlo simple, desde el proyecto ejecutas mvn jetty:run-war y luego a http://localhost:8080 - No deploy need! - además no levanta el servidor si tu appz no pasa los test (Testing driven developmente es absolutamente necesario a estas alturas).&lt;/li&gt;&lt;li&gt;Utilizas el poder y la magia de las herramientas, la inyección de dependencia de Spring es un concepto que voló mi cabeza al descubrirlo - no cabe más que decir que si los productos por sí solos son exitósos, imagínatelos coordinados trabajando al servicio de tu cliente.&lt;/li&gt;&lt;li&gt;Dejo lo más importante para el final: La respuesta a tus dudas es Matt Ribbles - Appfuse cuenta con una de las mejores listas de correos que he participado - todas las veces que he preguntado algo es Matt Ribbles, creador de appfuse, quien personalmente contesta dándote exáctamente la información que necesitas. O séa que mejor.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Y puesto que la ingeniería de software es una Lemmingería (Alan Davis ironizaba al respecto) les cuento lo que no me ha gustado de appfuse:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;La curva de aprendizaje: Se tarda mucho en entender de que vá el tema, desde el DaoImpl al DaoInterface, del ManagerImpl al ManagerInterface, de los manager y Daos genéricos, del dispatcher servlet, de los alias de vistas y vista resolver, del initBinder del controlador, del controlador multiaction ..... hay mucho, mucho que aprender a entender como se relacionan. En 4 fin de semanas puedo decir que ví claridad.&lt;/li&gt;&lt;li&gt;El riesgo de lo automático existe aquí - pero muy poco: Me ocurrio que en unos test, Spring inyectaba por nombre el objeto necesario automáticamente, esto funcionaba perfecto hasta que puse dos aplicaciones en el mismo workspace y cambié de portatil - no funcionó más. Luego de eso tuve que buscar en todo el Spring in Action para resolver el problema.&lt;/li&gt;&lt;li&gt;Aprender todos los mecanismos para ver claridad, personalemente no soy muy bueno con las capas de presentación - me gusta más el tema puro de patrones en la parte del modelo y controlador, pero me he visto obligado a pasar horas revisando los jsp y sus tags.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Para concluir, les hago una invitación a usar frameworks y que si ya los usan a buscar otros para mejor continuamente para vencer nuestro talón de Aquiles - Mi próximo desafío se llama Grails.&lt;br /&gt;&lt;br /&gt;Hasta pronto!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-6691357061652515940?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/6691357061652515940/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=6691357061652515940' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/6691357061652515940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/6691357061652515940'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2008/02/appfuse-y-el-taln-de-aquiles-del.html' title='Appfuse y el talón de Aquiles del desarrollo de Software.'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-219636322738961083</id><published>2007-11-05T13:23:00.000-08:00</published><updated>2007-11-05T14:52:34.334-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SVN'/><title type='text'>Estructura de SVN para Proyectos de Software</title><content type='html'>Tener una estructura ordenada de nuestro repositorio es muy importante, pues el proceso de desarrollo en concreto produce artefactos software que deben ser mantenidos, ordenados, revizados y catalogados adecuadamente.&lt;br /&gt;&lt;br /&gt;Para quienes no utilicen un control de versiones en sus proyectos, les recomiendo que comiencen a usarlo inmediatamente pues en el software hay que ser simplista, gestionar los cambios, reutilizar lo más posible, y en la medida de lo posible que herramientas hagan nuestro trabajo [Para los estudiosos: Do not repeat yourself, Keep it simple  stupid, etc].&lt;br /&gt;&lt;br /&gt;Lo primero es entender como trabaja un control de versiones en lineas muy generales: Existe un directorio donde se alamcena una base de datos de archivos, cada desarrollador obtiene una copia de ese directorio y hace los cambios necesarios que luego sube a este directorio; Si hay más de una persona trabajando no importa pues tiene herramientas automáticas que son capaces de juntar los cambios incluso en un archivo y avisar de los conflictos. Para más información sobre control de versiones y en concreto de &lt;a href="http://en.wikipedia.org/wiki/Subversion_%28software%29"&gt;subversion click aqui.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ahora que ya se sabe el beneficio de usar un sistema de control de versiones, se debe definir que  estructura deberá tener este. Si bien la estructura depende del proceso de desarrollo de software que practiques, la estructura que se presenta la puedes usar como base pues formaliza los archivos y carpetas que se deben incluir.&lt;br /&gt;&lt;br /&gt;Nomenclatura:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Linea base:&lt;/span&gt; Linea base de gestión de configuración - en nuestro caso una carpeta que contien determinados artefactos.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;iter&gt;ITER:&lt;/iter&gt;&lt;/span&gt; Número de la iteración en la cual fue producido el documento o modelo. No aplica a código fuente. Ejemplo: &lt;span style="font-style: italic;"&gt;PLAN_REQ-ERS-00.doc&lt;/span&gt; significa el documento de especificación de requisitos de la linea base PLAN_REQ que se produjo en la iteración 0.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Tipos de archivo (de las herramientas que yo uso):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;.zargo:&lt;/span&gt; Modelo UML en ArgoUML&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;.doc: &lt;/span&gt;OpenOffice Word Processor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;.xml: &lt;/span&gt;Modelo de base de datos en DBDesigner.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;.txt: &lt;/span&gt;Un editor de texto.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;.sql:&lt;/span&gt; Script sql.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Cabe señalar que se trata de una estructura de  directorios para un proceso de desarrollo iterativo,  más info &lt;a href="http://en.wikipedia.org/wiki/Iterative_and_incremental_development"&gt;aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;trunk  (Directorio de desarrollo)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;PLAN_REQ (Linea base de planificación y requisitos)&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;PLAN_REQ-CALIDAD-ITER&lt;iter&gt;.doc (Plan de calidad)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;PLAN_REQ-CASOS_DE_USO_FORMATO_BREVE-ITER&lt;iter&gt;.doc (Casos de uso, formato breve)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;PLAN_REQ-CONFIGURACION-ITER&lt;iter&gt;.doc (Plan de gestión de configuración IEEE 828)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;PLAN_REQ-DESCRIPCION_DEL_SISTEMA-ITER&lt;iter&gt;.doc (Descripción del sistema)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;PLAN_REQ-DIAGRAMA_CASOS_DE_USO-ITER&lt;iter&gt;.zargo (Diagramas de casos de uso)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;PLAN_REQ-ERS-ITER&lt;iter&gt;.doc (Especificación de requisitos de software - IEEE 830)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;PLAN_REQ-ESTIMACION_PLANIFICACION-ITER&lt;iter&gt;.doc (Estimación y Planificación del proyecto - Cocomo II, Puntos de función, cartas gantt)&lt;/iter&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;DISEÑO (Linea base de análisis y diseño)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;DISEÑO-CASOS_DE_USO_FORMATO_EXTENDIDO-ITER&lt;iter&gt;.doc (Casos de uso formato extendido - màs conocido como Fichas de casos de uso)&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;DISEÑO-CONTRATOS_DE_OPERACIONES-ITER&lt;iter&gt;.doc&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;DISEÑO-DIAGRAMAS_DE_SECUENCIAS_DEL_SISTEMA-ITER&lt;iter&gt;.zargo (Pueden obviarlo - no me gustan muchos estos diagramas)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;DISEÑO-MODELO_CONCEPTUAL-ITER&lt;iter&gt;.zargo (Classes de análisis)&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;DISEÑO-DIAGRAMA_DE_CLASES-ITER&lt;iter&gt;.zargo  (Classes de Diseño)&lt;br /&gt;DISEÑO-DIAGRAMAS_DE_INTERACCION-&lt;/iter&gt;ITER&lt;iter&gt;&lt;iter&gt;.zargo (Diagramas de secuencia y comunicacion[colaboración])&lt;/iter&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;DISEÑO-MODELO_RELACIONAL_BASE_DE_DATOS-ITER&lt;iter&gt;.xml&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;DISEÑO-PLAN_DE_PRUEBAS-ITER&lt;iter&gt;.doc&lt;/iter&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;IMPL (Linea base de implementación)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;IMPL-BASE_DE_DATOS-ITER&lt;iter&gt;.sql (Dump de la base de datos)&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;SRC (Código fuente)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;PRUEBAS (Linea base de pruebas)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;PRUEBAS-PRUEBAS_DEL_SISTEMA-ITER&lt;iter&gt;.doc&lt;/iter&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ENTREGA (Linea base de entrega)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ENTREGA-LICENCIA-ITER&lt;iter&gt;.txt          &lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;ENTREGA-MANUAL_DE_INSTALACION-ITER&lt;iter&gt;.doc&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;ENTREGA-MANUAL_DE_ADMINISTRACION-ITER&lt;iter&gt;.doc&lt;br /&gt;&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;ENTREGA-MANUAL_DE_USUARIO-ITER&lt;iter&gt;.doc&lt;/iter&gt;&lt;/li&gt;&lt;li&gt;ENTREGA-NOTAS_DE_LA_ENTREGA-ITER&lt;iter&gt;.txt&lt;/iter&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;tags(Directorio de marcas de desarollo)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;iteraciones (Cada vez que se termina una iteración se hace una copia del trunk aquí, marcada yyyymmdd_iterITER)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;releases  (Cada vez que se lanza una versión del producto se hace una copia del tag de iteración correspondiente aquí yyyymmdd_releaseRELEASE)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;branches (Directorio de variantes del proyecto)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Puedes descargar la estructura &lt;a href="http://www.opendesarrollo.cl/leo/skel_svn_leobarrientosc.zip"&gt;aqui,&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Haz checkout de tu repositorio descomprime la carpeta en tu copia de trabajo y haz commit. Yo uso subEclipse, RapidSvn y subversion por terminal.&lt;br /&gt;&lt;br /&gt;Espero les sirva.&lt;br /&gt;&lt;br /&gt;Si tienes feedback deja comentarios o me escribes a lbarrientos@opensistemas.com.&lt;br /&gt;&lt;br /&gt;Suerte!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-219636322738961083?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/219636322738961083/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=219636322738961083' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/219636322738961083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/219636322738961083'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/11/estructura-de-svn-para-proyectos-de.html' title='Estructura de SVN para Proyectos de Software'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-4982427033711225625</id><published>2007-09-04T19:17:00.000-07:00</published><updated>2007-09-04T19:48:04.017-07:00</updated><title type='text'>Orientación a objetos y Bases de Datos</title><content type='html'>Si hay algo que funciona en el software son las bases de datos relacionales, si bien tienen un caracter absolutamente estructurado son ampliamente usadas en aplicaciones orientadas a objetos y allí viene un gran problema: La magia de la orientación a objetos se rompe en la creación de objetos - en este caso en obtener un objeto desde una base de DATOS; esta labor la realiza la Persistencia. Persistencia es el concepto que se debe usar en orientación a objetos pues las BD quedan fuera de su alcance.&lt;br /&gt;&lt;br /&gt;La persistencia es la encargada de devolver y perpetuar objetos de un determinado tipo desde/hacia los negocios; el problema es hacer depender  fuertemente nuestra elegante - no acoplada - indiferente aplicación OO a mecanismos puramente estructurados y enfoncado en los datos; si necesita datos desde su BD que la persistencia crée los objetos y usted los usa como objetos propiamente tal; objetos, objetos, objetos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es completamente sugerible aislar estos mecanismos en una capa de persistencia (Nota: Use JPA - HIBERNATE - Invente una capa de persistencia), sería ingenuo conectarse y consultar a una BD desde cualquier parte, tal como una vista html por ejemplo - de hecho es una excelente forma de saber a quien no contratar. Muchas veces me he encontrado en sistemas web donde se conectan donde se les ocurre sin usar ninguna separación haciendo un desastre el mantenimiento, pero dándome mucho trabajo.&lt;br /&gt;&lt;br /&gt;Definitivamente el software libre nos sirve para mirar cómo lo hicieron otros para mejorar nuestros sistemas o mejor aún reutilizar y aportar; capas de persistencia como Hibernate o JPA son un excelente forma de aprender esta abstracción de traer objetos cargados desde la persistencia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-4982427033711225625?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/4982427033711225625/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=4982427033711225625' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4982427033711225625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4982427033711225625'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/09/orientacin-objetos-y-bases-de-datos.html' title='Orientación a objetos y Bases de Datos'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-318093063640444149</id><published>2007-09-03T09:45:00.000-07:00</published><updated>2007-09-03T10:48:06.593-07:00</updated><title type='text'>Patrón estado</title><content type='html'>Desde un tiempo a esta parte he llegado a la conclusión que el software nunca se termina de hacer y creer que con un proceso X,Y o Z se tendrá  "The definitive software" es absolutamente falso. En base a esto la vuelta de tuerca es estar preparado y siempre listo (Sí, soy Scout) para los cambios que de seguro ocurrirán en nuestro diseño, para ello  - y tal como mi gran profesor Nelson Medinilla me enseñó -  hay que agregar "Ambiguedad" al diseño pues es muy comprometedor nombrar un método de forma cerrada, por ejemplo: "calcularTasas" - es mejor usar "calcular" o mejor "operar" por que si hay cambios los metemos dentro de un método que está preparado para ser extendido en su funcionalidad.&lt;br /&gt;&lt;br /&gt;Siempre es buena práctica encapsular lo que varía y una fuente de variación en el comportamiento de una classe es su estado - la otra fuente que se me viene a la cabeza es el tipo que se soluciona con el Patrón Estrategia - ¿Adivinen qué? Existe un patrón llamado estado.&lt;br /&gt;&lt;br /&gt;La idea del patrón estado es encapsular - aislar las operaciones que dependan del estado o que se pueden graficar en una máquina de estados. &lt;br /&gt;&lt;br /&gt;Supongamos una clase Impresora , los estados serían : ImpresoraApagada - ImpresoraImprimiendo - ImpresoraEsperando - ImpresoraLimpiandose, la operación de ejemplo que depende del estado sería - en un principio -  imprimir o mejor aún la más ambigua "operar()"; luego a alguien se le ocurrirá algún chequéo de tinta antes de imprimir.&lt;br /&gt;&lt;br /&gt;Seguramente algien podría hacer funcionar esta clase simplemente con un switch dentro de imprimir, pero el problema viene cuando deseas ampliar los estados y sus transiciones; necesariamente debes intervenir el switch y agregar esta nueva opción.&lt;br /&gt;&lt;br /&gt;La solución elegante es "encapsular lo que varía" y "favorecer la composicion por sobre la herencia", así pues tenemos la Clase impresora con un atributo llamado EstadoActual, es este atributo el que vamos cambiando y es de tipo EstadoImpresora - que es una clase abstracta o interface si así lo quieren.&lt;br /&gt;&lt;br /&gt;Al diseñar la clase Impresora podríamos crearla con un estado por defecto e implementar los cambios de estado dentro de la misma clase o en cada clase estado definiendo el siguiente estado cuando el caso lo amerite; para este ejemplo el cambio automático de estado con una máquina de estados no lo considero por que me cae muy mal Craig Larman.&lt;br /&gt;&lt;br /&gt;Classe:&lt;br /&gt; Nombre: Impresora&lt;br /&gt; Atributos: EstadoImpresora estadoActual &lt;br /&gt; Metodos: imprimir()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;a href="http://www.opendesarrollo.cl/leo/ThestatePattern.zip"&gt;Descargar el código aca&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-318093063640444149?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/318093063640444149/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=318093063640444149' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/318093063640444149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/318093063640444149'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/09/patrn-estado.html' title='Patrón estado'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-594840959876356646</id><published>2007-05-22T14:09:00.000-07:00</published><updated>2007-05-22T14:19:47.419-07:00</updated><title type='text'>Patrón Strategy (Estrategia)</title><content type='html'>Este patrón se llama estrategia y sirve básicamente para cambiar un algoritmo que una classe implementa.&lt;br /&gt;&lt;br /&gt;En el ejemplo en código, se crea una objeto banda que tiene un atributo objeto integrantes, pues bien, supongamos que ese objeto integrantes es un objeto que se pueda intercambiar fácilmente al crear este objeto banda y pasándole el objeto integrantes correspodiente al tipo de banda que queremos crear.&lt;br /&gt;&lt;br /&gt;la clase IntegrantesXXXXXXXXX hace la implementación adecuada.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opendesarrollo.cl/leo/strategyPattern.zip"&gt;Acá va el código, have fun!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-594840959876356646?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/594840959876356646/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=594840959876356646' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/594840959876356646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/594840959876356646'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/05/patrn-strategy-estrategia.html' title='Patrón Strategy (Estrategia)'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-3041784037889856949</id><published>2007-05-03T12:40:00.000-07:00</published><updated>2007-05-03T12:52:18.462-07:00</updated><title type='text'>Patrón Factory</title><content type='html'>Este es uno de mis patrones favoritos, se llama Factory y la idea es que exista una clase Factory que devuelve un objeto con las características propias de ese factory.&lt;br /&gt;&lt;br /&gt;En el ejemplo puedes ver que se necesitan crear objetos banda (de música Rock, Jazz, etc.) entonces se usa una clase JazzBandFactory que devuelve un objeto Banda con el atributo estilo con valor "Jazz" a través del método make() que es llamado desde una clase Factory abstracta.&lt;br /&gt;&lt;br /&gt;El truco es que la clase abstracta tiene un método abstracto, entonces al llamar a ese método abstracto se usa el implementado por la subclase JazzBandFactory.&lt;br /&gt;&lt;br /&gt;Así se genera una aplicación lista para implementarse, simplemente ante la necesidad de crear un nuevo tipo de banda, creamos una classe xxxxxxxxxFactory que crea y setéa un objeto banda de la manera que sea necesaria.&lt;br /&gt;&lt;br /&gt;A nivel de código sería :&lt;br /&gt;&lt;br /&gt;   JazzBandFactory productorJazz = new JazzBandFactory();&lt;br /&gt;   Band banda = productorJazz.create();  //Este es la llamada al método de la Clase Abstracta Padre, este método llama al abstracto make que es implementado por JazzBandFactory.&lt;br /&gt;&lt;br /&gt;  // Aquí ya el objeto banda tiene los valores que le da JazzbandFactory en el metodo make&lt;br /&gt;&lt;br /&gt; Descarga el código Java acá &lt;a href="http://www.opendesarrollo.cl/leo/factory.zip"&gt;Factory.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se puede usar en miles de casos, por ejemplo en perfiles de usuario, botones de un determinado estilo, etc, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-3041784037889856949?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/3041784037889856949/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=3041784037889856949' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3041784037889856949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3041784037889856949'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/05/patrn-factory.html' title='Patrón Factory'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-5023207234415349661</id><published>2007-05-03T12:29:00.000-07:00</published><updated>2007-05-03T12:39:47.804-07:00</updated><title type='text'>Patrón decorator</title><content type='html'>Ahora pongo el código en Java del patrón Decorator, por que los comentarios me dicen que no se entiende. &lt;a href="http://www.opendesarrollo.cl/leo/Decorator.zip"&gt; Decorator.zip &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-5023207234415349661?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/5023207234415349661/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=5023207234415349661' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5023207234415349661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5023207234415349661'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/05/patrn-decorator.html' title='Patrón decorator'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-3743453534229410278</id><published>2007-04-23T12:33:00.000-07:00</published><updated>2007-04-23T13:19:06.305-07:00</updated><title type='text'>Patrones de diseño: Decorator</title><content type='html'>Hola bienvenido a mi serie de post que he llamado "Patrón de diseño en 10 minutos", hoy comienzo por el patrón Decorator.&lt;br /&gt;&lt;br /&gt;La idea de estos post no es dar tanto ejemplo en código si no explicarlo en el lenguaje humano lo más claro posible, pues así quedan más claros los conceptos. Si no resulta me comprometo a poner ejemplos - así les obligo a dejar comentarios.&lt;br /&gt;&lt;br /&gt;Vamos, antes les debo recordar que en general se usan interfaces, clases abstractas y métodos abstractos para determinar los comportamientos de los objetos.&lt;br /&gt;&lt;br /&gt;Es un poco dificil de entender esto de comportamiento en los objetos, pues mucha gente simplemente agrupa una serie de métodos desde sus "librerías"; espero ayudar a que quede claro que el camino de la orientación a objetos va por otro lado.&lt;br /&gt;&lt;br /&gt;Patrón decorador:&lt;br /&gt;&lt;br /&gt;   Supone que vas a un hotel, cada noche de hotel en habitación compartida tiene un precio base de 100$.&lt;br /&gt;&lt;br /&gt;   A mitad de la noche se te ocurre bajar a la piscina y la entrada vale $5.&lt;br /&gt;&lt;br /&gt;   Luego de la piscina pides comida (en tu habitación), esta comida tiene un precio de $10.&lt;br /&gt;&lt;br /&gt;   ¿Cuanto sería el total? , sería un poco dificil de obtener datos al tener una array o alguna estructura de todos los objetos pues estos objetos son de distintas clases y prbablemente de distintos métodos.&lt;br /&gt;&lt;br /&gt;   Cual es la solución, pues el patrón decorador, simplemente cada cosa nueva que pides tiene un atributo que es un objeto del precio base que se va actualizando y cuando creas el objeto "adicional" simplemente le vas pasando ese objeto, de esta forma para obtener la cuenta la obtienes desde el último objeto "adicional" creado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   Algo así como (en pseudo código):&lt;br /&gt;&lt;br /&gt;   cuenta = new Habitacion(); // existe el método costo que devuelve 100.&lt;br /&gt;   cuenta = new TicketPiscina(cuenta); //existe el método costo que devuelve this.cuenta.getCosto() + this.costo() o sea 100 + 5&lt;br /&gt;   cuenta = new ComidaHabitacion(cuenta); //existe el método costo que devuelve this.cuenta.getCosto() + this.costo() o sea 105 + 10&lt;br /&gt;&lt;br /&gt;   Y para obtener el precio sería simplemente : precio = cuenta.costo();&lt;br /&gt;&lt;br /&gt;   Vamos, ¿se entiende?&lt;br /&gt;&lt;br /&gt;   Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-3743453534229410278?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/3743453534229410278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=3743453534229410278' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3743453534229410278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3743453534229410278'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/04/patrones-de-diseo-decorator.html' title='Patrones de diseño: Decorator'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-3419424227634929626</id><published>2007-04-21T04:43:00.000-07:00</published><updated>2007-04-21T04:59:06.485-07:00</updated><title type='text'>¿Para qué trabajo?</title><content type='html'>Ayer conversando  me dí cuenta lo fácil que es para mi a veces cometer el error de pensar en el trabajo como mi actividad principal. Pues el trabajo no es mi actividad principal, a pesar de que ahora trabajo desde las 7:30 hasta las 16:00 y luego voy a clases del Master hasta las 21:00; todo mi día es acerca de Software.&lt;br /&gt;&lt;br /&gt;Parece ser la desgracia de trabajar en lo que te gusta...&lt;br /&gt;&lt;br /&gt;Mi actividad principal es aprender y compartir mi vida con mi mujer,así aprendo de muchas cosas, aprendo a ser mejor, a escuchar, observo y repaso en mi cabeza mis errores.&lt;br /&gt;&lt;br /&gt;Simplemente, tenemos el derecho de haber cometido errores y hay que aprender de ellos para que no se vuelvan a repetir. Sin duda alguna he cometido errores por pensar que mi actividad principal es el trabajo - mi desarrollo profesional.&lt;br /&gt;&lt;br /&gt;Ahora que estoy terminando mi meta de tener un master estoy buscando nuevos desafíos, esta vez con las cosas claras de saber cual es mi actividad principal.&lt;br /&gt;&lt;br /&gt;En el siguiente post si que hablo de software!.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-3419424227634929626?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/3419424227634929626/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=3419424227634929626' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3419424227634929626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3419424227634929626'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/04/para-qu-trabajo.html' title='¿Para qué trabajo?'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-4951150650284349793</id><published>2007-04-20T01:32:00.000-07:00</published><updated>2007-04-20T01:33:37.458-07:00</updated><title type='text'>Dude!, the american way.</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fJuNgBkloFE"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/fJuNgBkloFE" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-4951150650284349793?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/4951150650284349793/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=4951150650284349793' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4951150650284349793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4951150650284349793'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/04/dude-american-way.html' title='Dude!, the american way.'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-3743878547474437992</id><published>2007-03-27T14:31:00.000-07:00</published><updated>2007-03-27T15:09:44.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Requisitos'/><category scheme='http://www.blogger.com/atom/ns#' term='management.'/><title type='text'>Requisitos, Requisitos, Requisitos.</title><content type='html'>Y lo que antes en negocios era ubicación, ubicación, ubicación es nuestro talón de Aquiles en Software: Requisitos, requisitos, requisitos.&lt;br /&gt;&lt;br /&gt;En realidad abstrayéndonos de la implementación y pensando en términos de reglas de negocio es el mayor riesgo y el responsable del fracaso de la mayoría de los proyectos.&lt;br /&gt;&lt;br /&gt;¿Que pasa con los requisitos?, pues que son un contrato y si el sistema hace lo que los requistos dicen pues estamos bien (no iremos presos), siempre y cuando que los requisitos y sus especificaciones documentadas sean aprobadas por el cliente.&lt;br /&gt;&lt;br /&gt;De esto surgen dos escenarios negativos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Que el cliente esperaba más de lo que el sistema hace.&lt;/li&gt;&lt;li&gt;Que el sistema no implementa los requisitos.&lt;/li&gt;&lt;/ol&gt;    ¿Que errores de dirección permiten que ocurra esto? pues en lo que siempre fallan  quienes se centran en la tecnología y no en las reglas de negocio de lo que estamos desarrollando - cosa que alguna vez me ocurre:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No existe gestión de espectativas: El cliente normalmente no entiende hasta donde llega el proyecto, se debe definir un alcance: ¿Qué es el proyecto? ¿Que no es el proyecto?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;No existe un listado de características y de funcionalidades formal del sistema: Si no hay documentos no hay nada que hacer.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Que los documentos de requisitos están en lenguaje técnico que el cliente no entiende.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Que no se da la importancia a la gestión de la configuración: Un gestor de configuración es casi un médico heroe, se encarga de controlar los artefactos producidos,sus cambios, versiones, su archivo, su coherencia, etc; no tener un gestor de configuración - o no hacer las actividades de gestión de configuración - es conducir un automovil con los ojos cerrados.&lt;/li&gt;&lt;/ul&gt;Y yo que creía que el gestor de configuración era quien configuraba las máquinas. ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-3743878547474437992?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/3743878547474437992/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=3743878547474437992' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3743878547474437992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/3743878547474437992'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/03/requisitos-requisitos-requisitos.html' title='Requisitos, Requisitos, Requisitos.'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-8419957442812604938</id><published>2007-03-13T06:06:00.000-07:00</published><updated>2007-03-13T06:16:36.870-07:00</updated><title type='text'>Mis errores históricos</title><content type='html'>Hello world!! (es un clásico).&lt;br /&gt;&lt;br /&gt;   Me agrada bastante esto de registrar mis errores en Proyectos de Software, pues así no vuelven a ocurrrir, aquí va mi lista a Marzo 2007.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Error: No dar visibilidad al Proyecto ni a mi trabajo.&lt;/li&gt;&lt;li&gt;Error: No hacer pruebas unitarias de las classes.&lt;/li&gt;&lt;li&gt;Error: No actualizar las Cartas Gantt.&lt;/li&gt;&lt;li&gt;Error: Trabajar sólo.&lt;/li&gt;&lt;li&gt;Error: No controlar el código (svn).&lt;/li&gt;&lt;li&gt;Error: No programar pensando en los servicios, si no en un implementación.&lt;/li&gt;&lt;li&gt;Error: No pensar antes de diseñar, ni pensar en escribir código.&lt;/li&gt;&lt;li&gt;Error: Perderme entre tantos diagramas de secuencia.&lt;/li&gt;&lt;li&gt;Error: No haber usado Tarjetas CRC antes.&lt;/li&gt;&lt;li&gt;Error: No saber PMBOK antes.&lt;/li&gt;&lt;li&gt;Error: No preparar mis classes para ser re utilizables.&lt;/li&gt;&lt;li&gt;Error 2005 : No aplicar antes arquitectura de 3 capas.&lt;/li&gt;&lt;li&gt;Error 2005 : Trabajar directamente en el sitio de explotación.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;¿Cuáles son los tuyos?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-8419957442812604938?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/8419957442812604938/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=8419957442812604938' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/8419957442812604938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/8419957442812604938'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/03/mis-errores-histricos.html' title='Mis errores históricos'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-64235269340617061</id><published>2007-02-16T12:46:00.000-08:00</published><updated>2007-02-16T13:16:05.190-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Casos de Uso'/><category scheme='http://www.blogger.com/atom/ns#' term='Requisitos'/><category scheme='http://www.blogger.com/atom/ns#' term='Calidad'/><category scheme='http://www.blogger.com/atom/ns#' term='Diseño'/><title type='text'>Listado de características v/s Casos de Uso.</title><content type='html'>Se supone que cuando empezamos en un desarrollo tenemos un listado de características con lo que debe hacer el sistema y luego hacemos nuestros Casos de Uso. El tema es ¿Cuál debo hacer?, ¿Es mejor cumplir una característica completa? o ¿enfocarnos en los casos de uso?, la respuesta es "&lt;span style="font-weight: bold;"&gt;depende&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Plantéo el siguiente escenario:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  La aplicación debe&lt;/span&gt; :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enviar un SMS que indique tiempo al cual se encuentra un Autobus desde un paradero al recibir un SMS con el siguiente formato: "Paradero LineadeAutoBus"   Ej.: 105 591&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;   Esto de "la aplicación debe" son nuestro Listado de Características.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Y como consecuencia de este Listado de Características obtenemos los famosos Casos de Uso, que serán nuestra compañía el resto del desarrollo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Los Casos de Uso son:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_QBF17NBXFTU/RdYbzR0yKLI/AAAAAAAAABA/Eb24j5ZOu8c/s1600-h/CasosDeUsoSMS.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_QBF17NBXFTU/RdYbzR0yKLI/AAAAAAAAABA/Eb24j5ZOu8c/s400/CasosDeUsoSMS.png" alt="" id="BLOGGER_PHOTO_ID_5032240201405180082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;¿Con que partimos para desarrollar?, pues tenemos las 2 alternativas:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Realizar la Característica 1.&lt;/li&gt;&lt;li&gt;Realizar un caso de uso.&lt;/li&gt;&lt;/ol&gt;Para decidir se considera el nivel de visibilidad comprometido, si el cliente tiene un poco de paciencia podemos partir por los casos de uso; si no partimos con la característica.&lt;br /&gt;&lt;br /&gt;Estoy seguro que el desarrollo con casos de uso nos permitirá un diseño elegante desde un primer momento, pero que a lo mejor tardaremos un poco más en mostrar algo completo - recordemos que los clientes quieren resultados, no diagramas de Ingeniería que sólo nosotros entendemos - debemos hablarle en su lenguaje.&lt;br /&gt;&lt;br /&gt;Si tenemos un poco más de tiempo conviene comenzar con los Casos de Uso, si no tratemos más "visual" el entregable y realizemos primero alguna de las características. Finalmente el producto tendrá la calidad de hacer lo que tiene que hacer, de haber aplicado principios de OO y la elegancia de los patrones de diseño.&lt;br /&gt;&lt;span style="font-style: italic;"&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/8888861936546733138-64235269340617061?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/64235269340617061/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=64235269340617061' title='24 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/64235269340617061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/64235269340617061'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/02/listado-de-caractersticas-vs-casos-de_16.html' title='Listado de características v/s Casos de Uso.'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_QBF17NBXFTU/RdYbzR0yKLI/AAAAAAAAABA/Eb24j5ZOu8c/s72-c/CasosDeUsoSMS.png' height='72' width='72'/><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-8767360961384979925</id><published>2007-02-15T14:31:00.000-08:00</published><updated>2007-02-16T05:55:12.155-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Calidad'/><category scheme='http://www.blogger.com/atom/ns#' term='Diseño'/><title type='text'>Cultura de Prototipos/Maquetas</title><content type='html'>Como todos sabemos - pero nos cuesta aceptarlo -  la única constante en Desarrollo de Software es el cambio.&lt;br /&gt;&lt;br /&gt;El maldito cambio, simplemente debemos ser más inteligentes: Tener en la cabeza que las cosas cambian y que nuestra obsesión por implementar funcionalidad lo antes posible con classes perfectas nos lleve a codificar de más.&lt;br /&gt;&lt;br /&gt;¡Pero un momento!, ¿codificar de más?, si - &lt;span style="font-weight: bold;"&gt;aunque me costó creerlo mientras antes se empieza a escribir código más tarde finalizaremos el proyecto&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;¿Por qué?, por que nuestra obsesión no considera que los cambios ocurrirán y que el cliente simplemente quería otra cosa, o se ajustó esta regla de negocio y tal, y tal, y tal, y tal .......&lt;br /&gt;&lt;br /&gt;Solución: &lt;span style="font-weight: bold;"&gt;Cultura de Prototipo.&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Conversamos con el cliente.&lt;/li&gt;&lt;li&gt;Formalizamos lo conversado en una Lista de Características.&lt;/li&gt;&lt;li&gt;Revisamos con el cliente esta lista.&lt;/li&gt;&lt;li&gt;Especificamos los requisitos de las características que tienen mayor prioridad.&lt;/li&gt;&lt;li&gt;Hacemos un protipo - sin funcionalidad.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Revisamos con el cliente el Prototipo/Maqueta&lt;/span&gt; (que tardamos a lo más 2 horas en hacerlo con HTML o drag&amp;drop), &lt;span style="font-weight: bold;"&gt;revisamos la Lista de Características&lt;/span&gt; y así nos aseguramos que vamos bien con el cliente.&lt;/li&gt;&lt;li&gt;Repetimos en cada iteración que sea necesario.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Continuamos con los paso habituales de Desarrollo Iterativo e Incremental.&lt;/li&gt;&lt;/ol&gt;Se ve muy simplista, estoy de acuerdo, lo importante es que ya estamos listos para:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Asegurar que el sistema &lt;span style="font-weight: bold;"&gt;hará lo que el cliente quiere&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Aplicar &lt;span style="font-weight: bold;"&gt;principios de OO&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Aplicar &lt;span style="font-weight: bold;"&gt;patrones de Diseño&lt;/span&gt; y le damos caracter de Ingeniería a la obra de arte.&lt;/li&gt;&lt;/ol&gt;                                                En ese orden, funciona créanme!.&lt;br /&gt;&lt;br /&gt;Con un gran amigo aprendimos que no hay que mostrar los diagramas de classes, ni nada parecido al cliente. Le mostramos los artefactos en su propio lenguaje: Un listado de características en el cual identifique cláramente lo que quería.&lt;br /&gt;&lt;br /&gt;A pesar de todo esto siempre surgirán nuevos cambios, pero ya tendremos una arquitectura extensible y no hemos perdido horas de trabajo de implementación - &lt;span style="font-weight: bold;"&gt;No existen malos equipos, sólo malos líderes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;¿Si, te parece que eso lo implementemos en la próxima versión?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-8767360961384979925?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/8767360961384979925/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=8767360961384979925' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/8767360961384979925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/8767360961384979925'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/02/cultura-de-prototipos.html' title='Cultura de Prototipos/Maquetas'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-5643330251881641949</id><published>2007-02-15T13:49:00.000-08:00</published><updated>2007-02-15T14:20:21.918-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pruebas'/><category scheme='http://www.blogger.com/atom/ns#' term='Calidad'/><category scheme='http://www.blogger.com/atom/ns#' term='Costos'/><title type='text'>Hacer pruebas es lo más ineficiente, pero peor es nada!.</title><content type='html'>Si es verdad, hacer pruebas es lo más ineficiente para controlar la Calidad de nuestro software. ¿Por qué?, muy simple: &lt;span style="font-weight: bold;"&gt;Los números no mienten&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Del 100% de los errores, se pueden encontrar tan sólo el 7%  a través del compilador-Intérprete.&lt;br /&gt;&lt;br /&gt;Algunas opiniones dicen que si como desarrolladores dependemos del Debug y el Compilador para encontrar errores - manifestados como Fallos o Defectos - en realidad es porque no sabemos desarrollar.&lt;br /&gt;&lt;br /&gt;La cosa es : "&lt;span style="font-weight: bold;"&gt;Mientras antes observemos la calidad, más posibilidades se tiene de encontrar errores&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Algunos datos empíricos gringos:&lt;br /&gt;&lt;br /&gt;         La distribución de defectos es:&lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;56% en Especificación de requisitos.&lt;/li&gt;&lt;li&gt;27% en Diseño.&lt;/li&gt;&lt;li&gt;7% en Implementación.&lt;/li&gt;&lt;li&gt;10% Otros.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;Los errores más importantes los cometemos al especificar requisitos, debemos recordar que una aplicación no está libre de errores si compila; sino que al no hacer lo que la aplicación debe hacer siguiendo las reglas de negocio.&lt;br /&gt;&lt;br /&gt;No es buena práctica esperar a realizar las pruebas para comprobar la calidad, puesto que simplemente descubriremos menos errores.&lt;br /&gt;&lt;br /&gt;Por otra parte los costos al finalizar un Proyecto y encontrar errores en cada Flujo de Trabajo es:&lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Especificación de requisitos : 82%&lt;/li&gt;&lt;li&gt;Diseño: 13%&lt;/li&gt;&lt;li&gt;Implementación: 1% (Si, 1 %).&lt;/li&gt;&lt;li&gt;Otros: 4%.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Imagínense que están entregando el Proyecto y no hace lo que se supone que debería hacer: ¿Quién está a cargo de especificar requisitos en tu equipo de trabajo?  ....&lt;br /&gt;&lt;br /&gt;Ahora si queremos corregir los errores, los costos son exponenciales mientras más tarde nos preocupemos de la calidad:&lt;br /&gt;&lt;br /&gt;  En un proyecto mediano&lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Corregir errores anteriores  mientras Analizamos cuesta en promedio 200 Dólares.&lt;/li&gt;&lt;li&gt;Corregir errores anteriores  mientras Diseñamos cuesta en promedio 500 Dólares.&lt;/li&gt;&lt;li&gt;Corregir errores anteriores mientras Codificamos cuesta en promedio 1200 Dólares.&lt;/li&gt;&lt;li&gt;Corregir errores anteriores  mientras se hacen las Pruebas cuesta en promedio 5000 Dólares.&lt;/li&gt;&lt;li&gt;Corregir errores anteriores estando en Operación cuesta en promedio 15000 Dólares.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;De verdad las pruebas no son suficientes y no son sinónimo de Control de Calidad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-5643330251881641949?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/5643330251881641949/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=5643330251881641949' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5643330251881641949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5643330251881641949'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/02/hacer-pruebas-es-lo-ms-ineficiente-pero.html' title='Hacer pruebas es lo más ineficiente, pero peor es nada!.'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-5683755266061307247</id><published>2007-02-15T13:21:00.000-08:00</published><updated>2007-02-15T13:49:12.892-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patrones'/><category scheme='http://www.blogger.com/atom/ns#' term='Implementación'/><category scheme='http://www.blogger.com/atom/ns#' term='Try'/><category scheme='http://www.blogger.com/atom/ns#' term='php5'/><category scheme='http://www.blogger.com/atom/ns#' term='Catch'/><category scheme='http://www.blogger.com/atom/ns#' term='Diseño'/><title type='text'>Como tener Log en PHP5 y no morir en el intento</title><content type='html'>Log?,&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Classe: Log&lt;br /&gt;* Responsabilidades: Escribe los Logs de usuario en la carpeta log/&lt;br /&gt;* Colaboradores: No tiene.&lt;br /&gt;* Patron: Singleton.&lt;br /&gt;* Uso Principal: Log::getInstance()-&gt;addEntry('Mensaje','Classe que invoca','Metodo que invoca',$editMode);&lt;br /&gt;*&lt;br /&gt;* @author    Leo Barrientos C. leobarrientos@opendesarrollo.cl&lt;br /&gt;* @copyright GNU&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;Esta classe genera un log por día en la carpeta log y en modo testMode=true guarda el archivo añadiéndole un .test al final.&lt;br /&gt;&lt;br /&gt;Además usa un patrón singletón por lo que la llamada es con el famoso "::" y muy simple:&lt;br /&gt;&lt;br /&gt;include_once("Log.class.php");&lt;br /&gt;Log::getInstance()-&gt;addEntry('Test','No class','No Method', false);&lt;br /&gt;&lt;br /&gt;El diagrama de Classes es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_QBF17NBXFTU/RdTPih0yKKI/AAAAAAAAAA0/2LJdJeCxxDY/s1600-h/Log_Rev_1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_QBF17NBXFTU/RdTPih0yKKI/AAAAAAAAAA0/2LJdJeCxxDY/s400/Log_Rev_1.png" alt="" id="BLOGGER_PHOTO_ID_5031874875781949602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Puedes descargar el archivo haciendo &lt;a href="http://www.opendesarrollo.cl/leo/Log.class.zip"&gt;click(Con el mouse) aqui&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-5683755266061307247?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/5683755266061307247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=5683755266061307247' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5683755266061307247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/5683755266061307247'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/02/como-tener-log-en-php5-y-no-morir-en-el.html' title='Como tener Log en PHP5 y no morir en el intento'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_QBF17NBXFTU/RdTPih0yKKI/AAAAAAAAAA0/2LJdJeCxxDY/s72-c/Log_Rev_1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-4517785709188640886</id><published>2007-02-15T12:07:00.000-08:00</published><updated>2007-02-15T13:07:48.592-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Principios'/><category scheme='http://www.blogger.com/atom/ns#' term='Orientación a objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='Diseño'/><title type='text'>Principio de Single Responsibility</title><content type='html'>¿Qué sucede cuando tenemos alguna classe y unos de sus métodos no "suena bien"?, pues es tiempo de aplicar los principios de la orientación   a objetos.&lt;br /&gt;&lt;br /&gt;En esta oportunidad mostraré un ejemplo del Principio de Single Responsability(SRP).&lt;br /&gt;&lt;br /&gt;Supongamos que tenemos una classe Almacen de un sistema de Inventario de Productos, el diagrama de Classes inicial se muestra en la figura 1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_QBF17NBXFTU/RdTCKB0yKHI/AAAAAAAAAAY/-ZM-R6LM1zY/s1600-h/Almacen_rev1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_QBF17NBXFTU/RdTCKB0yKHI/AAAAAAAAAAY/-ZM-R6LM1zY/s320/Almacen_rev1.png" alt="" id="BLOGGER_PHOTO_ID_5031860161223993458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; Figura 1: Diagrama de Clases Rev 1.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Pues bien, vamos a aplicar "elegancia" al Diagrama de Classes aplicando el SRP llenando la siguiente tabla:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Classe&lt;/span&gt;: Almacén&lt;br /&gt;&lt;br /&gt;El almacén  __________________&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;En el espacio vamos agregando los métodos y acomodando el lenguage a ver si tiene sentido en las reglas del negocio de nuestra aplicación.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;                    Classe&lt;/span&gt;: Almacén&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify; margin-left: 80px;"&gt;&lt;li&gt;En el almacén se puede agregar un Item.&lt;/li&gt;&lt;li&gt;Del almacén se puede remover un Item.&lt;/li&gt;&lt;li&gt;El almacén imprime el Inventario.&lt;/li&gt;&lt;li&gt;El almacén puede despachar envíos.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;¿Hay alguna frase que no tenga sentido con lo que entendemos que hace un almacén? Claro que si:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;El &lt;span style="font-weight: bold;"&gt;almacén&lt;/span&gt; no imprime un inventario, lo que hace es &lt;span style="font-weight: bold; font-style: italic;"&gt;devolver&lt;/span&gt; la información de todos los items que están en él o sea el &lt;span style="font-weight: bold;"&gt;Inventario&lt;/span&gt;; o mejor aún una &lt;span style="font-weight: bold;"&gt;lista de Items&lt;/span&gt;(List, Collection o array, lo que sea.).&lt;/li&gt;&lt;li&gt;El almacén no &lt;span style="font-style: italic; font-weight: bold;"&gt;despacha&lt;/span&gt; &lt;span style="font-weight: bold; font-style: italic;"&gt;envíos&lt;/span&gt;, lo que si despacha envíos es un &lt;span style="font-weight: bold; font-style: italic;"&gt;Despachador&lt;/span&gt; que solicita ciertos &lt;span style="font-weight: bold;"&gt;items&lt;/span&gt; al &lt;span style="font-weight: bold;"&gt;almacén&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;Con esto, reconocemos los sustantivos y acciones y actualizamos nuestro Diagrama.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_QBF17NBXFTU/RdTIdx0yKJI/AAAAAAAAAAs/uQUnT-NmKWw/s1600-h/Almacen_rev2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_QBF17NBXFTU/RdTIdx0yKJI/AAAAAAAAAAs/uQUnT-NmKWw/s400/Almacen_rev2.png" alt="" id="BLOGGER_PHOTO_ID_5031867097596176530" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; Figura 2: Diagrama de Clases Rev 2.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;Bueno, ahora revisemos si esto tiene sentido:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                       Classe&lt;/span&gt;: Almacén&lt;br /&gt;&lt;ul style="text-align: justify; margin-left: 80px;"&gt;&lt;li&gt;En el almacén se puede agregar un Item.&lt;/li&gt;&lt;li&gt;Del almacén se puede remover un Item.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;                       Classe&lt;/span&gt;: Despachador&lt;br /&gt;&lt;ul style="text-align: justify; margin-left: 80px;"&gt;&lt;li&gt;El despachador puede despachar envíos.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;                       Classe&lt;/span&gt;: Inventario&lt;br /&gt;&lt;ul style="margin-left: 80px;"&gt;&lt;li&gt;El Inventario se imprime.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Si, tiene sentido!.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;Ahora pseudo codifiquemos un test para ver si funciona:&lt;br /&gt;&lt;br /&gt;  Caso de Prueba: Imprimir el Inventario actual.&lt;br /&gt;&lt;br /&gt;     inventario = new Inventario();&lt;br /&gt;     inventario.imprimirInventario();&lt;br /&gt;     inventario = null;&lt;br /&gt;&lt;br /&gt;    Si funcionará , pues con UML definimos que el método imprimirInventario depende del método getItems del Almacén y recibirá correctamente el contenido actual del almacén.&lt;br /&gt;&lt;br /&gt;¿Comentarios?.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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/8888861936546733138-4517785709188640886?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/4517785709188640886/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=4517785709188640886' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4517785709188640886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4517785709188640886'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/02/principio-de-single-responsibility.html' title='Principio de Single Responsibility'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_QBF17NBXFTU/RdTCKB0yKHI/AAAAAAAAAAY/-ZM-R6LM1zY/s72-c/Almacen_rev1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8888861936546733138.post-4022537526899706468</id><published>2007-02-15T04:21:00.000-08:00</published><updated>2007-02-15T04:39:30.546-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='defectos'/><category scheme='http://www.blogger.com/atom/ns#' term='fallos'/><category scheme='http://www.blogger.com/atom/ns#' term='Calidad'/><title type='text'>Calidad: Defectos v/s Fallos</title><content type='html'>Muchas veces hablamos o escuchamos  "Hey, encontré estos errores en el sistema....", ante esto podemos hacer 2 cosas inmediatas :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Cuestionar nuestra existencia.&lt;/li&gt;&lt;li&gt;Agradecer, pues nuestro Software una vez corregido será mejor.&lt;/li&gt;&lt;/ol&gt;Creo que la mejor opción es la 2, sin embargo para llegar a esto hemos cometido un error muy grave : "Hemos permitido que un defecto se convierta en un Fallo".&lt;br /&gt;&lt;br /&gt;A modo de aclarar conceptos debo decir que un :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Error: Lo comete un humano durante el Proceso de Desarrollo.&lt;/li&gt;&lt;li&gt;Defecto: Es la consecuencia de un error.&lt;/li&gt;&lt;li&gt;Falla: Es un defecto no detectado y que no está eliminado.&lt;/li&gt;&lt;li&gt;Fallo: Defecto que se manifiesta durante la ejecución.&lt;/li&gt;&lt;li&gt;Incidente: Comportamiento no esperado.&lt;/li&gt;&lt;/ul&gt;Evidentemente la mejor forma de que no ocurran fallos es evitar escribir con errores que produzcan defectos. Para aumentar la calidad de nuestro producto artístico de  Ingeniería de Software debemos realizar un control estático; que en palabras simples no es que otra cosa que otro developer amigo revise el código (Si leerlo) y retroalimente tu trabajo.&lt;br /&gt;&lt;br /&gt;Está comprobado que la calidad del Producto software aumenta inmediatamente si los desarrolladores sabemos que nuestros artefactos serán revisados (Leidos, comentados) por otras personas, en lo llamado Control estático.&lt;br /&gt;&lt;br /&gt;Muchas personas relacionan la calidad del Producto con que pase las pruebas - Control dinámico - antes de entregarlo, error gigante!!!; el control estático es preventivo y es más eficiente  pues obliga inmediatamente a implementar buenas prácticas.&lt;br /&gt;&lt;br /&gt;La frase final de este Post es : " &lt;span style="font-weight: bold;"&gt;Preocuparse de evitar y corregir  los defectos antes que ocurran los fallos.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;¿Comentarios?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8888861936546733138-4022537526899706468?l=leobarrientosc.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leobarrientosc.blogspot.com/feeds/4022537526899706468/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8888861936546733138&amp;postID=4022537526899706468' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4022537526899706468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8888861936546733138/posts/default/4022537526899706468'/><link rel='alternate' type='text/html' href='http://leobarrientosc.blogspot.com/2007/02/calidad-defectos-vs-fallos.html' title='Calidad: Defectos v/s Fallos'/><author><name>Leo Barrientos C.</name><uri>http://www.blogger.com/profile/07452193898145869568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_QBF17NBXFTU/SOLI0O8AMsI/AAAAAAAAAIU/e4j2ywIUWgE/S220/2239781428_87716a869c.jpg'/></author><thr:total>2</thr:total></entry></feed>
