Suena bien el título… 🙂 y aunque a primera vista, podamos pensar que la entrada va a tratar del paradigma clásico «Divide y vencerás», en este caso concreto, se nos vuelve a hablar de un tema recurrente y ya conocido en el blog, como lo es la separación del interfaz del usuario de las reglas de negocio. Como el autor de la entrada nos dice, Cobus Kruger, justo al empezar, en las primeras lineas:
One of the most important principles in building complex software systems, is detaching the business logic from the screens that allow users to view and edit information.
Esta introducción pertenece al blog Source Code Adventures y concretamente al artículo:
escrito en Noviembre del 2009. A él nos vamos a referir en esta ocasión.
Además, por la cantidad de comentarios y lo leído en otra entrada posterior de su blog, me dió la impresión de que tuvo mayor repercusión de lo que él hubiera esperado, cosa que no era de extrañar, la verdad, porque su contenido es bastante sugerente, como veremos más adelante, ya que se apoya en la RTTI (Informacion de tipos) para vincular los controles de edición con la capa que soporta las reglas de negocio.
Pero realmente, la idea de citar el artículo y profundizar en su contenido, ha sido bastante accidental, como casi todo lo que nos ocurre en el blog. 😉 Uno se sienta a media tarde a buscar información sobre el último update, con la sana idea de compartirlo con vosotros, y tras una búsqueda inutil en el sitio de Embarcadero (yo esperaba encontrar mas información sobre las referencias 274215, 275149 y 275253 citadas como identificadores en el readme del Hotfix que publica Tim DelChiaro) caí como hoja del arbol, otoñal, hasta la entrada ID: 27468, MvFramework and Sample, escrita por Leonardo M. Ramé en el CodeCentralde Embarcadero. Me equivoqué… jajaja pulsando sobre CodeCentral en lugar de Quality Central… por eso de que los dos acaban en Central… 😀
Y de igual forma, fue también casual que diera un problema la descarga del código fuente… Y como sabueso, al ver una referencia citando el artículo motivo de estas lineas, decidí saciar la curiosidad y ver que contenía «eso» que aparentemente hablaba de frameworks. Pensaba para mi… ¡hombre! ¡si está publicado en Embarcadero posiblemente sea porque aporte algo que pueda ser de interés! 🙂 y con ese espiritú proseguí la cacería intelectual.
El siguiente paso vendría a ser inspeccionar el blog http://leonardorame.blogspot.com/ de Leonardo M. Ramé, de Argentina. Y ya para finalizar esa sesión, aterrizaba vía google sobre la entrada original que nos habla de «la gran división», entrada que había servido como base para la respectiva de Leonardo. Por cierto, permitidme antes de proseguir en esa linea, que os recomiende la lectura del blog deLeonardo, ya que he visto bastante contenido que tiene muy buena pinta. Me lo apunto en la agenda para volver a él más adelante…
Seguimos y nos centramos en lo que hoy nos ocupa:
Inducing The Great Divide (by Cobus Kruger)
Como otros muchos artículos que hemos compartido, éste también está en inglés y quizás por eso el remarcarlo, porque fácilmente se nos podría pasar inadvertido y resulta muy interesante el tratamiento que le da al uso de la información de tipos, vinculando a través del nombre del control la propiedad adecuada a la que va a estar enlazado. El ejemplo que pone Cobus es bastante claro. Aunque, como todos los ejemplos, es eso… un ejemplo, una sugerencia, un punto de partida.
La única pega, es que este tipo de ejemplos, tal y como está presentado, suelen desanimar a muchos compañeros que están empezando, pues no suelen incluir el código fuente, sino que uno va extrayendo de los bloques leídos y montando en el editor de código lo comentado en la entrada. Así que no tenéis que desanimaros.
Venga, ya que no lo disponemos traducido, os ayudo un poco en esa tarea, porque una vez que lo veais en funcionamiento vais a comprender mejor el sentido de un uso inteligente de la información de tipos:
Abrid un nuevo proyecto. Cambiad el tamaño del formulario para que quede similar al que muestra Cobus en su artículo.
Como se puede ver, tenéis que añadir 2 componentes de la clase TEdit, 1 TComboBox, 3 TLabel, uno para cada uno de los editores de texto y finalmente, 3 botones, para lo que os puede servir 3 componentes de la clase TButton. Cambiar los captions de las etiquetas y de los botones con un texto similar al que se ve en la imagen.
Luego nos propone añadir una instancia de TPerson. Lo vamos a hacer: pero tenemos que declarar previamente la clase y para eso, podéis poner en la sección de tipos del formulario entre la palabra reservada type y el encababezamiento de la declaración del formulario, el interfaz de dicha clase. Haced un copia y pega del bloque que nos propone (el bloque de código en el que figura la declaración de la clase TPerson y que contiene los campos Nombre, Edad y Ocupacion, con sus respectivas propiedades de lectura/escritura). Finalmente, podéis añadir las variable que nos va a servir para instanciar la clase, en la sección privada del formulario.
Otro requisito es que el nombre de los dos componentes TEdit (la propiedad Name) y del componente TComboBox tiene que ser asignado con el mismo nombre que hemos declarado las propiedades publicadas en la clase TPerson. Cobus permite varias alternativas ya prefijadas (o coincidir el nombre, o coincidir el nombre + ‘sufijo’ o finalmente coincidir un prefijo y el nombre). Mi consejo es que para no liaros con el ejemplo, tengan el mismo nombre.
Ahora añadid una unidad al proyecto para incluir la declaración de tipos de la clase estrella: TObjectBinding.
De nuevo copiamos y pegamos en su interior los distintos bloques que componen tanto la interfaz como la implementación.
Tenemos que incluir en la sección de uses (previa al tipo) la dependencia de otras unidades para que resuelva los tipos externos que contiene el código y que estan definidos lógicamente en otras unidades.
Y ya para finalizar, volvemos a la unidad del formulario y nos resta seguir sus recomendaciones al implementar los botones. Yo he escrito unas lineas de código siguiendo esas indicaciones:
procedure TFormularioPersona.bnCargarClick(Sender: TObject); begin Binding.Load; end; procedure TFormularioPersona.bnLimpiarClick(Sender: TObject); begin LimpiarFormulario; end; procedure TFormularioPersona.bnSalvarClick(Sender: TObject); begin Binding.Save; end; procedure TFormularioPersona.FormCreate(Sender: TObject); begin Person:= TPerson.Create; PreparamosDatosArticulo; Binding:= TObjectBinding.Create(Self, Person); end; procedure TFormularioPersona.FormDestroy(Sender: TObject); begin FreeAndNIl(Person); FreeAndNil(Binding); end; procedure TFormularioPersona.LimpiarFormulario; begin Name.Clear; Age.Clear; Occupation.Text:= ''; Occupation.ItemIndex:= -1 end; procedure TFormularioPersona.PreparamosDatosArticulo; begin with Occupation.Items do begin Add('Programador'); Add('Ama de casa'); Add('Cocinero'); end; with Person do begin Name:= 'Pedro'; Age:= 34; Occupation:= 'Cocinero'; end; end; end.
Y ya podéis compilar el proyecto y ejecutar la aplicación. ¡voila!
Si habeis obtenido exito al ejecutar la aplicación y habéis jugado con los botones, cargando y salvando los valores existentes, o sobrescribiendolos, estaréis de acuerdo conmigo en que el resultado final es un formulario bastante «limpio» de código y versatil, con una ruptura clara entre el interfaz del usuario y la capa lógica representada por la instancia de TPerson.
Es más, se produce la paradoja de que cuantos mas controles existan, mas claro será nuestro código respecto a otras unidades diseñadas mediante asignaciones directas entre los valores guardados por el controles y los campos que vinculados del objeto. Ya que toda la lógica de la relación de vínculos creados se almacena de forma trasparente por quien sabe realmente de ello: la clase TObjectBinding (apoyandose en la información de tipos)
Estoy completamente seguro, que tras la lectura, muchos compañeros habrán visto útiles algunos escenarios en los que puede aplicarse. Pero lo dicho: es un punto de partida, una sugerencia. El código es muy interesante y sobretodo didáctico.
Me gustaria que opinarais sobre la entrada de Cobus ¿que os parece?
Se que muchas de las personas que comienzan sus primeros pasos en el entorno, van a agradecer ese tipo de indicaciones, los comentarios, conocer por otro compañero la oportunidad de hacerlo o de no hacerlo. Así que tenéis la oportunidad de mojaros… 😉
¿Alguien opina?
O:-)
Deja una respuesta