Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO
✐ ✐ ✐ “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 ✐ ✐ ✐ ✐
- Page 9 and 10: ✐ ✐ ✐ “Volumen1” — 2012
- Page 11 and 12: ✐ ✐ ✐ “Volumen1” — 2012
- Page 13 and 14: ✐ ✐ ✐ “Volumen1” — 2012
- Page 15 and 16: ✐ ✐ ✐ “Volumen1” — 2012
- Page 17 and 18: ✐ ✐ ✐ “Volumen1” — 2012
- Page 19 and 20: ✐ ✐ ✐ “Volumen1” — 2012
- Page 21 and 22: ✐ ✐ ✐ “Volumen1” — 2012
- Page 23 and 24: ✐ ✐ ✐ “Volumen1” — 2012
- Page 25 and 26: ✐ ✐ ✐ “Volumen1” — 2012
- Page 27 and 28: ✐ ✐ ✐ “Volumen1” — 2012
- Page 29 and 30: ✐ ✐ ✐ “Volumen1” — 2012
- Page 31 and 32: ✐ ✐ ✐ “Volumen1” — 2012
- Page 33 and 34: ✐ ✐ ✐ “Volumen1” — 2012
- Page 35 and 36: ✐ ✐ ✐ “Volumen1” — 2012
- Page 37 and 38: ✐ ✐ ✐ “Volumen1” — 2012
- Page 39 and 40: ✐ ✐ ✐ “Volumen1” — 2012
- Page 41 and 42: ✐ ✐ ✐ “Volumen1” — 2012
- Page 43 and 44: ✐ ✐ ✐ “Volumen1” — 2012
- Page 45 and 46: ✐ ✐ ✐ “Volumen1” — 2012
- Page 47 and 48: ✐ ✐ ✐ “Volumen1” — 2012
- Page 49 and 50: ✐ ✐ ✐ “Volumen1” — 2012
- Page 51 and 52: ✐ ✐ ✐ “Volumen1” — 2012
- Page 53 and 54: ✐ ✐ ✐ “Volumen1” — 2012
- Page 55 and 56: ✐ ✐ ✐ “Volumen1” — 2012
- Page 57 and 58: ✐ ✐ ✐ “Volumen1” — 2012
- Page 59: ✐ ✐ ✐ “Volumen1” — 2012
- Page 63 and 64: ✐ ✐ ✐ “Volumen1” — 2012
- Page 65 and 66: ✐ ✐ ✐ “Volumen1” — 2012
- Page 67 and 68: ✐ ✐ ✐ “Volumen1” — 2012
- Page 69 and 70: ✐ ✐ ✐ “Volumen1” — 2012
- Page 71 and 72: ✐ ✐ ✐ “Volumen1” — 2012
- Page 73 and 74: ✐ ✐ ✐ “Volumen1” — 2012
- Page 75 and 76: ✐ ✐ ✐ “Volumen1” — 2012
- Page 77 and 78: ✐ ✐ ✐ “Volumen1” — 2012
- Page 79 and 80: ✐ ✐ ✐ “Volumen1” — 2012
- Page 81 and 82: ✐ ✐ ✐ “Volumen1” — 2012
- Page 83 and 84: ✐ ✐ ✐ “Volumen1” — 2012
- Page 85 and 86: ✐ ✐ ✐ “Volumen1” — 2012
- Page 87 and 88: ✐ ✐ ✐ “Volumen1” — 2012
- Page 89 and 90: ✐ ✐ ✐ “Volumen1” — 2012
- Page 91 and 92: ✐ ✐ ✐ “Volumen1” — 2012
- Page 93 and 94: ✐ ✐ ✐ “Volumen1” — 2012
- Page 95 and 96: ✐ ✐ ✐ “Volumen1” — 2012
- Page 97 and 98: ✐ ✐ ✐ “Volumen1” — 2012
- Page 99 and 100: ✐ ✐ ✐ “Volumen1” — 2012
- Page 101 and 102: ✐ ✐ ✐ “Volumen1” — 2012
- Page 103 and 104: ✐ ✐ ✐ “Volumen1” — 2012
- Page 105 and 106: ✐ ✐ ✐ “Volumen1” — 2012
- Page 107 and 108: ✐ ✐ ✐ “Volumen1” — 2012
- Page 109 and 110: ✐ ✐ ✐ “Volumen1” — 2012
✐<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 />
✐