<?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/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>El Cedazo &#187; Eagle</title>
	<atom:link href="https://eltamiz.com/elcedazo/category/eagle/feed/" rel="self" type="application/rss+xml" />
	<link>https://eltamiz.com/elcedazo</link>
	<description>Comparte conocimiento.</description>
	<lastBuildDate>Sun, 01 Feb 2026 06:35:56 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/es/</creativeCommons:license>
		<item>
		<title>Informática: esos locos, con sus locos cacharros &#8211; Servicios web (WS), Arquitectura orientada a servicios (SOA) y demás zarandajas de la “globalización” de los programas</title>
		<link>https://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-%e2%80%9cglobalizacion%e2%80%9d-de-los-programas/</link>
		<comments>https://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-%e2%80%9cglobalizacion%e2%80%9d-de-los-programas/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 08:40:01 +0000</pubDate>
		<dc:creator>Eagle</dc:creator>
				<category><![CDATA[Eagle]]></category>
		<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://eltamiz.com/elcedazo/?p=13029</guid>
		<description><![CDATA[Puff, hace más de un año que presenté la temática. Siento mucho haberme dejado el último tema en el aire, pero debo decir en mi defensa que me llamaron otras obligaciones más &#8220;obligantes&#8220;. En fin, en cualquier caso voy a terminar lo que empecé. La última vez hablamos de Sistemas cliente-servidor vs Sistemas multi-capa y ahora [...]]]></description>
			<content:encoded><![CDATA[<p><em>Puff</em>, hace más de un año que presenté la temática. Siento mucho haberme dejado el último tema en el aire, pero debo decir en mi defensa que me llamaron otras obligaciones más &#8220;<em>obligantes</em>&#8220;. En fin, en cualquier caso voy a terminar lo que empecé. La última vez hablamos de <a href="http://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/" class="liinternal">Sistemas cliente-servidor vs Sistemas multi-capa</a> y ahora acabaremos la serie hablando sobre &#8220;programas que funcionan sobre internet&#8221;.</p>

<p>Este tema no tiene nada de técnico, tan sólo voy a comentar cómo la aparición de Internet ha generado nuevos mercados que, a su vez, han generado nuevas formas de entender los negocios que precisan de tratamientos informáticos diferentes a los de &#8220;toda la vida&#8221;.</p>

<p>La &#8220;globalización&#8221; e Internet han hecho que cualquiera necesite ejecutar un &#8220;proceso&#8221; en cualquier momento, pero también en cualquier lugar, y alguien, con muy buen criterio, pensó que la forma normal de trabajar en programación no servía para este propósito. ¿Cómo podría yo aprovechar una función o un procedimiento hecho por otra persona desde el otro lado del mundo sin tener que conectarme a una red privada (virtual o no) para emular<sup>[<a href="https://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-%e2%80%9cglobalizacion%e2%80%9d-de-los-programas/#footnote_0_13029" id="identifier_0_13029" class="footnote-link footnote-identifier-link" title="Emular: Hacer creer al otro programa que en realidad soy otro o estoy en otro sitio.">1</a>]</sup> que estoy ahí? Porque hasta ese momento eso no era posible. Sí, podías llamar a un &#8220;programa&#8221; completo mediante una URL (siempre que tu plataforma y la del programa fueran la misma, por ejemplo un EXE en Windows), éste se descargaba a tu PC y se ejecutaba en local. Pero esa no era la idea. Así que se pensó en un sistema estándar que permitiese hacer lo mismo (o parecido) que hace <a href="http://es.wikipedia.org/wiki/Java_Remote_Method_Invocation" title="Descripción de RMI en la Wikipedia" target="_blank" rel="nofollow" class="liwikipedia">RMI</a> o <a href="http://es.wikipedia.org/wiki/CORBA" title="Desccripción de CORBA en la Wikipedia" target="_blank" rel="nofollow" class="liwikipedia">CORBA</a> en una red interna, pero en la red de redes, la web.</p>

<p>E inventaron los servicios web.</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/WS.jpg" class="liimagelink"><img class="alignleft size-full wp-image-13032" src="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/WS.jpg" alt="" width="390" height="129" /></a>Un <strong>servicio web</strong> no es más que (definición de la Wikipedia) &#8220;<em>una pieza de software que utiliza un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones</em>&#8220;. En lenguaje llano, un &#8220;programilla&#8221; (o un conjunto de funciones) que sirve para que cualquier otro programa pueda llamar a sus funciones para solicitar o enviar datos. Para ello se empleará XML<sup>[<a href="https://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-%e2%80%9cglobalizacion%e2%80%9d-de-los-programas/#footnote_1_13029" id="identifier_1_13029" class="footnote-link footnote-identifier-link" title="XML: eXtended Markup Language. Es, a grandes rasgos, una forma de codificar la informaci&oacute;n de forma jer&aacute;rquica, entre etiquetas de principio y de fin que indican d&oacute;nde empieza y termina cada dato.">2</a>]</sup> como forma de codificar los datos, ya que, al ser texto plano, es perfectamente válido para ser pasado por HTTP.</p>

<p>Un ejemplo sencillo: tenemos una preciosa web que nos ofrece el tiempo en España. Creamos un servicio web que permita que cualquiera, desde otra web o programa (es indiferente) pueda llamar a ese servicio y obtener el tiempo de nuestra web, incluso de alguna provincia concreta mediante el paso de parámetros. Y todo esto teniendo acceso sólo a la web (es decir, puerto 80 u 8080, que todos los <em>firewalls </em>dejan libre para poder navegar por las páginas). ¿No suena bien?</p>

<p>A partir de ese momento, se nos abre un mundo de posibilidades: podemos crear un montón de <em>servicios web </em>que permitan a los demás consumir nuestros servicios, e incluso podemos consumir sus servicios también, en una forma de colaboración mutua, y todo esto solamente con tener acceso a Internet, nada más, olvidándonos de redes privadas, claves y demás.</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/SOA.jpg" class="liinternal"></a><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/SOA.jpg" class="liimagelink"><img class="alignright size-full wp-image-13031" src="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/SOA.jpg" alt="" width="228" height="196" /></a>Una vez que esto fue posible se abrió un nuevo mercado y nació la <a href="http://es.wikipedia.org/wiki/Arquitectura_orientada_a_servicios" target="_blank" rel="nofollow" class="liwikipedia">Arquitectura Orientada a Servicios (SOA)</a>, que básicamente es un negocio establecido en base a servicios web (aunque no es obligatorio que todo sean servicios web) donde se definen todos los servicios que ofreces para que los demás los puedan consumir. Los servicios que ofreces están descritos en el &#8220;catálogo&#8221; UDDI, de forma que cualquier servicio puede consultar ese catálogo y saber cuáles son esos servicios ofrecidos.</p>

<p>Una de las grandes ventajas de SOA es la posibilidad de &#8220;vender&#8221; un producto realizándolo &#8220;a medias&#8221; con otra empresa (o empresas) en la que cada uno realiza una función. Como quiera que el &#8220;usuario&#8221; (otro programador), al final, llamará a cierta función X que le devolverá lo que le interesa, a dicho usuario no le interesa quién desarrolló esa función, sino que funcione tal como la contrató. Otra ventaja es que las funciones las puedes programar en el lenguaje que prefieras, mientras las puedas instalar en el servidor aplicacional para que den correctamente su servicio. Además, al estar en tu servidor, las puedes cambiar, arreglar, mejorar&#8230; sin que el usuario se entere, mientras mantengas la misma forma de llamada. ¡Todo parecen ventajas!</p>

<p>Pues no, como siempre hay el lado malo: <strong>velocidad</strong> y <strong>dependencia</strong>, sobre todo.</p>

<p>Velocidad, porque el servicio no deja de estar en &#8220;Internet&#8221;, lo que conlleva pasar por muchos <em>routers </em>y servidores, y elevar consecuentemente los tiempos de respuesta (además de transformar todo a XML, con lo &#8220;verborreico&#8221; que es este estándar, y enviar un buen &#8220;churro&#8221; de caracteres). Y dependencia, en este caso, del acceso a internet y de tu proveedor del servicio: imagina que has contratado un servicio para tu web que te da las cotizaciones de la bolsa &#8220;on-line&#8221; porque tú ofreces servicios de broker y va, casualmente, y se cae el servidor donde tienes contratado el servicio web de donde leías esos datos. ¿Y ahora qué haces? Pues buscarte la vida si no tienes un plan B (cosa que en este país pasa mucho). Lo lógico sería tener previsto qué ocurre en caso de fallo y, dado que la base de tu negocio es el acceso a internet y al servicio web, tener duplicados los contratos, es decir, tener dos líneas de acceso a internet con proveedores distintos, y dos servicios web contratados en dos sitios distintos. Pero, claro, es que &#8221;<em>eso es el doble de caro</em>&#8220;. Ya, ya, &#8230; así nos luce el pelo luego.</p>

<p><strong>SaaS (Software as a Service)</strong></p>

<p>Otra manera de ver los negocios que llegó con internet, y que a mí particularmente me resulta muy interesante, es ésta: el <em>software vendido como un servicio</em>, no como una propiedad. En la <a href="http://es.wikipedia.org/wiki/Software_como_servicio" title="SaaS" target="_blank" rel="nofollow" class="liwikipedia">Wikipedia</a> podéis encontrar información más detallada sobre esto, pero básicamente consiste en &#8220;alquilar&#8221; el software en vez de venderlo. ¿Cómo es eso, pago por algo que no es mío? Pues sí, y encima con bastantes ventajas. Sería como un renting de un coche, por ejemplo.<sup>[<a href="https://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-%e2%80%9cglobalizacion%e2%80%9d-de-los-programas/#footnote_2_13029" id="identifier_2_13029" class="footnote-link footnote-identifier-link" title="Nota del Editor: A pesar de su nombre tan moderno, esta pr&aacute;ctica&nbsp;se viene haciendo desde siempre. Por ejemplo, todo el software b&aacute;sico de IBM para su serie &amp;#8220;Z&amp;#8221;, es decir, los mainframes, es alquilada, y hay otras compa&ntilde;&iacute;as de software, como SAS, por ejemplo, cuya pol&iacute;tica, desde su fundaci&oacute;n,&nbsp;no es vender licencias de software, sino alquilarlas&amp;#8230; exactamente igual que SaaS propone. S&iacute;, los mismos perros con diferentes collares. Solo que esta vez est&aacute; disponible por internet y no tienen que &amp;#8220;invadir&amp;#8221; tu casa para actualizaciones, errores, etc., se hace todo en sus servidores.">3</a>]</sup></p>

<p>La empresa proveedora se encarga de tener siempre el software actualizado, disponible y listo para ser usado desde cualquier sitio (puede ser por internet o por VPN, por ejemplo) y el cliente se limita a pagar el alquiler del mismo. Cuando ya no le interesa usar más el servicio, deja el alquiler y listo. Un ejemplo de esto lo está intentando Microsoft desde la versión 2010 con el Office. Ofrecen un paquete en el que tú alquilas el Word, Excel, etc. para usarlo desde cualquier ordenador, pagando un alquiler por su uso. Si no te interesa esto, siempre puedes comprar una licencia &#8220;normal&#8221;, pero cuando salga Office 2011, con tu alquiler ya lo usarás desde el principio sin tener que cambiar nada en tu equipo, mientras que con la compra normal te quedarás en la versión 2010 salvo que vuelvas a pagar para actualizar.</p>

<p>Como véis hay muchas ventajas, pero dependerá de las necesidades de cada uno ver si es rentable o no. Lo mismo que el renting de un coche o el alquiler de un piso.</p>

<p>.</p>

<p>En general, la llegada de Internet ha cambiado las reglas de juego clásicas y ha abierto tantas puertas que es difícil abarcarlas todas. Antes (hablo de los 90) con saber C, Visual Basic o Cobol encontrabas trabajo seguro, pero ahora tienes tantas y tantas cosas, tantas tecnologías y lenguajes que te pierdes (yo, al menos, tengo nociones de algunas, oídas de otras y mucho uso de algunas muy concretas).</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/Pensador.jpg" class="liimagelink"><img class="alignleft size-full wp-image-13035" src="http://eltamiz.com/elcedazo/wp-content/uploads/2011/05/Pensador.jpg" alt="" width="260" height="194" /></a>Yo creo que ha llegado el momento en las universidades de especializarse, como los médicos, cada uno en un campo: web, arquitecturas (cliente-servidor, distribuidas), SO (o bajo nivel), Bases de Datos (que esto también tiene tela ahora mismo, no hay más que intentar profundizar en Oracle mismamente y ya se ve), móviles y alguna más que no se me ocurre ahora. No tiene mucho sentido hoy en día sacar ingenieros técnicos &#8220;genéricos&#8221;, que saben poco de algunas cosas (porque, a pesar de las prácticas, el mundo empresarial es muy diferente) y mucho&#8230; de nada. Para ser competitivos hay que especializarse y ser el mejor en tu rama, para que los empresarios sepan dónde buscar.</p>

<p>Los tiempos de &#8220;<em>soy informático, así que pregunta lo que quieras</em>&#8221; se han terminado hace unos años. Lo mismo que un cirujano médico no le va a discutir a un traumatólogo en su campo porque no ha estudiado eso, no es su especialidad, los informáticos tenemos que tender a especializarnos en un área o dos como mucho, porque ya no hay tiempo que llegue para aprender de todo. Por regla general, los &#8220;inquietos&#8221; informáticos queremos saber de todo (ahora me quiero meter a aprender programación en Android o iPhone, pero me falta tiempo) y antes daba gusto porque casi podías llegar a hacerlo, pero&#8230; ya no. ¡Pardiez, que me voy por las ramas!</p>

<p>Me despido de vosotros (como escritor) porque ya no sé de qué más escribir en que tenga unos conocimientos más o menos asentados, así que espero que os haya gustado y&#8230; ¡hasta otra!</p>

<p><a href="http://eltamiz.com/elcedazo/2010/02/18/informatica-esos-locos-con-sus-locos-cacharros-presentacion/" class="liinternal">Enlace a la presentación de la serie</a>.</p>
<ol class="footnotes"><li id="footnote_0_13029" class="footnote">Emular: Hacer creer al otro programa que en realidad soy otro o estoy en otro sitio.</li><li id="footnote_1_13029" class="footnote">XML: <em>eXtended Markup Language</em>. Es, a grandes rasgos, una forma de codificar la información de forma jerárquica, entre etiquetas de principio y de fin que indican dónde empieza y termina cada dato.</li><li id="footnote_2_13029" class="footnote">Nota del Editor: A pesar de su nombre tan <em>moderno</em>, esta práctica se viene haciendo desde siempre. Por ejemplo, todo el software básico de IBM para su serie &#8220;Z&#8221;, es decir, los mainframes, es alquilada, y hay otras compañías de software, como SAS, por ejemplo, cuya política, desde su fundación, no es vender licencias de software, sino alquilarlas&#8230; exactamente igual que SaaS propone. Sí, los mismos perros con diferentes collares. Solo que esta vez está disponible por internet y no tienen que &#8220;invadir&#8221; tu casa para actualizaciones, errores, etc., se hace todo en sus servidores.</li></ol>]]></content:encoded>
			<wfw:commentRss>https://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-%e2%80%9cglobalizacion%e2%80%9d-de-los-programas/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/es/</creativeCommons:license>
	</item>
		<item>
		<title>Informática: esos locos, con sus locos cacharros &#8211; Sistemas cliente-servidor vs Sistemas multi-capa</title>
		<link>https://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/</link>
		<comments>https://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 14:54:59 +0000</pubDate>
		<dc:creator>Eagle</dc:creator>
				<category><![CDATA[Eagle]]></category>
		<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://eltamiz.com/elcedazo/?p=8149</guid>
		<description><![CDATA[Ya estoy aquí de nuevo. Después de hablar sobre Programación procedural clásica (PP) vs Programación orientada a objectos (POO), en esta ocasión vamos a hablar de sistemas cliente-servidor, basados en 2 capas, y sistemas multi-capa, formados habitualmente por 3 capas, aunque los de 5 capas también están en auge. Pero&#8230; ¿qué es eso de las [...]]]></description>
			<content:encoded><![CDATA[<p>Ya estoy aquí de nuevo. Después de hablar sobre <a href="http://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-–-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/" class="liinternal">Programación procedural clásica (PP) vs Programación orientada a objectos (POO)</a>, en esta ocasión vamos a hablar de sistemas cliente-servidor, basados en 2 capas, y sistemas multi-capa, formados habitualmente por 3 capas, aunque los de 5 capas también están en auge.</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/interrogante.jpg" class="liimagelink"><img class="size-full wp-image-8351 alignleft" src="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/interrogante.jpg" alt="" width="43" height="72" /></a>Pero&#8230; ¿qué es eso de las capas? Definamos primero ese concepto para que se pueda entender todo mejor. Se habla de <em>capas</em> en la programación cuando queremos separar los componentes que permiten el funcionamiento de un programa en diferentes partes. Por ejemplo, cuando hablamos de dos capas habitualmente se refiere a la capa de presentación-negocio por un lado y a la de base de datos por el otro.</p>

<p>Vamos a partir del concepto actual de capas para que podáis entender mejor a qué me refiero. El modelo de tres capas, en el que hoy se basan casi todos los programas nuevos, consta de lo siguiente (extraído de la <a href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_por_capas" target="_blank" rel="nofollow" class="liwikipedia">wikipedia</a>):</p>

<ol>
    <li><strong>Capa de presentación:</strong> es la que ve el usuario (también se la denomina &#8220;capa de usuario&#8221;). Presenta el sistema al usuario, le comunica la información y captura la información que proporciona el usuario en un mínimo de proceso <a href="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/capa.jpg" class="liimagelink"><img class="alignright size-thumbnail wp-image-8350" src="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/capa-150x150.jpg" alt="" width="90" height="90" /></a>(realiza un filtrado previo para comprobar que no hay errores de formato y poco más). Esta capa se comunica únicamente con la capa de negocio. También es conocida como interfaz gráfica, y debe tener la característica de ser &#8220;amigable&#8221; (entendible y fácil de usar) para el usuario.</li>
    <li><strong>Capa de negocio:</strong> es donde residen los programas que se ejecutan, se reciben las peticiones del usuario y se envían las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lógica del negocio) porque es aquí donde se establecen todas las reglas que deben cumplirse. Esta capa se comunica con la capa de presentación, para recibir las solicitudes y presentar los resultados, y con la capa de datos, para solicitar al gestor de base de datos bien para almacenar, bien recuperar datos allí contenidos.</li>
    <li><strong>Capa de datos:</strong> es donde residen los datos, y es la encargada de acceder a los mismos. Está formada por uno o más gestores de bases de datos que realizan todo el almacenamiento de datos y reciben solicitudes de almacenamiento o recuperación de información desde la capa de negocio.</li>
</ol>

<p>En los albores de la informática (Mackuskey creo que os lo podrá confirmar), todo se hacía en una única capa (quizá no sea exactamente la expresión correcta, pero lo voy a expresar así). Digo esto porque el programador se encargaba de todo: imprimía los caracteres en pantalla, hacía los cálculos necesarios para cada proceso y, finalmente, grababa<strong> a mano</strong> los datos en los ficheros correspondientes, mejor dicho, emitía las órdenes de lectura o escritura exactas en los ficheros (no, no había bases de datos -en el resto del artículo, BDs- relacionales hasta los años 80), gestionando incluso los índices en algunos casos. Vamos, un auténtico &#8220;yo me lo guiso y yo me lo como todito&#8221;. <sup>[<a href="https://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/#footnote_0_8149" id="identifier_0_8149" class="footnote-link footnote-identifier-link" title="Nota de Macluskey, por alusiones: Confirmo que era as&iacute;, sin duda. Hasta los a&ntilde;os 70 no exist&iacute;an bases de datos de ning&uacute;n tipo, y hasta mediados, m&aacute;s bien fines, de los 80, no existieron las primeras bases de datos relacionales. La primera de ellas operativa fue SQL/DS, de IBM para VSE, seguida al poco por DB2 para MVS, ambas en ambiente mainframe de IBM, lo que tras varios cambios de nombre ahora se llama z/OS">1</a>]</sup></p>

<p>Afortunadamente en los 80 llegó dBase (y Clipper más tarde), que ya eran sistemas gestores de bases de datos (aunque no usaban SQL) y permitían al programador usar sentencias parecidas a las actuales, tales como &#8220;carga/graba/borra este registro&#8221;. Quizá podríamos considerar ese momento como el paso a las dos capas, porque el programador ya no tenía que gestionar todo &#8221;a mano&#8221;: por un lado tenía una BD, y por otro su capa negocio/interface. Ya en los 90 se popularizaron (porque hasta esa época era algo reservado al uso en los grandes ordenadores) las BDs relacionales. Y con esa popularización se empezaron a diseñar miles de programas usando la tecnología &#8220;cliente-servidor&#8221; (varios ordenadores con el mismo programa &#8221;atacaban&#8221; una base de datos única). Y con esto llegamos al punto del tema en cuestión. No voy a ahondar demasiado en los conceptos porque, con una visita a la wikipedia, tenéis todas las definiciones que necesitéis sobre ello. Creo que con explicar lo básico se entiende la idea.</p>

<p>Así pues, yo definiría comunmente un sistema <a href="http://es.wikipedia.org/wiki/Cliente-servidor" target="_blank" rel="nofollow" class="liwikipedia">cliente-servidor</a> como <em>un sistema en el cuál tenemos una base de datos centralizada (la capa de datos) y un programa instalado en diferentes ordenadores que gestiona la capa de presentación y la de negocio a la vez</em> (de ahí que se llame de dos capas). Por ejemplo, el clásico programa que emplean en un taller oficial de reparación de vehículos (supongo que habréis visto alguno al llevar el coche a la revisión). Estos suelen ser programas que acceden a los datos de la casa madre (eso, ahora que hay internet, porque antes era off-line y se cargaban los datos por la noche) y que el programa gestiona todo lo referente a los procesos y el interfaz de usuario (suelen estar hechos en Visual Basic, Delphi o similares). O también los programas que usan los cajeros de los bancos suelen ser así. Otro ejemplo serían las páginas web: los datos están en internet y el navegador sería el &#8220;programa&#8221; que visualiza y ejecuta (con javascript) las operaciones necesarias. Pero, por otro lado, también hay otro tipo de sistemas cliente-servidor en los que se mezclan la capa de datos y de negocio, y en la parte cliente tenemos la capa de presentación. De nuevo, una página web sirve como ejemplo, sólo que en este caso no usaría javascript para realizar los cálculos, sino que se harían en la propia BD (como, por ejemplo un procedimiento almacenado en la BD para realizar, digamos, la suma de las ventas de un mes).</p>

<p>En cambio, como se dijo anteriormente, un sistema de tres capas separa las dos que se juntan en el &#8220;cliente&#8221; de una forma que, en principio, trae numerosas ventajas, aunque veremos que luego no todo es tan bonito, como suele pasar siempre. La estructura habitual de instalación en un sistema de tres capas es: un servidor de bases de datos, un servidor de aplicaciones (capa de negocio) y una interface de usuario (capa de presentación), que suele ser tonta, es decir, se limita a trasladar las acciones del usuario en la pantalla a llamadas a la capa de negocio para que sea ahí donde se realicen los cálculos pertinentes. Esta arquitectura se puso de moda con la llegada de Java y sus aplicaciones multiplataforma.</p>

<p>Ahora llega la parte práctica del asunto: ¿y cuál me interesa a mi usar? Pues para saber eso hay que conocer los puntos fuertes y débiles de cada tecnología, así que veámoslos primero.</p>

<h1>Cliente-servidor: ventajas e inconvenientes</h1>

<h1>(Capa de negocio en el cliente, también llamado cliente rico o pesado)</h1>

<p style="text-align: left">Como tecnología bien conocida, por el tiempo que lleva en producción, es ampliamente usada. Lo cierto es que para la mayoría de aplicaciones comunes es más que suficiente, pero empieza a cojear cuando se tienen muchos clientes atacando al servidor (y se espera una respuesta rápida, lógicamente). Las mayores <strong>ventajas</strong> son:</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/cliente-servidor.gif" class="liinternal"></a><img class="size-full wp-image-8347 alignright" src="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/cliente_servidor_pesado.jpg" alt="" width="300" height="257" /></p>

<ol>
    <li><strong>Aplicaciones cliente ricas en contenido y rápidas</strong>: el hecho de tener todo, menos los datos, en la propia aplicación hace que, disponiendo de un puesto cliente con el hardware adecuado, todo en la aplicación fluya con rapidez (siempre que los datos estén disponibles). Las operaciones que se realizan sobre los datos son instantáneas (no hay que esperar a que lo haga otro servidor y esperar su respuesta). Por ejemplo, si recordáis al principio de internet cuando las páginas web tenían, digamos, un desplegable de provincias y ciudades (donde las ciudades dependen del contenido de la provincia), cuando pinchabas una provincia, la página web llamaba al servidor, éste obtenía las ciudades relacionadas con la provincia y devolvía la página nuevamente para seleccionar la ciudad. Esto era, obviamente, hiperlento. La otra posibilidad era tener un código javascript (capa de negocio) que ya tuviese todos los valores de provincias y ciudades grabadas y, en ese caso, todo era instantáneo. A cambio, la página era mucho más pesada de cargar (cliente rico o pesado). La velocidad de ejecución del javascript dependía en este caso de la potencia del cliente.</li>
    <li><strong>Actualizaciones independientes</strong>: diferentes clientes pueden tener versiones diferentes de la aplicación a la vez funcionando, lo cual sirve, por ejemplo, para actualizar sólo una parte de todos tus clientes, a modo de <em>conejillos de indias</em>, y ver si lo nuevo realmente funciona <em>en real</em>.</li>
    <li><strong>Fácil escalabilidad en los clientes</strong>: es muy fácil añadir nuevos clientes, ya que sólo van a necesitar una conexión para obtener los datos, lo cual no incrementa en mucho las necesidades del servidor. Ahora bien, si la aplicación precisa continuamente de datos del servidor, lógicamente éste se verá sobrecargado muy rápidamente conforme crece el número de clientes.</li>
    <li><strong>Servidor normal</strong>: ya que sólo se va a encargar de los datos, aún siendo estos muy importantes, no es preciso un súper-servidor para tener esos datos disponibles. La CPU apenas va a estar ocupada, sólo va a ser necesaria para el gestor de la BD. Eso sí, el sistema de discos es aquí crítico.</li>
</ol>

<p>Como <strong>inconvenientes</strong> yo citaría los siguientes:</p>

<ol>
    <li><strong>Los clientes deben tener ciertos requisitos de hardware</strong>: evidentemente, el hecho de que los cálculos se realicen siempre en el cliente obliga a que el hardware pueda llevarlos a cabo con solvencia. Todos recordaréis los &#8220;requisitos mínimos&#8221; que suelen pedir los programas para instalarse.</li>
    <li><strong>Instalaciones de los clientes engorrosas</strong>: hay que ir cliente a cliente instalando la aplicación, al menos la primera vez, ya que suele traer muchos ficheros de los que depende (baste ver una clásica instalación de Visual Basic para darse cuenta). Las famosas DLLs de las que dependen muchos programas son parte causante de esto. Una vez hecho esto, y si no se añaden nuevas dependencias al programa, las actualizaciones son más fáciles (habitualmente, copiar un único archivo).</li>
    <li><strong>Red de la empresa congestionada</strong>: suele haber mucha información, sobre todo resultados de consultas SQL, fluyendo por la red, desde el servidor a cada cliente y viceversa. Esto no es así (en realidad depende) con las tres capas, ya que ahí solo fluyen los resultados a mostrar en pantalla, mientras que en tecnología cliente-servidor cada cálculo necesita de unos datos que son pedidos y llevados al cliente, para efectuar sus operaciones (muchas veces son muchos datos, como por ejemplo, obtener la lista del todos los clientes o productos, y hacer operaciones con ellos). El hecho de que las operaciones se realicen en el cliente implica que si para obtener, por ejemplo, el resultado de compras+ventas-devoluciones necesito obtener esos datos cada vez y calcularlos en el cliente, las tres informaciones van hasta el cliente, realiza la operación y envía el resultado para ser grabado. Si estas mismas operaciones se hacen en el servidor, nada viaja por la red, salvo el resultado.</li>
</ol>

<h1>Cliente-servidor: ventajas e inconvenientes</h1>

<h1>(Capa de negocio en el servidor, también llamado cliente ligero)</h1>

<p><img class="size-full wp-image-8346 alignleft" src="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/cliente-servidor.gif" alt="" width="199" height="92" />Aquí la parte de negocio se mezcla con la de acceso a los datos para obtener una respuesta que luego será enviada al cliente (y éste la mostrará en pantalla, esperando una acción por parte del usuario). Ésta es, a mi entender, una mala filosofía de programación, puesto que mucha parte del negocio se encuentra en la propia BD en forma de procedimientos almacenados o triggers, lo que hace totalmente dependiente el producto software resultante de la BD en la que se desarrolle. Suele ser, además, un compromiso mixto, ya que otra parte pequeña del negocio se debe situar en el cliente casi siempre (los lenguajes de BD suelen ser limitados) y, entre los dos, consiguen llevar a cabo sus acciones. En este caso las <strong>ventajas</strong> son:</p>

<ol>
    <li><strong>Rendimiento del sistema</strong>: normalmente, la misma operación realizada en el cliente o en el servidor (atendiendo a cálculos con datos) se ejecuta mucho más rápido en el servidor, dado que las propias BDs tienen los procedimientos compilados y, además, es posible que si una operación es muy solicitada permanezca en la caché del sistema, siendo aún más rápida.</li>
    <li><strong>Actualizaciones automáticas</strong>: cualquier cosa cambiada en el servidor (a nivel de negocio o datos) repercute automáticamente en el cliente sin tener que hacer nada. El paraíso para los administradores de sistemas.</li>
    <li><strong>Requerimientos de ordenador casi inexistentes</strong>: dado que el cliente no hace más que visualizar cosas, apenas hay requerimientos hardware.</li>
    <li><strong>Instalaciones/actualizaciones sencillas</strong>: incluso inexistentes, si estamos hablando de páginas web.</li>
    <li><strong>Red de la empresa menos sobrecargada</strong>: todas las operaciones se realizan en el servidor, al cliente solo se le envía lo que tiene que ver.</li>
</ol>

<p>Como <strong>inconvenientes</strong> yo citaría los siguientes:</p>

<ol>
    <li><strong>La instalación de los clientes debe estar controlada</strong>: dada su facilidad de expansión, meter muchos clientes sin tener dimensionado el servidor para ese número ralentizará el sistema, llegando incluso a colapsarlo.</li>
    <li><strong>Actualizaciones cuidadosas en el servidor</strong>: hay que tener mucho cuidado con las actualizaciones, ya que todos los clientes cambiarán simultáneamente de comportamiento y, en caso de error, ninguno funcionará correctamente. Lo normal en un programa es que la parte más cambiante esté en la capa de negocio y, al estar ésta en el servidor, será habitual que haya actualizaciones, lo cual es siempre un punto crítico en cualquier sistema.</li>
    <li><strong>Servidor muy potente</strong>: Será el servidor quién se encargue de todos los procesos (y también de los datos, habitualmente), por tanto debe ser lo suficientemente potente como para soportar todas las peticiones y procesos que le sean requeridos.</li>
    <li>El más importante bajo mi punto de vista, <strong>imposibilidad de cambio de motor de BD</strong>: una vez que se empieza a trabajar con el lenguaje de programación específico de una BD y que el programa crece y crece (para variar), el día que se decida cambiar de BD (por ejemplo, migrar de SQL Server a Oracle para ganar en rendimiento) será absolutamente imposible sin reescribir toda la capa de negocio de nuevo. Ya sólo por este motivo yo soy partidario de elegir un cliente-servidor pesado.</li>
</ol>

<h1>3 capas: ventajas e inconvenientes</h1>

<p>Y llegamos al modelo de moda. Es un modelo que, técnicamente, parece perfecto. Además, sobre el papel debería funcionar mejor que nada&#8230; aunque la experiencia me dice que no siempre es así.</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/3capas.gif" class="liimagelink"><img class="alignright size-medium wp-image-8349" src="http://eltamiz.com/elcedazo/wp-content/uploads/2010/06/3capas-300x180.gif" alt="" width="300" height="180" /></a></p>

<p>Tal como vimos al principio, en un modelo de 3 capas tenemos todo separado, lo cual nos proporciona muchísimas ventajas y apenas incovenientes. Veamos ambos.</p>

<p><strong>Ventajas</strong>:</p>

<ol>
    <li><strong>Aplicaciones cliente ligeras</strong>: ya vimos algunas de sus ventajas en los clientes ligeros, a saber: actualizaciones automáticas (siempre que no sean de la interfaz), requerimientos mínimos del cliente, instalaciones sencillas, red poco cargada. El programador en este caso tan sólo debe preocuparse del aspecto gráfico de la misma y de llamar/recibir a los eventos que el usuario puede disparar.</li>
    <li><strong>Modelo de procesos independiente</strong>: si algo está mal, si queremos añadir funcionalidades, nuevos cálculos, &#8230; cualquier cosa que el programador quiera hacer la puede hacer y actualizar sin interferir apenas con los usuarios o con la BD. Una vez que todo esté correcto bastará subir los cambios a un único sitio y, como por arte de magia, todos los clientes disfrutarán de un nuevo programa.</li>
    <li><strong>Alta escalabilidad del sistema</strong>: esto, que se dice mucho y se entiende poco al principio, significa que podemos agregar/quitar al sistema tantos clientes y servidores como necesitemos si el volumen de trabajo crece o decrece. Por ejemplo, imaginemos que teníamos un único servidor de aplicaciones que da soporte a 10 clientes simultaneos pero de repente entran 10 más por picos de trabajo puntuales. Si el sistema se resiente, como es previsible, bastará con añadir un segundo servidor de aplicaciones (capa 2, la de negocios) y un balanceador de carga para que las peticiones de los clientes se repartan automáticamente entre los dos servidores de aplicaciones. Los clientes también crecen pero el servidor de datos se mantiene (si estuviésemos en el caso de cliente (ligero)-servidor sólo cabría aumentar la RAM del servidor, mejorar el procesador (raro-raro) y rezar para que con eso fuese suficiente. En caso de no serlo&#8230; tocaría cambiar de servidor).</li>
    <li><strong>Fácil mantenimiento</strong>: al estar todo separado, cualquier operación es más sencilla de realizar dada la especificidad de las funciones en cada capa. Vamos, que si empieza a fallar, digamos, el servidor de aplicaciones, se prepara otro enseguida y se puede cambiar en &#8220;ná-y-menos&#8221;.</li>
    <li><strong>Alta tolerancia a fallos</strong>: es fácil construir un sistema 24/7<sup>[<a href="https://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/#footnote_1_8149" id="identifier_1_8149" class="footnote-link footnote-identifier-link" title="24/7 indica disponibilidad de 24 horas al d&iacute;a y 7 d&iacute;as a la semana">2</a>]</sup> de alta disponibilidad, basta redundar (duplicar) cada capa y meter un sistema balanceador de cargas que detecte cuándo se cae un servidor para pasar las peticiones al otro. Cuando un sistema se monta así, estamos hablando de un clúster con diversos nodos.</li>
    <li><strong>Bases de datos como simple almacén</strong>: no ejercen más labor que la de almacén de datos, lo que posibilita la migración en caso de ser necesario, tanto entre versiones de la misma BD como entre diferentes motores de BD.</li>
</ol>

<p><strong>Inconvenientes</strong>:</p>

<ol>
    <li><strong>Red de la empresa más cargada</strong>: esta desventaja es relativa, puesto que sólo ocurre cuando la instalación de la capa de aplicaciones está separada de la de la capa de datos (sí, es posible perfectamente instalar en el mismo servidor físico la capa de negocio y de datos, pero se pierde alguna ventaja como la tolerancia a fallos, por ejemplo). Si es así, las peticiones van desde el cliente a la capa de negocio, y desde la capa de negocio a la BD (y el camino opuesto), moviendo más información por la red que si tuviésemos una aplicación cliente-servidor.</li>
    <li><strong>Programación más compleja</strong>: el hecho de que tu programa dependa de varios servidores hace que sea un poco más complicado tanto el desarrollo como los test. Más piezas en la ecuación, más posibles puntos de fallo. No hablemos ya de la detección/corrección de errores&#8230;</li>
    <li><strong>Servidores especializados</strong>, y más caros por tanto. Todo depende, como siempre, de cuánta seguridad quieras, pero si se quiere cierta tolerancia a fallos hay que tener al menos dos servidores y algo que los sincronice. Además, ya estamos hablando de un servidor aplicacional y otro para BD, lo cual requiere de mayores conocimientos (tanto en su gestión como en la programación) que para un clásico programa cliente-servidor.</li>
    <li>En general, <strong>respuesta más lenta en los clientes</strong>: y éste es el punto por el que yo no siempre elegiría este modelo. Todo es muy bonito en el papel, pero, como resultado de todo este entramado, lo que obtenemos son peticiones a servidores de aplicaciones y respuestas de estos. Por muy rápido que sea el proceso, siempre va a tener que ir y volver, como mínimo, y aunque para la web los servidores aplicacionales son muy rápidos (porque es la velocidad de la conexión la que acaba determinando la velocidad), para un cliente una espera de un segundo puede ser todo un mundo, dependiendo de lo que necesite.</li>
</ol>

<h1>Entonces, ¿cuál es mejor?</h1>

<p>Pues como casi todo en la informática, eso va a depender de varios factores, eso sí, algunos de ellos totalmente determinantes. Por ejemplo, ¿necesito un sistema muy escalable? Pues amigo, ni te lo pienses, como las 3 capas no encontrarás uno mejor. ¿Sistema 24/7 de alta disponibilidad? Bien, en realidad esto también lo tienes con cliente-servidor en sus &#8220;dos modalidades&#8221;: basta redundar el SGBD de forma que si cae un servidor se active el otro (todo de forma transparente para el cliente). Quitando ciertos factores determinantes, como la escalabilidad, si lo único que es fundamental es la experiencia del usuario (cliente) yo me inclinaría por un sistema cliente(pesado)-servidor, donde los procesos se ejecutan casi al instante, y os voy a comentar un caso real (conozco más, pero con uno llega) que ocurre actualmente para apoyar esta afirmación.</p>

<p>Uno de mis conocidos tiene una empresa en la que tenía su sistema de gestión de toda la vida, una BD Informix que era atacada por un programa realizado en Multibase. No es que no estuviesen contentos con el sistema, que sí lo estaban, pues hacía lo que tenía que hacer y lo hacía bien. Pero llegó una empresa consultora de esas que tanto abundan hoy que convenció al gerente (mi amigo) de que 15 años con el mismo programa era de dinosaurios, que había que actualizar los equipos porque si fallaba alguno luego a ver quién le montaba un servidor nuevo con esa versión de Informix, que si esto, que si lo otro&#8230; vamos, la cantata de siempre de &#8220;<em>actualícese, so dinosaurio, que todos tenemos que comer</em>&#8220;. El caso es que este hombre aceptó, incauto de él, pensando, como Don Hilarión, que &#8220;la ciencia avanza que es una barbaridad&#8221; y que a peor no podría ir: ¡¡un sistema con 15 años tiene que ser mucho más lento que uno de hoy en día, vamos hombre!!</p>

<p>Total, pasamos de un sistema cliente-servidor (donde los usuarios pulsaban intro para llegar a la casilla donde querían ir, al viejo estilo DOS) a un flamante sistema de 3 capas con su servidor de BD IBM con Oracle 10g, otro servidor aplicacional con Tomcat 5.5 y un bonito programa hecho en flash con la tecnología FlashRemoting (es como un programa normal de flash que se ejecuta como un EXE cualquiera en vez de en un navegador web, de hecho es un EXE). La verdad es que lo vi y era precioso, con sus botones redondos y sus animaciones tan bonitas&#8230; era precioso, digo, hasta que lo vi funcionando. No estaba nada mal, ojo, más o menos hacía las cosas bien, tenía ciertas ventajas, cosas mejoradas respecto a lo que tenían antes (si no, apaga y vámonos), etc, pero era&#8230; LENTO. O sea, <strong>LENTO</strong>. No es que la pantalla fuese lenta al teclear, ni cosas así, lo que era lento es la transición entre pantallas: entrabas en un cliente y tardaba 2 segundos en mostrar los datos, desde ahí accedías a sus pedidos y tardaba otros 2 segundos en mostrarlos (siempre aparecía un relojito indicando la &#8220;petición&#8221; de los datos al servidor), y así, de pantalla en pantalla, a razón de 2 segundos (o más, pero nunca menos).</p>

<p>Dos segundos pueden parecer una tontería, pero cuando el usuario estaba acostumbrado a pulsar intro y que en medio segundo apareciesen los datos, hacer intro 3 veces más (ya de memoria) para llegar a donde quería, escribir lo que procediese y pulsar intro para grabar y llegar al pedido, y todo esto en menos de 3 segundos, y ahora este mismo proceso le cuesta 2s + ratón a la casilla de destino y escribir el valor (X segundos) + 2s, y esto repetido en el día docenas o centenares de veces, pues&#8230; mal vamos.  El usuario final se enfada, la empresa pierde rendimiento del trabajador y, encima, le ha costado dinero (y más que le costará, y si no, al tiempo). Mi amigo ahora desconfía de las consultoras (como es lógico), y está con un cabreo de tres pares (como es lógico, también).</p>

<p>Con esto quiero dar a entender que las tecnologías no deben adoptarse porque sí, deben adoptarse porque mejoran lo que hay, si no, es un sinsentido. Realmente las 3 capas traen muchas ventajas, sobre todo para los administradores de sistemas, pero hay que pensar bien dónde se aplican, ya que la velocidad de la aplicación no es tan buena como la de un cliente-servidor. Por ejemplo, ahora es muy típico que en la Administración (o sea, el Gobierno central, autonómico, municipal y demás) te pidan que todas las aplicaciones que tú les vendas tengan una arquitectura de 3 capas. Es más, si no es así ya no entras siquiera a concurso. Imponen la tecnología a emplear. Luego salen churros infumables (no todos, lógicamente) y no siempre la empresa es la culpable, es que la han obligado a hacer las cosas con una tecnología inadecuada para el propósito buscado.</p>

<p>En fin, espero que os haya gustado este artículo. Todo lo que aquí digo no es más que mi propio conocimiento basado en mi experiencia de estos años. Puedo haberme equivocado en algo, en cuyo caso no dudéis en decírmelo y, si es menester, corregiré el artículo para que sea lo más correcto y lo menos técnico posible.</p>

<p>El último artículo de mi lista es <a href="http://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-“globalizacion”-de-los-programas/" class="liinternal">Servicios web (WS), Arquitectura orientada a servicios (SOA) y demás zarandajas de la “globalización” de los programas</a>. Ahí os espero.</p>
<ol class="footnotes"><li id="footnote_0_8149" class="footnote">Nota de Macluskey, por alusiones: Confirmo que era así, sin duda. Hasta los años 70 no existían bases de datos de ningún tipo, y hasta mediados, más bien fines, de los 80, no existieron las primeras bases de datos relacionales. La primera de ellas operativa fue SQL/DS, de IBM para VSE, seguida al poco por DB2 para MVS, ambas en ambiente mainframe de IBM, lo que tras varios cambios de nombre ahora se llama z/OS</li><li id="footnote_1_8149" class="footnote">24/7 indica disponibilidad de 24 horas al día y 7 días a la semana</li></ol>]]></content:encoded>
			<wfw:commentRss>https://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/es/</creativeCommons:license>
	</item>
		<item>
		<title>Informática: esos locos, con sus locos cacharros – Programación procedural clásica (PP) vs Programación orientada a objectos (POO) (2 de 2)</title>
		<link>https://eltamiz.com/elcedazo/2010/05/18/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-2-de-2/</link>
		<comments>https://eltamiz.com/elcedazo/2010/05/18/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-2-de-2/#comments</comments>
		<pubDate>Tue, 18 May 2010 15:06:06 +0000</pubDate>
		<dc:creator>Eagle</dc:creator>
				<category><![CDATA[Eagle]]></category>
		<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://eltamiz.com/elcedazo/?p=7937</guid>
		<description><![CDATA[Tras hablar brevemente de la Programación Procedural (PP), ahora toca lo propio con la Programación Orientada a Objetos (POO). Que quede claro antes de nada que voy a tratar de explicarlo para completos &#8220;ignorantes&#8221; del tema, así que mis definiciones pueden no ser completamente formales. Sólo intentaré que se entienda el concepto. La Programación Orientada a Objetos (POO) [...]]]></description>
			<content:encoded><![CDATA[<p>Tras hablar <a href="http://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/" target="_self" class="liinternal">brevemente de la Programación Procedural (PP)</a>, ahora toca lo propio con la Programación Orientada a Objetos (POO). Que quede claro antes de nada que voy a tratar de explicarlo para completos &#8220;ignorantes&#8221; del tema, así que mis definiciones pueden no ser completamente formales. Sólo intentaré que se entienda el concepto.</p>

<h2>La Programación Orientada a Objetos (POO)</h2>

<p>¡No veáis qué cambio supone esto con respecto a la PP! El concepto es totalmente diferente y, viniendo de la PP, cuesta cambiar esa mentalidad (se hace más fácil para alguien que no ha visto esto nunca).</p>

<p>Primeramente, la definición formal (me vale la de la Wikipedia): &#8220;<em>La programación orientada a objetos o POO es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas de ordenador. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento</em>&#8220;. Toma del frasco, Carrasco. ¿Alguien ha entendido algo, así, a bote pronto?</p>

<p>Si en la PP únicamente teníamos que pensar en qué funciones queríamos realizar y codificarlas, para poder llamarlas luego desde cualquier parte del programa, ahora la cosa es como sigue: tienes un mundo real, así que lo que vayas a programar debería encajar lo mejor posible con ese mundo. En el mundo hay cosas, <strong>objetos</strong>, y sobre ellos haces operaciones. Por lo tanto, cuando diseñes el programa, no pienses en qué debe hacer esta operación o aquella otra, piensa que un objeto debe transformarse mediante sus operaciones y de él podrás extraer un resultado o usarlo para otros menesteres.</p>

<p>Esto, visto así de forma abstracta, parece que se entiende, pero luego, a la hora de ponerlo en práctica, no es tan fácil. Veamos un ejemplo sencillo:</p>

<p>Tengo un coche, que está formado por 3 partes: ruedas, motor y chasis. El programa que necesitas debe comprar piezas para tener coches y venderlos. Bien, en un programa estilo PP podrías hacer esto (lo que pongo es pseudocódigo, una descripción natural de lo que haría el programa, no código fuente):
<pre>Variable coche1;
Variable ListaPiezas;</pre>
<pre>Procedimiento ComprarPieza(tipo de pieza);
Procedimiento MontarPiezas(lista de piezas);
Procedimiento VenderCoche(coche);</pre>
<pre>Función Principal (
  ComprarPieza(rueda);
  ComprarPieza(rueda);
  ComprarPieza(rueda);
  ComprarPieza(rueda);
  ComprarPieza(motor);
  ComprarPieza(chasis);
  MontarPiezas(ListaPiezas);</pre>
<pre>  VenderCoche(coche1);
)</pre>
La variable <em>coche1</em> de arriba es global al programa, por tanto accesible para cualquier función que quiera vender el coche o añadirle piezas. Lo mismo le pasa a la variable <em>ListaPiezas</em>, que es una lista con las piezas que vamos comprando. No hay que hacer nada más que usarlas. Asumimos que las funciones trabajan sobre estas variables.</p>

<p>Esto, con POO, no es tan fácil como lo que aparece ahí arriba. Primero, debemos definir una &#8220;entidad&#8221; (el objeto) genérica de la que se puedan &#8220;extraer&#8221; variables que sí podemos usar, es decir, debe existir un objeto genérico <em>coche</em> del que sacaremos, cada vez que lo necesitemos, las variables <em>coche1</em>, <em>coche2</em>, etc. que será con las que podemos tratar para añadirles piezas y venderlos. Ese objeto <em>coche</em> debe tener sus propias funciones (se llaman métodos) con las que operar, porque si no, no podremos hacer nada con él. Y esto es así porque, por definición, los objetos son cerrados y nada puede acceder a sus propiedades o funciones, salvo que nosotros queramos que así sea (definiéndolos de esa forma, como públicos). Esto se hizo así en parte para evitar que los malos programadores abusasen de las variables globales y que otras funciones pudiesen tocar los valores del objeto. De esa forma, si mi objeto es sólo mío, sólo yo puedo manipular los valores de mis variables, así que siempre las tendré controladas y no habrá la posibilidad de que un error en una llamada a una función con el mismo nombre que la mía me cambie el objeto sin darme cuenta.</p>

<p>Por lo tanto, debemos definir el objeto y las funciones posibles del mismo (no lo voy a complicar en demasía, sólo para hacerse una idea). Podría quedar algo así:
<pre>Definición de Objeto Coche;
  Variable Privada rueda (es un tipo de pieza);
  Variable Privada motor (es un tipo de pieza);
  Variable Privada chasis (es un tipo de pieza);</pre>
<pre>  Procedimiento Público ComprarPieza(tipo de pieza);
  Procedimiento Público MontarPiezas();
  Procedimiento Público Vender();
Fin de la definición;</pre>
<pre>Mis variables:
Variable coche1 de tipo coche;</pre>
<pre>Función Principal (
  coche1.ComprarPieza(rueda);
  coche1.ComprarPieza(rueda);
  coche1.ComprarPieza(rueda);
  coche1.ComprarPieza(rueda);
  coche1.ComprarPieza(motor);
  coche1.ComprarPieza(chasis);
  coche1.MontarPiezas();
  coche1.Vender();
)</pre>
En este caso, el objeto real <em>coche1</em> (que proviene del objeto general &#8220;coche&#8221;) está formado por 3 piezas diferentes y, para poder montarlas (la función de montar las piezas, como es propia del objeto, ya sabe como montarlas), hay que usar su propia función de MontarPieza. No vale otra, debe ser esa.</p>

<p>Bien, parece fácil a priori&#8230; Sí, bueno, la teoría es sencilla hasta que te enfrentas a un programa real con multitud de objetos que tienen que interactuar entre sí. Entonces te das cuenta de que, de serie, todo es privado, así que aquello que era tan fácil, como llamar a una función para hacer una serie de cálculos sin mayor importancia, ahora se transforma en una mezcla de objetos que tienen que tener bien &#8220;configuradas&#8221; sus variables y funciones para ser accesibles desde otros objetos. Luego tienes el añadido de que si trabajas, por ejemplo, con Java, es tan estricto en sus definiciones que a la mínima te da un error de &#8220;incongruencia&#8221; cuando intentas llamar a una función o usar una variable que es de otro tipo (no es que esto sea malo, sólo que es muy exigente, a veces demasiado). Encima, si quieres realizar alguna función &#8220;general&#8221; para todo el programa, algo tan simple como &#8220;Sumar(numero 1, numero2)&#8221;, no hay una &#8220;sección&#8221; donde puedas colocar funciones generales globales, aquí todo son objetos y deben estar dentro de un objeto, por lo que toca crear un objeto &#8220;<em>FuncionesGenerales</em>&#8220;, y dentro definir las funciones que quieras. Esto no casa con eso de &#8220;objetos reales del mundo&#8221; del que hablaba este modelo, pero para ser coherentes con el mismo, debe ser así.</p>

<p>Bueno, en el ejemplo se ve bonito y hasta fácil de entender, pero como digo, eso es lo que parece cuando sólo tienes un objeto. Y además, esto es sólo lo básico, aún falta ver la otra parte de la definición: &#8220;&#8230; <em>herencia, abstracción, polimorfismo y encapsulamiento</em>&#8221; decía, ¿no? Aquí es donde se lía todo.</p>

<h1>Herencia, abstracción, polimorfismo y encapsulamiento&#8230; ¿ein?</h1>

<p>¿Pero&#8230; esto qué es lo que es? Con lo feliz que era yo con mis variables y mis funciones&#8230; pero chico, las cosas evolucionan. Realmente esto es lo que le da la potencia real a los objetos, lo anterior es tan sólo una organización más estricta de los datos y funciones. Os recuerdo que, para no liar al personal, seguiré hablando de funciones (para los métodos) y variables (para los atributos):</p>

<h2>Herencia</h2>

<p>Pues es una propiedad por la que un objeto &#8220;hijo&#8221; hereda de su &#8220;padre&#8221; todas sus funciones y variables, de forma que no tenga que volver a codificarlas. Ejemplo: teníamos un coche, ¿verdad? Le tuve que decir al coche que tenía chasis, motor y ruedas. Si ahora vendo también motos, tendré que volver a definir todas las piezas de la moto, que al fin y al cabo son las mismas (pero solo hacen falta 2 ruedas). ¿Qué tal si en vez de definir un objeto coche y otro moto, defino uno más genérico (el padre) llamado vehículo? Si sus hijos heredan sus propiedades, ya no tendré que definir dos veces lo mismo, me vale con decir que coche y moto son vehículos. Esto sería algo tal que así:
<pre>Definición de Objeto vehículo;
  Variable Privada rueda (es un tipo de pieza);
  Variable Privada motor (es un tipo de pieza);
  Variable Privada chasis (es un tipo de pieza);</pre>
<pre>  Procedimiento Público ComprarPieza(tipo de pieza);
  Procedimiento Público MontarPiezas();
  Procedimiento Público Vender();
Fin de la definición;</pre>
<pre>Mis variables:
Variable coche1 de tipo vehículo;
Variable moto1 de tipo vehículo;</pre>
Et voilà!! Ya tenemos todas las funciones del vehículo en coche1 y moto1, podemos hacer ahora <em>coche1.ComprarPieza(chasis)</em> y funcionará automáticamente. Lo mismo con <em>moto1</em>, sólo que para poder venderla, nos llegará con llamar dos veces a <em>moto1.ComprarPieza(rueda)</em>. Es útil, ¿verdad? Se escribe menos, cierto, pero obliga a pensar más en el diseño del programa completo, buscar puntos en común para hacer objetos lo más abstractos posibles (de forma que podamos heredar y heredar y heredar&#8230;) y&#8230; ahí empiezan los problemas. Cuanto más perfeccionas esta técnica, más liosos se vuelven los programa, sobre todo para entenderlos. De repente te encuentras un programa desconocido que pone:</p>

<p><em>motoHonda4cil600ccDobleFaro.ComprarPieza(motor4cil600cc)</em></p>

<p>Y dices tu: vaya, esto me suena a algo. Y empiezas a investigar. Primero miras qué funciones tiene <em>motoHonda4cil600ccDobleFaro</em> y te das cuenta de que tiene 1 ó 2, pero no es ésa. Pero ves que este objeto es hijo de <em>motoHonda4cil600cc. </em>Vas a buscar a ese objeto a ver si está allí la función y&#8230; tampoco, pero ves que es hijo de <em>motoHonda4cil</em> y crees que estará allí. Vaya, tampoco, pero es hijo de <em>motoHonda </em>y crees que ahora sí que sí. Error, éste es hijo de <em>vehículo</em>. ¡Vaya, por fin veo la función original, ya puedo seguir el flujo del programa! Afortunadamente, los entornos de programación actuales buscan la función por ti y siguen ese flujo, pero si ves el programa en papel es para llorar&#8230; Igual te preguntas por qué salieron tantos hijos. Sencillo: el programador quería heredar todas las características de cada uno de los padres, ya que cada padre agregaba una característica única al objeto final. Hay <em>motos</em>, algunas son marca <em>Honda</em>, algunas son de 2 <em>cilindros</em> y otras de 4, la <em>cilindrada</em> es variable (600 en este caso) y además, el chasis puede ser de <em>doble</em> faro o simple. ¿Alguna duda? <img src='https://eltamiz.com/elcedazo/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>

<h2>Abstracción</h2>

<p>Que palabra más fea, pero, en resumen, viene a decir que tú puedes usar las funciones de los objetos sin necesidad de que sepas qué hacen o cómo lo hacen. Si total, para qué lo quieres saber, con tal de que hagan lo que prometen (no como los políticos). Esto ayuda a que no te entrometas en sus funciones y así no puedas modificar su comportamiento. Por ejemplo, a tí te basta con saber que<em> coche1.MontarPiezas();</em> hace que el coche se monte con las piezas que compraste. Te da igual cómo lo haga, con tal que lo haga bien. Esa función posiblemente calcule si tiene las piezas necesarias y realice el montaje, pero en realidad a ti todo eso te da igual.</p>

<h2>Polimorfismo</h2>

<p>Si la palabra de antes era fea, ésta mete miedo y todo. Y sin embargo es muy útil y fácil de comprender. Lo que significa es que puedes tener la misma función con el mismo nombre en objetos hijos, pero que internamente hacen cosas diferentes a la misma función que hay en el padre. Con el ejemplo se ve claro: resulta que tienes tres formas (o más) de montar un coche, por ejemplo un <em>cocheNormal</em> (un vehículo), un <em>cocheHondaCupe</em> y un <em>cocheHonda5Puertas</em>. Pero tú lo que quieres es que todo el mundo use el mismo método de montar las piezas, de forma que el proceso sea siempre el mismo (es decir, que obtengas el coche montado y listo para su venta), eso sí, sólo cambia la forma de hacerlo. Con PP tendrías que definir tres funciones, ya que no podrían llamarse igual: <em>MontarPiezas, </em><em>MontarPiezasCupe</em> y <em>MontarPiezas5Puertas</em>. O bien, si más del 50% del código es igual, hacer una función con un parámetro que indicase la forma de montaje: <em>MontarPiezas</em><em>(Puertas)</em> y, según eso, en el código hacer una cosa u otra.</p>

<p>Pero llega el polimorfismo para arreglar esto de tener tres funciones diferentes (ya digo, si el código es igual en más de un 50% no merece la pena, lo arreglas con una variable que decida qué hacer). Como quieres que siempre se use la función <em>MontarPiezas</em>, pues defines en cada uno de los hijos de un objeto <em>vehículo</em> la función <em>MontarPiezas</em>, solo que el código de cada función será diferente y realizará las operaciones que necesite para obtener el coche montado:
<pre>Variable cocheNormal de tipo vehículo;</pre>
<pre>Variable cocheHondaCupe de tipo vehículo;
  Procedimiento Privado MontarPiezas() {
    Acciones abc...
  };</pre>
<pre>Variable cocheHonda5Puertas de tipo vehiculo;
  Procedimiento Privado MontarPiezas() {
    Acciones xyz...
  };</pre>
Como vemos, <em>cocheNormal</em> no define su propia función <em>MontarPiezas()</em> (viene heredada y no está aplicando el polimorfismo). Cada función definida sustituirá la del padre y realizará unas tareas propias, sin embargo, yo solo tengo que llamar a la función del objeto concreto que, gracias al polimorfismo, puede llamarse igual en cada hijo. La llamada sería así:
<pre>código para montar un coche normal...;
cocheNormal.MontarPiezas();
código para montar un coche cupe...
cocheHondaCupe.MontarPiezas();
código para montar un coche de 5 puertas
cocheHonda5Puertas.MontarPiezas();</pre>
Se puede apreciar que el nombre de la función es el mismo en todos los hijos, pero el código de cada función es diferente, obteniendo todas las funciones el mismo resultado: un coche montado y listo para vender.</p>

<h2>Encapsulamiento</h2>

<p>Bonito palabro, suena futurista y todo, pero simplemente quiere decir que unes todo lo referente a un objeto dentro de él, es decir, no deberías necesitar, para trabajar con ese objeto, nada externo. Como vimos con el coche, en la PP todo era libre y cualquiera podía hurgar en él. De hecho, el pobre <em>coche1</em> no tenía forma de evitar que nadie tocase cosas de él, era un simple títere. En la POO tenemos todas las variables y funciones dentro del objeto <em>coche</em>. Es, como si dijéramos, autosuficiente.</p>

<h1>Conclusiones</h1>

<p>No voy a ahondar más en este tema, porque hay abundante literatura de él. Tan sólo trato de dar una vista general del mismo. Como todo en esta vida, hay que buscar el compromiso adecuado entre organización y comprensión. Ni la PP ni la POO son siempre lo mejor, depende del caso que trates y de tus conocimientos.</p>

<p>Yo, por ejemplo, prefiero la PP porque:</p>

<ol>
    <li>Suelo hacer programas pequeños y simples.</li>
    <li>Es más rápido.</li>
    <li>Es más fácil de mantener.</li>
    <li>Sólo los hago yo.</li>
</ol>

<p>Sin embargo, entiendo que para ciertas tareas es mejor usar POO. Por ejemplo, si más de una persona va a trabajar en el proyecto, o si hay varios proyectos abiertos y muchas partes son comunes: puedes aprovechar tus objetos ya definidos para el otro programa. Un ejemplo sería, tengo un programa de gestión de almacén de vehículos y otro de venta: si defino el objeto vehículo en uno, es posible que tenga muchas cosas en común con el otro programa, y por tanto mucho código que tenga escrito de uno me valdrá para el otro. Esto lo facilita el encapsulamiento, ya que se supone que el objeto es &#8220;autosuficiente&#8221;.</p>

<p>Podemos decir también que la PP facilita una programación más &#8220;libre&#8221; o más &#8220;sobre la marcha&#8221;: es ideal para los improvisadores. Si en un momento determinado se te ocurre una novedad a incorporar, la flexibilidad que tiene permite meterla en &#8220;<em>ná y menos</em>&#8220;. La POO es lo contrario, deberías haber analizado bien el problema antes, reconocido y separado sus objetos, para luego definirlos y empezar a operar con ellos. Agregar una función nueva a un objeto es sencillo si la operación es &#8220;interna&#8221;, pero interactuar entre objetos ya no es tan sencillo si no lo habías planificado.</p>

<p>La ventaja de libertad de la PP es también su mayor problema: hay miles de desastrosos programas que han dado la mala fama a los lenguajes que emplean esta metodología (como Visual Basic). Sólo hay que buscar programas de ejemplo, y en más del 50% de los realizados con VB se podrán apreciar varias faltas (no obligatoriedad de declarar variables, código spaguetti, funciones sin ton ni son, etc.) Y, derivado de esto, viene la &#8220;fama&#8221; de que los que usan POO son unos <em>fieras</em> porque para eso &#8220;hay que saber&#8221;, en cambio para usar PP hasta el vecino puede&#8230; pero para usarla bien hay que ser <em>más fiera</em> que los de la POO, porque para eso necesitas buenos conocimientos, disciplina y orden (en la POO se te obliga a hacer las cosas, con lo que si no eres disciplinado, la metodología lo es por tí).</p>

<p>Por poner un ejemplo real, yo digo que suelo hacer programas pequeños, pero con VB tengo realizados (y en producción) tres programas empresariales de gestión (uno para un almacén de ropa, otro para gestión de lotes avícolas y otro para una academia a nivel autonómico), con más de 20.000 líneas de código y que llevan más de 10 años funcionando cada uno sin la menor incidencia, más allá de las típicas &#8220;nuevas funcionalidades&#8221; que demandan los clientes. Trabajan con ellos más de 20 usuarios simultaneos. Ya véis, PP con Visual Basic, ni un objeto, y funcionando sin problemas, con fácil mantenimiento y relativamente fácil ampliación de funcionalidades. Es decir, la POO no es la panacea, es sólo&#8230; otra metodología.</p>

<p>¿Cuál interesa más? Pues como dice &#8220;Jarabe de Palo&#8221; en su canción&#8230; ¡depende!</p>

<p>Bueno, finalmente comentar que he tratado de que el tema se haga de la forma más abstracta y alejada de tecnicismos posible para entender las bases. No se pretende explicar en profundidad cada metodología, para eso imagino que hay miles de páginas centradas en cada cosa. Esto pretende ser solo una orientación de “por donde van los tiros”. No sé si lo he conseguido, pero es la intención. Espero que os haya gustado este breve VS. Ahora toca empezar con el próximo combate: <a href="http://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/" class="liinternal">Sistemas cliente-servidor vs Sistemas multi-capa</a></p>
]]></content:encoded>
			<wfw:commentRss>https://eltamiz.com/elcedazo/2010/05/18/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-2-de-2/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/es/</creativeCommons:license>
	</item>
		<item>
		<title>Informática: esos locos, con sus locos cacharros – Programación procedural clásica (PP) vs Programación orientada a objectos (POO) (1 de 2)</title>
		<link>https://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/</link>
		<comments>https://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/#comments</comments>
		<pubDate>Thu, 06 May 2010 15:06:10 +0000</pubDate>
		<dc:creator>Eagle</dc:creator>
				<category><![CDATA[Eagle]]></category>
		<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://eltamiz.com/elcedazo/?p=6977</guid>
		<description><![CDATA[Bueno, pues tras la breve presentación que hice el otro día (bueno sí, hace 2 meses, perdón por el retraso), aquí vamos a empezar con mis divagaciones sobre el primer asunto que nos concierne: Programación Procedural Clásica vs Programación Orientada a Objetos, o mejor: PP vs POO (y lo voy a abreviar así siempre, que es [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, pues tras la <a href="http://eltamiz.com/elcedazo/2010/02/18/informatica-esos-locos-con-sus-locos-cacharros-presentacion/" title="Informática: esos locos, con sus locos cacharros – Presentación" target="_blank" class="liinternal">breve presentación</a> que hice el otro día (bueno sí, hace 2 meses, perdón por el retraso), aquí vamos a empezar con mis divagaciones sobre el primer asunto que nos concierne: <strong>Programación Procedural Clásica</strong> vs <strong>Programación Orientada a Objetos</strong>, o mejor: <strong>PP vs POO</strong> (y lo voy a abreviar así siempre, que es un poco peñazo escribir todo el texto cada vez).</p>

<p>Os pongo en antecedentes para que os podáis situar bajo mi punto de vista:</p>

<p><a href="http://eltamiz.com/elcedazo/wp-content/uploads/2010/04/ToshibaHX10.jpg" class="liimagelink"><img class="alignright size-full wp-image-7903" src="http://eltamiz.com/elcedazo/wp-content/uploads/2010/04/ToshibaHX10.jpg" alt="" width="450" height="338" /></a></p>

<p>Aprendí a programar yo solo con mi primer ordenador, unToshiba MSX-HX10 como el de la imagen de al lado, con sistema operativo BASIC. Esto debió ser a los 10 años, que fue cuando me lo pude comprar con los ahorros (los míos y los de mi hermana, le dije que así podíamos jugar también y coló, que tampoco fue mentira porque jugamos un montón).</p>

<p>En aquel momento triunfaban los concursos de preguntas y respuestas en la tele, así que decidí hacer uno en el ordenador. En total eran 25 preguntas y una chapuza de INPUTS e IF anidados&#8230; que funcionaba.</p>

<p>Desde entonces hasta ahora, la PP siempre me ha acompañado fielmente. En la carrera, la POO todavía era algo &#8220;novedoso&#8221; y sin mucha implantación aún, así que nos enseñaron PP y toda la teoría y las prácticas eran así: Pascal, C, Cobol y todos los lenguajes anecdóticos de la época (como Fortran o la Lista Interminable de Soporíferos Paréntesis, más conocida como LISP<sup>[<a href="https://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/#footnote_0_6977" id="identifier_0_6977" class="footnote-link footnote-identifier-link" title="Lots of Insipid and Stupid Parenthesis, que dec&iacute;an los angloparlantes">1</a>]</sup> ).</p>

<p>Ni siquiera nos enseñaron Visual Basic, que ya por entonces era el lenguaje más popular de todos, al que más cariño le tengo (los puristas me crucificarán por esto, pero qué se le va a hacer) y con el que me he sacado las castañas del fuego durante 15 años ya, aunque ahora apenas lo toque (sniff).</p>

<p>Mi primer contacto real (la teoría es muy bonita, pero si no la llevas a la práctica&#8230;) con la POO fue con Java en el año 2004, cuando por temas de mi trabajo precisaba una aplicación de consola que corriese en Linux o Windows y atacase a una base de datos Informix por un lado y Oracle por otro. Ahí fue cuando descubrí lo complejo que es cambiar de mentalidad para pasar de PP a POO (y viceversa). Y ahora sí, podemos entrar en temática.</p>

<h2>La Programación Procedural (PP)</h2>

<p>Antes de nada, debo aclarar que a veces se puede uno referir también a la programación funcional y meterlo todo en el mismo saco, pero éste no es el término exacto de lo que voy a definir, ya que la programación estrictamente funcional está basada únicamente en funciones (no procedimientos). Según la Wikipedia, <em>&#8220;La programación funcional es un </em><em>paradigma de programación </em><em>declarativa basado en la utilización de </em><em>funciones matemáticas</em><em>&#8220;.</em></p>

<p>Con esta definición, lenguajes como Visual Basic o C no entrarían ahí. Por eso aclaro que a veces se habla de la Programación Funcional queriendo incluir la Programación Procedural (PP) o, también llamada Programación Estructurada. Por ello, para resumir y no decir tantas palabras feas, cuando hable de PP en general me quiero referir tanto a PF como a PP, ya que al final todo son funciones o procedimientos colocados de una forma estructurada y coherente que dan vida a un programa.</p>

<p>Dicho esto, ¿qué es la PP (o, recordemos, estructurada)? Bueno, veamos la definición de la wikipedia: <em>&#8220;La programación estructurada es una forma de escribir programas de ordenador de manera clara.&#8221; </em>Y tan clara, añado yo&#8230; siempre que el programador tenga claro el concepto. He llegado a ver auténticos churros de código, sin sentido aparente, de recién licenciados en la carrera (lo cuál no decía nada bueno de ellos, porque una cosa es la inexperiencia y otra &#8220;el churro&#8221;).</p>

<p>Bien, básicamente lo único que se necesita para usar esta técnica es un poco de sentido común, ni más ni menos. Reglas tan sencillas como &#8220;<em>si alguna operación puede ser repetida más de una vez, crea una función que la realice</em>&#8220;. De esta forma sólo tendrás que corregir el código en un único sitio cuando falle (que fallará, casi seguro, al menos una vez). Si se tiene esto en cuenta, la PP es tan sencilla como (teniendo ya en mente el programa y, al menos, definidas sus partes básicas):</p>

<ol>
    <li>Definir las constantes y variables que necesitarás a priori, ya sean globales (sí, sí, las variables globales son válidas si se emplea el sentido común)  o locales.</li>
    <li>Definir las funciones y procedimientos que se necesitan.</li>
    <li>Indicar el flujo del programa desde el inicio hasta el final.</li>
</ol>

<p>No parece complicado, ¿verdad? En realidad no lo es, de ahí mi favoritismo por esta metodología de trabajo. Básicamente sería algo como esto:
<pre>Bloque de variables y constantes</pre>
<pre>Bloque de procedimientos y funciones:
Procedimiento 1();
Procedimiento 2();
Función 1();</pre>
<pre>Función principal donde se controla el flujo del programa:
Inicio del programa;
Mis cálculos;
Llamo a Procedimiento 1();
Llamo a Función 1();
Llamo a Procedimiento 1();
Más cálculos;
Fin del programa</pre>
¿Ventajas de esta metodología?:</p>

<ol>
    <li>Lo primero que salta a la vista: sencillez y claridad. Cualquiera entiende esta forma de trabajo fácilmente, se adapta pronto y, también, se adopta pronto.</li>
    <li>Es fácil seguir un programa, sólo hay que seguir el &#8220;hilo&#8221;.</li>
    <li>Alguien que no haya escrito el programa puede coger el código y entenderlo con cierta facilidad (esos comentarios que tan poca gente pone de forma adecuada&#8230; ¡¡ay!! ).</li>
    <li>Modificarlo es sencillo y rápido.</li>
    <li>¿He dicho ya <strong>sencillez y claridad</strong>?</li>
</ol>

<p>¿Problemas principales de esta metodología?:</p>

<ol>
    <li>No está muy indicada para trabajar en grupo, dado que tú te lo comes y tú te lo guisas hasta el final. Si te organizas muy bien sí puedes trabajar en grupo (por ejemplo se desarrollan cada uno de los procedimientos por separado y luego uno los junta todos en el código final y se prueba), pero se complica mucho el asunto por las variables globales y locales, ya que no sabes qué va a hacer el otro con ellas.</li>
    <li>Si el programador no es metódico y responsable en su trabajo puede liarla, y bien, con las variables globales y locales, dada su libertad de uso.</li>
    <li>Si el programa es muy grande, te pueden salir auténticos chorizos de código, pero esto es algo que siempre puedes arreglar si eres una persona ordenada y divides el código en partes que incluyes en procedimientos. Veamos un ejemplo de este último punto:</li>
</ol>

<p>Esto sería el código &#8220;spaguetti&#8221;, que se suele llamar (indeseable):
<pre><strong>Procedimiento 1()</strong>(
Mucho código por aquí...
Sigue mi código porque tiene muchos cálculos...
Más código...
Y más código...
...
(y muchas líneas después...)
Más código...
Fin del Procedimiento
)</pre>
Y esto el código corregido, que sería el deseable:
<pre><strong>Procedimiento 1()</strong>(
Mucho código por aquí...
Sigue mi código porque tiene muchos cálculos...
Llamar a SubProcedimiento 1_1(); (esto contendrá parte de los cálculos)
Llamar a SubProcedimiento 1_2(); (esto contendrá otra parte de los cálculos)
Fin del Procedimiento
)</pre>
Bien, aunque aquí no se aprecie por haber puesto &#8220;<em>y muchas líneas después</em>&#8220;, lo cierto es que cuando ves que eso equivale a varias páginas de texto te das cuenta de que es casi ilegible y te llega a marear. Así y todo, aún siendo malo, el código es &#8220;<em>seguible</em>&#8220;, cosa que con la POO se complica bastante más.</p>

<p>Tan buena es la PP que cualquiera puede hacer un programa con escasos conocimientos del lenguaje que elija, lo cual ha dado lugar a auténticas chapuzas, por supuesto, que, aún así, visualmente hacían lo que debían. Y es que no siempre &#8220;<em>el fin justifica los medios</em>&#8220;. Es fácil hacer algo chapucero que ofrezca el resultado esperado, pero que mañana, cuando haya que modificarlo, no haya por donde cogerlo.</p>

<p>La libertad que ofrece este modelo es, a su vez, su mayor peligro. Los que hayan vivido en el mundo empresarial desde el año 1990 hasta prácticamente el 2005 habrán podido experimentar en vivo el boom de universitarios &#8220;informáticos&#8221; que eran la &#8220;<em>leche</em>&#8220;, pero que no aplicaban precisamente las mejores técnicas de programación. Me incluyo yo ahí. El primer año que trabajé como programador de Visual Basic fue el de mi aprendizaje, con el viejo sistema de prueba/error: hacía un programa y aprendía Visual Basic a la vez. Todo iba, en realidad, pero al año siguiente, al tener que coger y aumentar funcionalidades al programa, aparecían los problemas: mal diseño, mala codificación, y nula documentación. &#8220;<em>Nunca máis</em>&#8221; me dije, y empecé a aplicar buenas prácticas y a diseñar un manual para la empresa de &#8220;<em>diseño de aplicaciones en La EMPRESA</em>&#8221; que el resto de programadores debían seguir (yo fui el primero de la empresa y luego llegaron 4 más). Hoy soy un hombre feliz, y cuando veo el código de aquellos programas, aún sé qué hacen y como modificarlos <img src='https://eltamiz.com/elcedazo/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<p>Con la introducción masiva de Java (POO) en nuestras vidas de programador, se ha perdido este encanto. Si bien C++ ya existe desde hace muchos años, la auténtica revolución del nuevo ejército de programadores POO llegó con Java. Antes, la guerra era tal que así:</p>

<ul>
    <li><em>Hola buenos días.</em></li>
    <li><em>Hola qué tal.</em></li>
    <li><em>¿Tú en qué programas?</em></li>
    <li><em>Yo en Visual Basic.</em></li>
    <li><em>Bah, eres un programador junior con poca idea, VB es de &#8220;mariquitas&#8221; que no saben usar POO. Lo auténtico es el C++, eso si que es </em><em>para machotes, con sus punteros a Null y sus miles de líneas de código eficiente&#8230;</em></li>
    <li><em>Ya bueno, yo es que tengo que hacer un programa de gestión para dentro de un mes y con C++ tardo 3 meses&#8230;</em></li>
    <li><em>Bueno, pero sería altamente eficiente ¡y con código reusable!</em></li>
    <li><em>Sí, bueno, pero si le doy de plazo 3 meses al cliente (con un coste 3 veces superior) me dice que lo haga Rita.</em></li>
    <li><em>No tenéis ni idea de manejar clientes&#8230;</em></li>
</ul>

<p>Ahora&#8230; la cosa es tan diferente&#8230; que si .NET, que si Java, que si C++&#8230; pero ninguno de estos emplea los métodos tradicionales, son todos (básicamente) POO: ¡¡ nos están aniquilando !! Ya no hay guerra, con lo divertida que era. Bueno, que ya empiezo a desviar el tema.</p>

<p><a href="http://eltamiz.com/elcedazo/2010/05/18/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-2-de-2/" class="liinternal">En la próxima entrada</a> analizaré brevemente la POO y os ofreceré mi punto de vista final (que ya vais viendo por dónde va). La verdad es que el tema es muy amplio, pero sólo trato de dar una ligera aproximación, porque si no, nos da para un libro en vez de una página. Espero vuestras opiniones. <img src='https://eltamiz.com/elcedazo/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<ol class="footnotes"><li id="footnote_0_6977" class="footnote"><em>Lots of Insipid and Stupid Parenthesis</em>, que decían los angloparlantes</li></ol>]]></content:encoded>
			<wfw:commentRss>https://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-%e2%80%93-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/es/</creativeCommons:license>
	</item>
		<item>
		<title>Informática: esos locos, con sus locos cacharros &#8211; Presentación</title>
		<link>https://eltamiz.com/elcedazo/2010/02/18/informatica-esos-locos-con-sus-locos-cacharros-presentacion/</link>
		<comments>https://eltamiz.com/elcedazo/2010/02/18/informatica-esos-locos-con-sus-locos-cacharros-presentacion/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 12:09:22 +0000</pubDate>
		<dc:creator>Eagle</dc:creator>
				<category><![CDATA[Eagle]]></category>
		<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://eltamiz.com/elcedazo/?p=6865</guid>
		<description><![CDATA[Buenas. Siguiendo el consejo de Macluskey, me he decidido a escribir una pequeña serie relacionada con lo que más entiendo y de lo que sobrevivo, la informática. Ya sé que esto suele ser un tema aburrido para los que no son informáticos y, si es demasiado técnico, hasta para los que son informáticos, por lo [...]]]></description>
			<content:encoded><![CDATA[<p>Buenas.</p>

<p>Siguiendo el consejo de Macluskey, me he decidido a escribir una pequeña serie relacionada con lo que más entiendo y de lo que sobrevivo, la informática. Ya sé que esto suele ser un tema aburrido para los que no son informáticos y, si es demasiado técnico, hasta para los que son informáticos, por lo que voy a tratar los temas de manera algo superficial y poco técnica, para mayor comprensión popular de la gente que no ha visto estos asuntos en su vida, aunque le puedan sonar de algo. Además, <strong>no pondré código fuente</strong>, si es lo que estabais temiendo.</p>

<p>También debo decir que alguna opinión personal aparecerá por aquí, si bien espero que sean pocas y razonadas.</p>

<p>Es evidente que, al ser un tema centrado en tecnologías de informática, podrá resultar completamente aburrido para gente que no tenga el más mínimo interés en estas cosas pero, como decía mi abuelo, &#8220;<em>a caballo regalado no le mires el dentado</em>&#8230;&#8221; que ya sé que no tiene nada que ver con esto que estoy diciendo, pero es que a mí siempre me ha hecho gracia este refrán.</p>

<p>Así, a bote pronto, la temática que tendrá la serie será:</p>

<ul>
    <li>Programación procedural clásica (PP) vs Programación orientada a objectos (POO): <a href="http://eltamiz.com/elcedazo/2010/05/06/informatica-esos-locos-con-sus-locos-cacharros-–-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-1-de-2/" title="Parte 1" class="liinternal">parte 1</a> y <a href="http://eltamiz.com/elcedazo/2010/05/18/informatica-esos-locos-con-sus-locos-cacharros-–-programacion-procedural-clasica-pp-vs-programacion-orientada-a-objectos-poo-2-de-2/" title="Parte 2" class="liinternal">parte 2</a>.</li>
    <li><a href="http://eltamiz.com/elcedazo/2010/06/24/sistemas-cliente-servidor-vs-sistemas-multi-capa/" class="liinternal">Sistemas cliente-servidor (2 capas) vs Sistemas multi-capa</a> (habitualmente 3).</li>
    <li><a href="http://eltamiz.com/elcedazo/2011/06/06/informatica-esos-locos-con-sus-locos-cacharros-servicios-web-ws-arquitectura-orientada-a-servicios-soa-y-demas-zarandajas-de-la-“globalizacion”-de-los-programas/" class="liinternal">Servicios web (WS), Arquitectura orientada a servicios (SOA) y demás zarandajas de la “globalización” de los programas</a>.</li>
</ul>

<p>Los dos primeros temas son controvertidos como el que más, y tienen siempre seguidores y detractores, que van desde lo superficial a lo enfermizo. No es este mi caso, yo tengo las ideas claras respecto a ellos, y trato de elegir siempre lo más conveniente para cada caso, lo cual tampoco es fácil y no siempre se acierta.</p>

<p>Espero poder empezar con estos temas cuanto antes para que me podáis ir dando vuestra opinión al respecto.</p>

<p>Un saludo a todos, y hasta pronto.</p>
]]></content:encoded>
			<wfw:commentRss>https://eltamiz.com/elcedazo/2010/02/18/informatica-esos-locos-con-sus-locos-cacharros-presentacion/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.5/es/</creativeCommons:license>
	</item>
	</channel>
</rss>
