Tarjetas CRC. Diseño de herencias.

tarjeta crc

Este es uno de los artículos de una serie sobre las tarjetas CRC. Todos ellos forman parte del libro “Descubre las tarjetas CRC”, que puedes descargar en .pdf. Lo encontrarás en la parted derecha de esta blog. Al estar licenciado como Creative Commons, no dudes en hacerlo llegar a aquellas personas a las que les pueda ser útil. Si además te gusta, puedes comprarlo en papel o para tu kindle (sólo 1,02€).

Empecemos…

Víctor estaba esperando en el aula, como cada mañana. Siempre era el primero en llegar. Llegué a pensar si se pasaba la noche allí, trabajando.

Fui el primero de los alumnos en llegar. Cuando entré, dejó de usar su portátil y decidió entablar conversación.

– Buenos días Juan Luis.
– Buenos días.
– ¿Cómo te va hasta ahora en el curso?.
– Bien, aunque con algunas dudas sobre si seré capaz de aplicar todo esto en los proyectos reales donde estaré involucrado.
– Sé que lo harás. Ya verás.
– Eso espero.
– Hoy veremos un ejemplo que tengo preparado en el que aparecen algunas cosas que todavía no hemos visto. Espero que aportes tus ideas, siempre que quieras.

Un momento. ¿Estaba aquel hombre diciéndome que no era muy participativo en el curso?.

– Espero estar hoy un poco más iluminado.

En aquel instante, empezaron a llegar los compañeros. Después de los saludos, se sentaron y recibimos todos un enunciado de un ejemplo que desarrollaríamos aquel día. El enunciado fue el siguiente:

La asociación de agricultores de la zona nos ha pedido el desarrollo de un software que les ayude a automatizar algunas tareas de los cultivos de invernadero. Para ello nos han dicho que quisieran un sistema que les permita configurar que:

  • Los invernaderos se dividan en zonas (lógicas), según los cultivos.
  • En cada zona, existan los siguientes tipos de dispositivos: de luz artificial y generadores de calor.
  • También, por zona, tener detectores de humedad de ambiente y detectores de humedad de la tierra.
  • Además, quieren tener termómetros digitales distribuidos por las zonas, así como sensores de luminosidad que permitan saber la cantidad de luz de un área.
  • Tenga un sistema de riego por aspersión que se pueda activar y desactivar por dicho sistema.

Respecto al funcionamiento, quieren que:

  • El sistema sepa en todo momento la información de los detectores de humedad de ambiente, de tierra y de luminosidad.
  • Que, a partir de unas reglas que seran por zona, el sistema pueda actuar haciendo funcionar los dispositivos de calor, los de luz artificial o el riego por aspersión, cuando dichas reglas demuestren que es necesario. Por el momento, no tenemos la definición exacta de las reglas.

Nos han pasado la lista y especificaciones de los dispositivos con los que el sistema deberá comunicarse.

– Bien. Este es el sistema a desarrollar. Vamos a hacer una sesión CRC para establecer una primera aproximación a las clases que, en principio, deberá tener este sistema. Recordad que no tenemos como objetivo el diseño final de este sistema, sino practicar con las tarjetas CRC para dar un diseño orientado a objetos. Sin embargo, como ya hemos hecho otros ejemplos desde el principio, esta vez me gustaría empezar con una primera lista de tarjetas CRC, las que veáis de manera evidente. De momento no las crearemos, sino que sólo las listaremos. Según vayamos avanzando, las iremos creando.

Después de unos minutos, entre todos decidimos que tendríamos la siguiente lista de tarjetas iniciales:

– luz artificial.
– generador de calor.
– zona.
– detector humedad ambiente.
– detector humedad tierra.
– termómetro.
– sensor luz.
– aspersor.
– regla.

– Bien, ya tenemos la lista inicial. Vamos a avanzar por una de ellas, como por ejemplo la tarjeta “luz artificial”. Juan Luis, por favor, créala y hazte responsable de ella.

– Vamos a darle algo de detalle. ¿Qué responsabilidades pensáis que tendrá esta tarjeta?.
– Yo creo que hay sobre todo una, que la de activarse y dar luz.
– También la de desactivarse – dijo Antonia.
– Correcto. Pero hay algo más. Una luz artificial tiene un lugar en donde se encuentra, una posición dentro del invernadero.

Al final, el detalle fue el siguiente:

tarjeta crc

– Sigamos, si os parece, con la tarjeta “generador de calor”. ¿Qué responsabilidades veis?.
– Que dé calor, que se pare, y su posición en el invernadero.
– Podemos decir que se active para dar calor, que se desactive para que se pare y su posición, ¿no?.

tarjeta crc

– ¿Qué ha ocurrido con estas dos tarjetas?.
– Son similares en responsabilidades.
– Sí pero, aunque sean las mismas responsabilidades, no funcionan de la misma forma. Me refiero a que activar una luz produce algo diferente a activar un generador de calor.
– Si. Sin embargo, el tema de la posición está más claro. La posición representa un mismo tipo de información en ambos casos.

Aquello quedaba claro. Pero empezaron a aparecer caras de contrariedad. Marcelo no pudo reprimirse.

– Esto supone un problema ya que, si tenemos la posición en ambas tarjetas, la estamos duplicando, y eso no conviene. Ya sabemos todos la frase que dice:

“En el desarrollo de software, cada cosa se hace una única vez y en un único lugar”.

– ¿Cómo lo arreglamos? – Víctor esperaba.
– Está claro -dijo Julián- que sólo tiene que estar en una de las tarjetas. El problema es, elegir cuál.
– Parece -seguí comentando- que ambas tienen la misma importancia, así que no veo porqué debería tener esta responsabilidad una y no la otra.
– Cierto, así que no estará en ninguna de las dos.
– ¿Una tercera tarjeta?.
– Eso es.

