Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 22 — #60 ✐ Capítulo 1. Introducción a los Objetos nales 11 . Sin embargo, usted quiere explicarlo, y a pesar de quejas y manipulaciones que ocurren cuando publique la estimación, parece que esta regla funciona. 1.9.3. Fase 2: ¿Cómo podemos construirlo En esta fase debe aparecer un diseño que describa qué clases hay y cómo interactúan. Una técnica excelente para determinar clases es la tarjeta Clase-Responsabilidad- Colaboración (Class-Responsibility-Collaboration) o CRC. Parte del valor de esta herramienta es que es baja-tecnología: empieza con una colección de 3 a 5 tarjeta en blanco, y se escribe sobre ellas. Cada tarjeta representa una única clase, y en ella se escribe: 1. El nombre de la clase. Es importante que el nombre refleje la esencia de lo que hace la clase, así todo tiene sentido con un simple vistazo. 2. Las «responsabilidades» de la clase: qué debe hacer. Típicamente se puede resumir por la misma declaración de las funciones miembro o métodos (ya que esos nombres pueden ser descritos en un buen diseño), pero no descarte otras notas. Si necesita hacer una selección previa, mire el problema desde un punto de vista de programador perezoso: ¿Qué objetos quiere que aparezcan por arte de magia para resolver su problema 3. Las «colaboraciones» de la clase: ¿qué otras clases interactúan con ésta «Interacción» es un término amplio a propósito; puede significar agregación o simplemente que algún otro objeto que lleva a cabo servicios para un objeto de la clase. Las colaboraciones deberían considerar también la audiencia para esta clase. Por ejemplo, si crea una clase Petardo, ¿quién va a observarlo, un Q- uímico o un Espectador El primero puede querer saber qué componentes químicos se han usado en su construcción, y el último responderá a los colores y figuras que aparezcan cuando explote. Puede creer que las fichas pueden ser más grandes por toda la información que pondrá en ellas, pero son pequeñas a propósito, no sólo para que las clases se mantengan pequeñas también para evitar tener que manejar demasiados detalles demasiado pronto. Si no puede apuntar todo lo que necesita saber sobre una clase en una ficha pequeña, la clase es demasiado compleja (a está poniendo demasiados detalles, o debería crear más de una clase). La clase ideal se entiende con un vistazo. La idea de las fichas CRC es ayudarle a realizar un acercamiento con un primer corte del diseño y que pueda obtener una visión global y después refinar su diseño. Uno de los mayores beneficios de las tarjetas CRC es la comunicación. Se hace mejor en tiempo-real, en grupo, sin computadores. Cada persona es responsable de varias clases (que al principio no tienen nombres ni otra información). Haga una simulación en vivo resolviendo un escenario cada vez, decidiendo qué mensajes envía a varios objetos para satisfacer las necesidades de cada escenario. Al pasar por este proceso, descubrirá las clases que necesita con sus responsabilidades y colaboraciones, rellene las tarjetas del mismo modo. Cuando haya pasado por todos los casos de uso, debería disponer de un primer corte bastante completo su diseño. Antes de empezar a usar fichas CRC, las mayoría de las experiencias de consultoría exitosas las tuve cuando me enfrentaba con un diseño inicial complicado estando 11 Últimamente mi idea respeto a esto ha cambiado. Doblar y añadir un 10% puede darle una estimación bastante acertada (asumiendo que no hay demasiados factores comodín), pero debe trabajar con bastante diligencia para acabar a tiempo. Si realmente quiere tiempo para hacerlo de forma elegante y estar orgulloso del proceso, el multiplicador correcto es más bien tres o cuatro veces, creo yo. 22 ✐ ✐ ✐ ✐

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 23 — #61 ✐ 1.9. Análisis y diseño al frente de un equipo, que no había construido un proyecto POO antes, y dibujando objetos en un pizarra blanca. Hablábamos sobre cómo los objetos deberían comunicarse unos con otros, y borrábamos algunos de ellos para reemplazarlos por otros objetos. Efectivamente, yo gestionaba todas las«tarjetas CRC» en la pizarra. Realmente, el equipo (que conocía lo que el proyecto se suponía tenía que hacer) creó el diseño; ellos «poseían» el diseño en lugar de tener que dárselo. Todo lo que yo hacía era guiar el proceso haciendo las preguntas correctas, poniendo a prueba los suposiciones, y llevando la retroalimentación del equipo para modificar esas suposiciones. La verdadera belleza del proceso era que el equipo aprendía cómo hacer diseños orientado a objetos no revisando ejemplos abstractos, sino trabajando sobre un diseño que era más interesante para ellos en ese momento: los suyos. Una vez que tenga con una serie de tarjetas CRC, quizá quiera crear una descripción más formal de su diseño usando UML 12 . No necesita usar UML, pero puede servirle de ayuda, especialmente si quiere poner un diagrama en la pared para que todo el mundo lo tenga en cuenta, lo cual es una buena idea. Una alternativa a UML es una descripción textual de los objetos y sus interfaces, o, dependiendo de su lenguaje de programación, el propio código 13 . UML también proporciona una notación de diagramas adicional para describir el modelo dinámico de su sistema. Eso es útil en situaciones en las que las transiciones de estado de un sistema o subsistema son bastante más dominantes de lo que necesitan sus propios diagramas (como en un sistema de control). También puede necesitar describir las estructuras de datos, para sistemas o subsistemas en los que los propios datos son un factor dominante (como una base de datos). Sabrá qué está haciendo con la fase 2 cuando haya descrito los objetos y sus interfaces. Bien, en muchos de ellos hay algunos que no se pueden conocer hasta la fase 3. Pero está bien. Todo lo que le preocupa es que eventualmente descubra todo sobre sus objetos. Es bueno descubrirlos pronto pero la POO proporciona suficiente estructura de modo que no es grave si los descubre más tarde. De hecho, el diseño de un objeto suele ocurrir en cinco etapas, durante todo el proceso de desarrollo del programa. Las cinco etapas del diseño de objetos La vida del diseño de un objeto no se limita a la escritura del programa. En cambio, el diseño de un objeto ocurre en una secuencia de etapas. Es útil tener esta perspectiva porque no debería esperar alcanzar la perfección enseguida; en lugar de eso, se dará cuenta que entender lo que hace un objeto y a qué se debería que ocurre con el tiempo. Esta vista también se aplica al diseño de varios tipos de programas; el patrón para un tipo particular de programas surge a fuerza de pelearse una y otra vez con ese problema (los Patrones de Diseño se desarrollan en el Volumen 2). Los objetos, también, tienen sus patrones que surgen del entendimiento, uso y reutilización. 1. Descubrimiento de objetos. Esta etapa ocurre durante el análisis inicial de un programa. Los objetos pueden descubrirse viendo los factores externos y los límites, duplicación de elementos en el sistema, y las unidades conceptuales más pequeñas. Algunos objetos son obvios si se dispone de un conjunto de librerías de clases. Las partes comunes entre clases pueden sugerir clases base y herencia que pueden aparecer pronto, o más tarde en el proceso de diseño. 12 Para novatos, recomiendo el mencionado UML Distilled. 13 Python (www.python.org) suele utilizarse como «pseudocódigo ejecutable». 23 ✐ ✐ ✐ ✐

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 23 — #61<br />

