<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diario de Programación &#187; spring framework</title>
	<atom:link href="http://blog.chuidiang.com/tag/spring-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chuidiang.com</link>
	<description>Programación e informática en general</description>
	<lastBuildDate>Wed, 25 Jan 2012 23:17:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>¿Sopa de piedras o capitán araña?</title>
		<link>http://blog.chuidiang.com/2009/02/27/%c2%bfsopa-de-piedras-o-capitan-arana/</link>
		<comments>http://blog.chuidiang.com/2009/02/27/%c2%bfsopa-de-piedras-o-capitan-arana/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 15:31:35 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[anécdotas]]></category>
		<category><![CDATA[javahelp]]></category>
		<category><![CDATA[pragmatic programmer]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[sopa de piedras]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=515</guid>
		<description><![CDATA[&#160; T&#237;tulo un poco raro. &#191;qu&#233; es cada cosa?. La sopa de piedras hace referencia a una historia y una t&#233;cnica para conseguir las cosas, explicada en &#34;The pragmatic programmer&#34;. El capit&#225;n ara&#241;a hace referencia al dicho &#34;Capit&#225;n ara&#241;a, que a todos embarca y a todos enga&#241;a&#34;. En la historia de la sopa de piedras, [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>T&iacute;tulo un poco raro. &iquest;qu&eacute; es cada cosa?. La sopa de piedras hace referencia a una historia y una t&eacute;cnica para conseguir las cosas, explicada en &quot;<a href="http://www.chuidiang.com/chuwiki/index.php?title=The_Pragmatic_Programmer">The pragmatic programmer</a>&quot;. El <a href="http://www.1de3.com/portal/modules.php?name=News&amp;file=article&amp;sid=497">capit&aacute;n ara&ntilde;a</a> hace referencia al dicho &quot;Capit&aacute;n ara&ntilde;a, que a todos embarca y a todos enga&ntilde;a&quot;.</p>
<p>En la historia de la sopa de piedras, unos soldados entran en una aldea enemiga y todos los aldeanos se esconden con toda su comida. Los soldados, hambrientos y sin posibilidad de conseguir comida de los aldeanos, cogen una olla, la llenan con agua de r&iacute;o y unas piedras. Lo ponen todo al fuego y empiezan a comentar lo rica que estar&aacute; la sopa de piedras, t&iacute;pica de su pa&iacute;s. Los aldeanos, con curiosidad por una cosa tan extra&ntilde;a se acercan y preguntan por la famosa sopa de piedras. Los soldados comentan que es un plato riqu&iacute;simo, t&iacute;pico de su pa&iacute;s, pero que no va a estar del todo buena porque le falta un poquito de sal. Los aldeanos traen la sal y entonces los soldados comentan que, para que la sope est&eacute; perfecta, necesitar&iacute;a tambi&eacute;n unas patatas. Tras varias maniobras de estas, consiguen todos los condimentos para una sopa en condiciones (en cuanto sacan las piedras).</p>
<p>Seg&uacute;n se comenta en el libro <em>The pragmatic programmer</em>, esta es una forma de conseguir las cosas. Cuando quieres conseguir algo y no encuentras apoyos, lo mejor es empezarlo t&uacute; mismo hasta donde puedas y ense&ntilde;ar los resultados a los dem&aacute;s. De esta forma, es m&aacute;s f&aacute;cil que los dem&aacute;s est&eacute;n dispuestos a a&ntilde;adir su granito de arena que tener que hacer ellos todo el trabajo.</p>
<p>Hace alg&uacute;n tiempo <a href="http://rubendelafuente.es/">rub&eacute;n</a> puso un comentario en este blog indicando que <a href="http://blog.chuidiang.com/2009/01/26/buena-acogida-del-redmine-quizas-demasiada/#comment-1483">le gustaba mi t&eacute;cnica de marketing viral</a> para propagar las cosas entre mis compa&ntilde;eros de trabajo. Yo prefiero pensar que hago sopas de piedras. Que creo que es bueno usar <a href="http://www.chuidiang.com/chuwiki/index.php?title=Categor%C3%ADa:Spring_Framework">Spring Framework</a>, comienzo/modifco un proyecto para que use Spring Framework y le ense&ntilde;o a los dem&aacute;s como funciona y sus ventajas. Que creo que es bueno usar <a href="http://www.chuidiang.com/java/herramientas/javahelp/ejemplo-javahelp.php">Javahelp</a>, preparo la estructura por debajo, hago la ayuda de las primeras ventanas y ense&ntilde;o lo bonito que queda. Que creo que es bueno usar <a href="http://www.chuidiang.com/chuwiki/index.php?title=Redmine">redmine</a>, lo instalo, meto alg&uacute;n proyecto y lo ense&ntilde;o a la gente.</p>
<p>Pero claro, tambi&eacute;n est&aacute; la versi&oacute;n de mi compa&ntilde;ero de trabajo. Viene a decir algo as&iacute; como &quot;Empiezas las cosas hasta que ya no se puede volver atr&aacute;s y luego no nos queda m&aacute;r remedio que seguir el camino que has empezado&quot;. Vaya, lo del capit&aacute;n ara&ntilde;a.</p>
<p>En fin, a mi me gusta m&aacute;s pensar en lo de la sopa de piedras y espero que mi &quot;compa&quot; me lo diga en broma, pero claro, tambi&eacute;n es mi opini&oacute;n y es m&aacute;s subjetiva&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/02/27/%c2%bfsopa-de-piedras-o-capitan-arana/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Puzzle inverso</title>
		<link>http://blog.chuidiang.com/2008/09/30/puzzle-inverso/</link>
		<comments>http://blog.chuidiang.com/2008/09/30/puzzle-inverso/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 18:36:59 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[varios]]></category>
		<category><![CDATA[iBATIS]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=411</guid>
		<description><![CDATA[Normalmente, en un puzzle, tienes las piezas y &#34;s&#243;lo&#34; hay que encajarlas. Sin embargo, estos d&#237;as he estado codificando un poco (&#161;&#161; pof fin!!) y estoy haciendo en el proyecto una peque&#241;a funcionalidad. El proyecto usa Spring Framework e iBatis. Y el puzzle es &#34;inverso&#34;. Resulta que Spring ya tiene cosas hechas, con iBatis hay [...]]]></description>
			<content:encoded><![CDATA[<p>Normalmente, en un puzzle, tienes las piezas y &quot;s&oacute;lo&quot; hay que encajarlas. Sin embargo, estos d&iacute;as he estado codificando un poco (&iexcl;&iexcl; pof fin!!) y estoy haciendo en el proyecto una peque&ntilde;a funcionalidad. El proyecto usa Spring Framework e iBatis. Y el puzzle es &quot;inverso&quot;.</p>
<p>Resulta que Spring ya tiene cosas hechas, con iBatis hay cosas que se hacen solas, y con algunas de las librer&iacute;as que tenemos tambi&eacute;n. S&oacute;lo hay que implementar determinadas interfaces y pas&aacute;rselas a todo esto. Y eso es lo curioso de este puzzle, esas implementaciones son las piezas que faltan, tienen sus huecos asignados y s&oacute;lo tienes que hacerte las piezas.</p>
<p>Me explico. Un fichero xml para iBatis con las consultas. Una implementaci&oacute;n de DAO que llame a iBatis. Unas clases para convertir los datos devueltos por iBatis a datos propios de la aplicaci&oacute;n. Una configuraci&oacute;n para el DataSource, etc, etc, etc. Y milagrosamente, tras hacer trozos sueltos de c&oacute;digo aqu&iacute; y all&iacute; y meterlo todo en su sitio&#8230; &iexcl;&iexcl; funciona !!.</p>
<p>La verdad es que si est&aacute;s acostumbrado a esas herramientas, se hace todo en un &quot;pis-pas&quot; y con cierta garant&iacute;a de que funcionar&aacute;. La pega es que el programar se hace un pel&iacute;n m&aacute;s aburrido, ya que hay poco que pensar y s&oacute;lo tienes que hacer clases mec&aacute;nicas con poco o nada de c&oacute;digo interesante.</p>
<p>Cambiando de tema, &iquest;por qu&eacute; estoy codificando ahora?. Muy sencillo. Despu&eacute;s de que me dieran una especificaci&oacute;n adecuada (&quot;no s&eacute; qu&eacute; quiero, pero debe estar para ma&ntilde;ana&quot;), yo he hecho un dise&ntilde;o adecuado a esa especificaci&oacute;n (&quot;vete haciendo, que luego ya hablaremos&quot;) y los codificadores han hecho un c&oacute;digo seg&uacute;n el dise&ntilde;o </p>
<blockquote>
<p>public class ElProyecto {<br />
&nbsp;&nbsp; public static void main (String [] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // To be defined.<br />
&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>Hoy ya es ma&ntilde;ana, as&iacute; que toca que todos como locos quitemos el &quot;to be defined&quot;: y rellenemos el c&oacute;digo de dentro. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2008/09/30/puzzle-inverso/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pensamientos sobre proyectos grandes y Spring Framework</title>
		<link>http://blog.chuidiang.com/2008/07/23/pensamientos-sobre-proyectos-grandes-y-spring-framework/</link>
		<comments>http://blog.chuidiang.com/2008/07/23/pensamientos-sobre-proyectos-grandes-y-spring-framework/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 17:22:54 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[diseño]]></category>
		<category><![CDATA[metodologías]]></category>
		<category><![CDATA[SpringFramework]]></category>
		<category><![CDATA[trabajo]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=401</guid>
		<description><![CDATA[En su d&#237;a, para nuestros proyectos grandes, ten&#237;amos muchas librer&#237;as y m&#243;dulos separados. Cada programador sol&#237;a ser responsable de uno de los m&#243;dulos y ten&#237;a su proyecto independiente, con sus programas de prueba, simuladores y todo lo que le hiciera falta. Eso estaba bien, pero ten&#237;a una ligera pega. No us&#225;bamos algo como maven y [...]]]></description>
			<content:encoded><![CDATA[<p>En su d&iacute;a, para nuestros proyectos grandes, ten&iacute;amos muchas librer&iacute;as y m&oacute;dulos separados. Cada programador sol&iacute;a ser responsable de uno de los m&oacute;dulos y ten&iacute;a su proyecto independiente, con sus programas de prueba, simuladores y todo lo que le hiciera falta.</p>
<p>Eso estaba bien, pero ten&iacute;a una ligera pega. No us&aacute;bamos algo como maven y no ten&iacute;amos control ninguno de dependencias cruzadas. Cada programador pon&iacute;a sus dependencias de otros m&oacute;dulos seg&uacute;n lo necesitaba. El problema, al final, es que no hab&iacute;a forma de compilar eso desde cero, ya que era f&aacute;cil que un m&oacute;dulo necesitara del jar de otro m&oacute;dulo, que a su vez necesitaba de un tercero y tras una cadena m&aacute;s o menos larga, hab&iacute;a un m&oacute;dulo que necesitaba del jar del que estamos compilando. S&iacute;, ya s&eacute; que es una falta grave de dise&ntilde;o y deber&iacute;a haberse pensado al principio y dejar claras esas dependencias, pero tambi&eacute;n es cierto que entre lo que lo pensado antes y la realidad despu&eacute;s hay muchas diferencias.</p>
<p>Al usar maven, decidimos hacer un proyecto grande con subproyectos debajo (uno por m&oacute;dulo). As&iacute; maven comprueba las dependencias y si un programador pone una dependencia que no debe, maven le protesta. Sin embargo, esto tambi&eacute;n tiene una gran pega. El compilado desde cero se hace desde arriba del todo y el fallo de un m&oacute;dulo hace que los dem&aacute;s ni siquiera intenten compilar. Adem&aacute;s, la dependencia se hace entre fuentes, por lo que para estar a la &uacute;ltima, necesitas hacer update de todos los fuentes. Eso, en un proyecto grande, puede ser un buen rato casi todos los d&iacute;as.</p>
<p>Al descubrir que se puede usar el core de Spring Framework, aunque sean aplicaciones de escritorio, para instanciar los m&oacute;dulos y usar los eventos de Spring Framework para comunicarlos entre s&iacute;, me da la impresi&oacute;n de que se puede hacer relativamente f&aacute;cil que los m&oacute;dulos hablen entre ellos y se pasen datos sin necesidad de que tengan dependencias entre ellos. Los primeros mini-proyectos en la que hemos usado este framework y hemos hecho m&oacute;dulos indpendientes totalmente, comunicados a trav&eacute;s del framework y de c&oacute;digo de transformaci&oacute;n de tipos de datos de un m&oacute;dulo a los tipos del otro en el main, est&aacute;n resultando una peque&ntilde;a maravilla en cuanto a organizaci&oacute;n.</p>
<p>As&iacute; que me estoy planteando el volver a m&oacute;dulos separados, en proyectos independientes, y con prohibici&oacute;n de poner dependencias de otros m&oacute;dulos, salvo algunos muy concretos pensados m&aacute;s como librer&iacute;as comunes que como m&oacute;dulos a instanciar como beans de Spring Framework.</p>
<p>La pega es la de siempre, la paliza de mover todos los repositorios de CVS para que tengan otra estructura y el retocar todo el c&oacute;digo, sobre todo quitando dependencias de unos m&oacute;dulos con otros. Todo se andar&aacute;, poco a poco.</p>
<p>Una peque&ntilde;a aclaraci&oacute;n sobre las dependencias entre m&oacute;dulos. Suponamos que tenemos modulo1.jar y modulo2.jar y que modulo1.jar necesita llamar a cosas de modulo2.jar. Para no meter la dependencia a lo bestia, normalmente hacemos una InterfaceModulo2 con las llamadas a las cosas del m&oacute;dulo2 que sean de inter&eacute;s desde fuera. Por supuesto, esa interface est&aacute; en modulo2.jar. Y por supuesto, los par&aacute;metros y retornos de los m&eacute;todos de la interface son tipos primitivos de java o bien tipos que est&aacute;n en modulo2.jar. Pues bien, eso hace que modulo1 dependa de modulo2, ya que ve al menos a la interface y a los tipos de par&aacute;metros y retornos. Por supuesto, una opci&oacute;n es hacer un tercer m&oacute;dulo InterfaceModulo2.jar con la interface y los tipos, pero me parece multiplicar el n&uacute;mero de jars a lo tonto.</p>
<p>La opci&oacute;n que estamos planteando ahora es que modulo1 no vea en absoluto a modulo2. Cuando necesite algo de m&oacute;dulo2 (en realidad, cuando necesite algo, lo que sea), debe lanzar un &quot;evento&quot; indic&aacute;ndolo. Es el c&oacute;digo del main el encargado de recoger ese evento y hacer la petici&oacute;n a modulo2, para pasar luego los resultados a m&oacute;dulo1. Esto puede parecer costoso, sobre todo si hay mucha necesidad de cosas de modulo2 por parte de modulo1, pero&#8230; si hay tanta necesidad de cosas &iquest;no estar&aacute; mal pensado hacer dos modulos? &iquest;no estar&aacute; mal pensada la funcionalidad de cada m&oacute;dulo?.</p>
<p>En fin, un peque&ntilde;o rollo, pero como indico en el t&iacute;tulo, son s&iacute;mplemente &quot;pensamientos&quot;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2008/07/23/pensamientos-sobre-proyectos-grandes-y-spring-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