Esta vez, fue el propio Víctor quién cogió una tarjeta, le puso la responsabilidad, pero la dejó sin nombre.

– ¿Qué nombre tiene esta tarjeta?. Veamos. La responsabilidad que tiene, la de tener una posición, es común tanto para la luz artificial como para el generador de calor. ¿Podemos saber qué tipo de cosas son estas dos?. Dicho de otra manera, ¿Qué nombre común podrían tener?.
– Son aparatos.-dijo Julián- Uno controla la luz y el otro el calor.
– Aparatos podría ser un nombre para ambos.
– Yo les llamaría dispositivos -dije yo-.

Surgieron otros nombres como: dispositivos ambientales, dispositivos artificiales de meteorología, etc. Al final nos decantamos por el nombre “dispositivo ambiental”. Víctor añadió el nombre a la tarjeta.

tarjeta crc

– ¿Qué relación guardan “luz artificial” y “generador de calor” con “dispositivo ambiental”?
– Pues que lo son.
– ¿El qué?.
– Dispositivos ambientales.
– Dicho de otra forma, “luz artificial” es un tipo de “dispositivo ambiental” y “generador de calor” también es un tipo de “dispositivo ambiental”.

Víctor dibujó la siguiente figura en la pizarra:

tarjeta crc

– Esta relación es muy importante en el paradigma de la orientación a objetos. Se llama herencia y tiene implicación directa en la programación orientada a objetos.
– Perdona, Víctor -Marcelo era quien hablaba ahora-, pero no he entendido qué implicación tiene. Piensa que, al menos yo, no he programado todavía bajo la orientación a objetos.
– No voy a entrar en el detalle de ningún lenguaje de programación, pero pensad que aquellos lenguajes que son orientados a objetos implementan herencia. Eso significa que puedo, en el código fuente, indicar si una clase hereda de otra. En palabras puede parecer poco, pero no lo es. Si una clase hereda de otra, ya lo dice la frase, que heredará aquello de la clase que hereda. En nuestro ejemplo, si “luz artificial” hereda de “dispositivo ambiental”, significa que, por definición, heredará aquello que está definido en la clase “dispositivo ambiental”.
– ¿A que te refieres cuando dices “lo que está definido”?.
– Básicamente a sus atributos y métodos. Por tanto, es importante detectar aquellas herencias que surjan en el diseño de mi pograma orientado a objetos, ya que permiten eliminar duplicidades y conseguir más reutilización.

Entonces, Víctor  volvió al esquema de la pizarra.

– Teniendo esta estructura de tarjetas relacionadas con herencia, ¿dónde se ubica ahora la posición tanto de la luz artificial como del generador de calor?.

Aquí ya no hubo duda alguna. Todos estuvimos de acuerdo en que debía estar en la tarjeta “dispositivo ambiental”.

– Como veis, en “dispositivo ambiental” estarán todas las responsabilidades que sean comunes tanto a “luz artificial” como a “generador de calor”, dejando para estas las responsabilidades que son especificas de ellas.

tarjeta crc

Antonia decidió que todo aquello no había acabado.

– Yo creo que el aspersor también puede considerarse un tipo de dispositivo ambiental.
– ¿Porqué los crees?.
– Porque también es un dispositivo que altera de manera artificial el ambiente de una zona del invernadero, al igual que los otros dos. creo también que tiene en común la posición en donde se ubica.
– ¿Qué pensais los demás?.

Al cabo de unos segundos, Marcelo entró en el debate.

– Me parece que estamos olvidando algo importante, y es que el tema de la posición también lo tienen el detector de humedad de la tierra, el detector de humedad del ambiente, el termómetro y el sensor de luz.

Aquello produjo lo evidente, que todos ya no estuviésemos tan seguros de nuestra decisión anterior.

– Alguna solución tendrá este tema, ¿no?. – ¿dije yo eso?.

Víctor esperó. No le gustaba dar la solución sin antes darnos la oportunidad de buscarla.

– Podríamos decir que estas últimas tarjetas que ha dicho Marcelo también son dispositivos ambientales.
– Cierto. -dije- Aunque hay una posible diferencia respecto a los tres anteriores, en el sentido que son sensores que recopilan información, mientras que los primeros son dispositivos que actúan. En el fondo, todos son dispositivos, pero yo veo esta diferencia, y creo que debería estar reflejada en el diseño.
– ¿Qué os  parece si lo diseñamos así?.

Modificó la estructura de la pizarra. Quedó así:

herencia tarjeta crc

– De esta forma, asignaremos las responsabilidades a la tarjeta que corresponda. ¿Dónde estará ahora la posición de estos aparatos?.

Como había dicho Antonia, la posición era una característica común a todos los aparatos, fuesen del tipo “sensor” o del tipo “dispositivo_ambiental”, así que la decisión fue ubicarla en la tarjeta “dispositivo”.

– ¿Cómo leemos esta estructura?. Recordad que una herencia se lee con “… es un tipo de…”, así que ¿cómo leemos, por ejemplo, empezando por la tarjeta “aspersor”?.

– Un aspersor es un tipo de dispositivo_ambiental, que a su vez es un tipo de dispositivo.
– Eso es.

Y esto fue lo destacable de esa sesión CRC. Aprendimos cómo diseñar herencias en una primera aproximación.

Acerca de Isildur Fuentes

Apasionado de las buenas historias y aikidoka de la tierra.

Publicado el febrero 18, 2011 en Divulgación, Programación y etiquetado en , , , , , , , , , . Guarda el enlace permanente. Comentarios desactivados en Tarjetas CRC. Diseño de herencias..

Los comentarios están cerrados.

A %d blogueros les gusta esto: