Archivo del Autor de admin

Definiendo la M de MVC


En demasiadas ocasiones, al hablar de MVC, es habitual traducir “modelo” por “modelo datos”. Supongo que yo mismo lo he confundido a menudo en el pasado. Quizás por pura vagancia. La realidad es creo que no debería ser así y es lo que intento transmitir desde hace unos años ya, aunque la realidad me demuestra que es más difícil de lo que parece. Supongo que “comernos” palabras o los muchos modelos que hay y sus sinónimos, variaciones y perversiones (modelo de la aplicación, modelo de datos, modelo de negocio, o simplemente “modelo”) lo hace más complicado de lo que debería ser .


La M de MVC, y la definición del patrón lo deja claro, debería entenderse como “modelo de negocio”. Es decir, tanto los datos como las acciones que se ejecutan sobre ellos. Es decir, no deberíamos en el controlador, por ejemplo una acción de Struts, realizar estas operaciones (por ejemplo: calcular los costes de envío de un pedido), sino que deberíamos convertir los datos de entrada, etc. para después llamar a la parte del modelo que se encarga de eso. Esta división, que es más o menos la que aparece en la figura, nos permite además aislar las distintas partes favoreciendo la reutilización, las pruebas, los cambios, etc.




Diálogos, conversaciones o flujos entre páginas.

Sacado de una conversación por que acabo de tener, por si alguno le interesa esta idea que se está siguiendo de un nuevo scope.


>    Alberto Molpeceres escribió:
>    Hola,
>    Umm... no, no sé como se hacen los forward en Struts2 (pero la
>    solución la has dado tú, es con el forward!), porque nunca he usado
>    Struts2.
>    Sobre spring.... bueno, no es complicado. Aunque aún no tengo claro
>    que es lo mejor desde un punto de vista profesional (Struts2 o
>    SpringMVC). Ha habido tanta confusión sobre Struts2, que simplemente
>    me plantea dudas.

>    On 4/4/07, xxxxx  wrote:
>    La teoría es esa, con el forward, el problema es que creo que cada vez
>    que
>    hago el submit en la jsp de marras vuelve a instanciar el Action que
>    utilizo
>    y donde tengo la colección de TOs que quiero mantener sin tener que volver
>    a
>    pedirla a Hibernate.
>    Bueno, seguiré investigando, gracias de todos modos.

>    Alberto Molpeceres escribió:
>    Ah!.
>    Nope, entonces no te había entendido :-D.
>    Pensaba que pasabas el control de una acción a otra en la misma
>    petición. Si quieres hacer eso que comentas, tienes que usar la
>    sesión, que para eso está. Struts es “famoso” de toda la vida por

>    seguir la idea de “one-action-instance-per-request”.
>
>    Umm… en serio, yo te recomendaría echarle un ojo al contenedor (y
>    sólo al contenedor!) de spring, en esto te iba a ayduar “infinito”.

>    On 4/4/07, xxxxx  wrote:

>    Ok, no quería guardarlo en sesión precisamente para que no se llene de
>    datos descontroladamente y así no relentizar la aplicación.
>
>    Recuerdo que con Struts 1.x, supongo que al tener los formularios en
>    diferentes clases, podía acceder a los datos del formulario cada vez que
>    llamaba al mismo action y continuaba ejecutando los forwards. Esto se debe
>    haber perdido al fusionar el formulario y el action en Struts 2…
>    empezamos
>    bien… hehe.
>
>    Seguiré tu consejo y me miraré el contenedor de spring.

>
>    Alberto Molpeceres escribió:
>    Hombre. Ya sabes que existen tres contextos: request, session y
>    application, que es dónde se pueden dejar las cosas.
>    Últimamente muchos frameworks (seam, myfaces, spring mvc, shale, etc)
>    están incporporando un cuarto, llamado “diálogo” o “conversación”.
>    Esta pensado para agrupar varias request en un contexto, pero sin
>    llegar a ser la sesión. Vamos, por ejemplo, para hacer un wizard de
>    tres pantallas. Espero haberme explicado.
>    El de Spring se llama Webflow, y aunque no sé decirte que tal va,
>    existe una integración para Struts2: http://cwiki.apache.org/S2PLUGINS/spring-webflow-plugin.html
>
>    Ya me contarás. Si sale bien espero unas entradas en javaconganas!. Y si no
>    sale, también, entradas en JCG!!!!!!.
>
>        al.

> On 4/4/07, xxxxx  wrote:
>
>  Ostras gracias, me miro el plugin enseguida a ver que tal va.
>