✐<br />

1.9. Análisis y diseño<br />

al fr<strong>en</strong>te de un equipo, que no había construido un proyecto POO antes, y dibujando<br />

objetos <strong>en</strong> un pizarra blanca. Hablábamos sobre cómo los objetos deberían comunicarse<br />

unos con otros, y borrábamos algunos de ellos para reemplazarlos por otros<br />

objetos. Efectivam<strong>en</strong>te, yo gestionaba todas las«tarjetas CRC» <strong>en</strong> la pizarra. Realm<strong>en</strong>te,<br />

el equipo (que conocía lo que el proyecto se suponía t<strong>en</strong>ía que hacer) creó<br />

el diseño; ellos «poseían» el diseño <strong>en</strong> lugar de t<strong>en</strong>er que dárselo. Todo lo que yo<br />

hacía era guiar el proceso haci<strong>en</strong>do las preguntas correctas, poni<strong>en</strong>do a prueba los<br />

suposiciones, y llevando la retroalim<strong>en</strong>tación del equipo para modificar esas suposiciones.<br />

La verdadera belleza del proceso era que el equipo apr<strong>en</strong>día cómo hacer<br />

diseños ori<strong>en</strong>tado a objetos no revisando ejemplos abstractos, sino trabajando sobre<br />

un diseño que era más interesante para ellos <strong>en</strong> ese mom<strong>en</strong>to: los suyos.<br />