Maneras de vivir

Y no, no me refiero a la canción de Leño, un clásico. Los dos últimos sábados, he tenido dos reuniones similares pero muy diferentes. De empresas pequeñas que buscan una forma de hacerse un hueco, aunque el concepto de pequeño es muy distinto en ambos casos, como también lo es el de hueco. No es que sean opuestas, pero por un lado se busca dominar el mundo, por el otro vivir de otra forma. En un lado hay sueños, en el otro ambición.

¡Qué se le va a hacer, yo soy un soñador!.

No sé si estoy en lo cierto
lo cierto es que estoy aquí
otros por menos se han muerto
maneras de vivir.

Descuélgate del estante
y si te quieres venir
tengo una plaza vacante
maneras de vivir.

¿Cuánto me cuesta un cliente?

Todos tenemos claro que cuesta mucho conseguir un cliente. Muchas visitas, muchas ideas, pocos éxitos (proporcionalmente). También sabemos que conseguir un cliente nuevo cuesta seis veces lo que cuesta mantener a un existente. Pero…. ¿existe un momento en que sea mejor perder un cliente que mantenerlo?, ¿en qué momento deja de ser un cliente rentable?.

Supongamos que tengo un cliente. Consigo venderle 3000 euros (con lo que sea, no importa). Mi coste de ejecución (o lo que tenía pensado imputar al coste que tuvo el producto, para amortizarlo) es 2000, y los otros 1000 son “ganancias”. ¿Todo bien, no?.

Lo primero que se nos olvida es que con esos 1000 euros tenemos que financiar nuestras labores comerciales, no son gratis. Pero no es eso lo que más nos puede preocupar, o al menos no lo que nos va a decir si es mejor perder un cliente que mantenerlo (aunque es un coste importante). Y es que lo que realmente va a decidir si un cliente es rentable o no es el tiempo que te consuma después de poner en marcha el proyecto/producto/solución.

Digamos que este cliente te llama casi todos los días, que siempre te tiene media hora al teléfono. 4 días x 30 minutos = 2 horas semanales. Nuestro precio/hora… por simplificar, 50 euros/hora, es decir, 100 Euros/semana, 400 Euros/mes. Mantener ese cliente me puede costar 400 euros/mes. Aunque le cobre un mantenimiento mensual de 400 Euros (que es difícil que sea, aunque no imposible), me esta consumiendo ese ingreso sólo en el teléfono. Es decir, las labores de mantenimiento de verdad se las estoy regalando, sea eso lo que sea. Ups. Y es que da igual lo que hagamos, producto, proyecto o servicio, deberíamos siempre saber lo que nos cuestan las cosas, desde que iniciamos el contacto hasta que el cliente nos deja (o nosotros le dejamos).

Oí decir a un profesor que lo que se mide se puede controlar, lo que se puede controlar se puede mejorar, y es que sin llegar a exagerar, deberíamos tener en cuenta que todo tiene un coste. No basta con no perder dinero, hay que ganarlo.

Cosas que nunca te dije.

Imagina que tienes un cliente. Te llevas bien, hablas de muchas cosas, todo perfecto, demasiado perfecto. Hasta que las cosas no son como parecen (algo que casi siempre sucede). Te habla, le escuchas, le das tu opinión, te ignora, te vuelve a preguntas, se la vuelves a dar, entras, sales, dejas de entrar. Apuestas y estas dispuesto a hacer muchas cosas, sin embargo siempre se vuelve a lo mismo, por delante muy bien, por la espalda mejorable. Paciencia mutua, supongo, tampoco uno es un ángel ni está para dar reprimendas a nadie.


Hasta que un día te llama y lo que podía haber tenido regalado hace meses lo busca fuera (me imagino que pagando). Y lo primero que le dicen (o cree entender) es que PHP es mejor que Java para el SEO (toma ya, me suena a confundir java con javascript) y ves la luz: yo lo dejo. Se pueden aceptar muchas cosas pero uno es mayorcito para tonterías. Mejor para todos.

Pequeña joya: XML/SWF charts

Hace unas semanas mi autodeclarado familiar me enseñó XML/SWF charts. Pequeño, simple, potente y barato (45USD). De las mejores herramientas que he visto para crear gráficos para la web. Quizás sea ese su mayor problema, que es sólo para la web (existe algo para reproducir flash en una aplicación Swing?).


Algunos ejemplos en su galería. Exactamente igual que jFreeChaart no es, ¿verdad?.

La carga perezosa: hibernate vs jdo

Tengo que mirar más en detalle JPA (Java Persistence Api), pero si los propios miembros de la especificación lo suponen un subconjunto de JDO (Java Data Object), es de suponer que sea parecido. De todos es conocido el problema de Hibernate (y cualquier ORM) con lazy loading, de hecho ya hemos hablado aquí sobre ello. Básicamente sucede cuando después de cerrar el la transacción en el controlador (una acción de struts por ejemplo, o una clase de servicio) queremos cargar objetos relacionados definidos como lazy en la vista. Ahí aparece el temido LazyInitializationException.


Hoy no voy a hablar de eso, ya hay soluciones como el OpenSessionInView (he olvidado el término patrón a propósito), o más inteligentes, como utilizar Spring, por mucho que a alguno le pese. Pero en lugar de eso, voy a hablar de un desconocido, y como lo resuelve él: JDO, por si alguien tiene que escoger un ORM y se niega al borreguismo (dicho esto sin acritud hacía Hibernate, sino simplemente quiere ver distintas opciones, que nunca es malo).


En JDO, al igual que la mayoría de los ORM, tenemos por una parte nuestros beans, por otra la base de datos, y en medio tenemos un fichero con metainformación que relaciona ambas cosas, normalmente un xml. Sin entrar en detalles de como se trabaja con JDO, casi todos podrán entender:

        
            
            
                
            
            
                
            
            
                
                
            
            
                
                
            
            

            
            
                

                
                
            

        



Esta es la definición de una clase Task, que tiene varias relaciones (los campos primitivos no hace falta definirlos si nos valen los valores por defecto). La parte interesante es la del final, la llamada fetch-group.


Y es que por defecto se cargan las relaciones de forma perezosa, como en casi todas partes (y por tanto tendríamos el mismo problema). En JDO podemos definir distintos fetch-groups, para distintos usos normales de la clase, definiendo que queremos que se cargue en esos casos. Por ejemplo, en este caso, cuando cargamos un grupo de Task para un listado, se cargará el grupo por defecto (primitivos + String + Date, pero no relaciones, salvo status porque así lo hemos definido), pero cuando queremos mostrar una página de detalle, nos interesa tener a mano información sobre el tipo de tarea que es (taskType), su estado (en este caso es un objeto, no un valor, status), o si tiene añadidos varios fallos (bugs). Dejamos sin cargar los partes de horas, historial de cambios, etc.

Simplemente a la hora de hacer la consulta haremos algo así como (escribo de memoria):

query.getFetchPlan().addFetchGroup("detailsPage");



Limpíto, ¿no?.

Hacer grupo estando lejos

Esta tarde comentaba con Jordi de The Init (por cierto, interesante empresa aunque aún tengan la web que tienen) sobre como trabajar con gente que esta fuera de la oficina y aún así conseguir cierto sentimiento de pertenencia, de compartir una idea. Existen miles de programas para mensajería instantánea, pero la verdad es que no sé si son una solución si lo que quieres es conseguir ese sentimiento de grupo.

Hace ya tiempo conocí Campfire, pero no ha sido hasta hace relativamente poco cuando lo he empezado a utilizar regularmente gracias a mi autodeclarado familiar, y hay que reconocer que es otra cosa. Una aplicación que de simple es ridícula, que cualquier informático podría hacer sin demasiados problemas, pero tiene algo que hace va más allá de la mensajería.


O quizás yo soy muy raro.

Un poco de ayuda: PROFIT 2007

Para el tipo de empresas de las que hemos hablado en este blog no es que sea la solución a nuestros males (ya hemos comentado circunstancias de las subvenciones en el pasado), pero en todo caso… ya se han publicado las convocatorias para los PROFIT 2007 (Programa de Fomento de la Investigación Técnica). La información correspondiente a estas convocatorias puede encontrarse en la web del Ministerio.

El próximo día 15 de febrero está prevista la celebración de una Jornada de presentación en el salón de actos del MITYC (Paseo de la Castellana, 160, 28046 Madrid). El orden del día se encuentra publicado en http://www.mityc.es/Colabora/Eventos/Inscripcion/, donde deberán registrarse para poder asistir a tal evento.

Si alguno se pasa, que haga un resumen por aquí. Lastima que yo voy a Madrid el día 16.

Lo prometido es deuda: curso de JSF

Listo.

  • Reunir tiempo necesario
  • Temario publicado
  • Normas publicadas
  • Fecha de inicio publicada

El que quiera apuntarte al curso puede leer como funciona aqui y ver los detalles del curso aquí.

Veremos que tal sale.



Close
E-mail It