Una vez que t<strong>en</strong>ga con una serie de tarjetas CRC, quizá quiera crear una descripción<br />

más formal de su diseño usando UML 12 . No necesita usar UML, pero puede<br />

servirle de ayuda, especialm<strong>en</strong>te si quiere poner un diagrama <strong>en</strong> la pared para que<br />

todo el mundo lo t<strong>en</strong>ga <strong>en</strong> cu<strong>en</strong>ta, lo cual es una bu<strong>en</strong>a idea. Una alternativa a UML<br />

es una descripción textual de los objetos y sus interfaces, o, dep<strong>en</strong>di<strong>en</strong>do de su l<strong>en</strong>guaje<br />

de programación, el propio código 13 .<br />

UML también proporciona una notación de diagramas adicional para describir<br />

el modelo dinámico de su sistema. Eso es útil <strong>en</strong> situaciones <strong>en</strong> las que las transiciones<br />

de estado de un sistema o subsistema son bastante más dominantes de lo que<br />

necesitan sus propios diagramas (como <strong>en</strong> un sistema de control). También puede<br />

necesitar describir las estructuras de datos, para sistemas o subsistemas <strong>en</strong> los que<br />

los propios datos son un factor dominante (como una base de datos).<br />

Sabrá qué está haci<strong>en</strong>do con la fase 2 cuando haya descrito los objetos y sus interfaces.<br />

Bi<strong>en</strong>, <strong>en</strong> muchos de ellos hay algunos que no se pued<strong>en</strong> conocer hasta la<br />

fase 3. Pero está bi<strong>en</strong>. Todo lo que le preocupa es que ev<strong>en</strong>tualm<strong>en</strong>te descubra todo<br />

sobre sus objetos. Es bu<strong>en</strong>o descubrirlos pronto pero la POO proporciona sufici<strong>en</strong>te<br />

estructura de modo que no es grave si los descubre más tarde. De hecho, el diseño<br />

de un objeto suele ocurrir <strong>en</strong> cinco etapas, durante todo el proceso de desarrollo del<br />

programa.<br />

Las cinco etapas del diseño de objetos<br />

La vida del diseño de un objeto no se limita a la escritura del programa. En cambio,<br />

el diseño de un objeto ocurre <strong>en</strong> una secu<strong>en</strong>cia de etapas. Es útil t<strong>en</strong>er esta perspectiva<br />

porque no debería esperar alcanzar la perfección <strong>en</strong>seguida; <strong>en</strong> lugar de eso,<br />

se dará cu<strong>en</strong>ta que <strong>en</strong>t<strong>en</strong>der lo que hace un objeto y a qué se debería que ocurre con<br />

el tiempo. Esta vista también se aplica al diseño de varios tipos de programas; el patrón<br />

para un tipo particular de programas surge a fuerza de pelearse una y otra vez<br />

con ese problema (los Patrones de Diseño se desarrollan <strong>en</strong> el Volum<strong>en</strong> 2). Los objetos,<br />

también, ti<strong>en</strong><strong>en</strong> sus patrones que surg<strong>en</strong> del <strong>en</strong>t<strong>en</strong>dimi<strong>en</strong>to, uso y reutilización.<br />

1. Descubrimi<strong>en</strong>to de objetos. Esta etapa ocurre durante el análisis inicial de un<br />

programa. Los objetos pued<strong>en</strong> descubrirse vi<strong>en</strong>do los factores externos y los<br />

límites, duplicación de elem<strong>en</strong>tos <strong>en</strong> el sistema, y las unidades conceptuales<br />

más pequeñas. Algunos objetos son obvios si se dispone de un conjunto de<br />

librerías de clases. Las partes comunes <strong>en</strong>tre clases pued<strong>en</strong> sugerir clases base<br />

y her<strong>en</strong>cia que pued<strong>en</strong> aparecer pronto, o más tarde <strong>en</strong> el proceso de diseño.<br />

12 Para novatos, recomi<strong>en</strong>do el m<strong>en</strong>cionado UML Distilled.<br />

13 Python (www.python.org) suele utilizarse como «pseudocódigo ejecutable».<br />

23<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!