¿Cómo abordas el diseño de clase en OOP?

12

Cuando intento diseñar una solución OO, generalmente uso el modelo CRC en el que enumero los nombres de clase (sustantivos), lo que hacen (verbos) y cómo colaboran con otras clases.

Este blog tiene lo siguiente que decir sobre este enfoque de sustantivo-verbo

   ...This approach, which I will call “noun and verb,” is so limited 
   I’ll dare to call it brain damaged....

Mi pregunta es, ¿existe una mejor técnica de modelado para usar el enfoque OO?

Vinoth Kumar CM
fuente
1
Suponiendo que la oferta $$$ tiene sentido, simplemente comience a codificar. Cuando esté atascado, encuentre una manera de eliminar los obstáculos. Re-factorizar más tarde. "CRC" no es algo de lo que haya escuchado antes, pero eso no me impidió escribir clases. Si hubiera un gran principio mecánico, alguien habría hecho una buena herramienta de análisis de código al usarlo y sería popular. Hasta que encuentre tal cosa, continuaré usando mi intuición. Por supuesto, uno tiene que usar verbos y sustantivos en los lugares correctos ...
Job
1
Yeesh Simplemente obtenga un modelo mental rápido del sistema y comience a escribir código. Sé que muchos estarán en desacuerdo conmigo aquí, pero puedes sobreanalizar estas cosas hasta la muerte. Mientras tenga una buena cantidad de experiencia, debe tener una idea de qué funcionará y qué no. Si algo resulta difícil de trabajar desde el principio, cámbielo y ahora tiene aún más experiencia.
Ed S.

Respuestas:

12

Para ser justos, él agregó "En diversión" a esa afirmación.

Hasta el día de hoy, tiendo a comenzar modelando sistemas utilizando el enfoque de "sustantivo y verbo", pero a lo largo de los años he descubierto que TDD nos enseña que este enfoque atrae su atención hacia lo incorrecto. En este sentido, el blogger tiene un punto. Sin embargo, no estoy seguro de que sea el enfoque el culpable, más que la forma en que funcionan nuestras mentes.

Si quieres probar un pequeño desafío aquí, deja de leer e intenta modelar el juego Monopoly, usando el idioma inglés, luego vuelve aquí.

Sospecho que la tentación será mirar de inmediato los objetos con los que interactuamos mucho: el tablero, los espacios, las cartas, los dados, las piezas, pero esa no es la mayor parte de la lógica. La mayoría de estos objetos son completamente tontos. Datos, si quieres.

Pero tan pronto como comienzas a escribir pruebas, te das cuenta de qué objeto es, con mucho, el más importante en cualquier juego: las reglas.

¿Recuerdas esa pequeña hoja de papel que leíste una vez la primera vez que obtuviste el juego y no interactúas de nuevo hasta que hay una disputa? La versión computarizada no funciona de esa manera. Cada cosa que el jugador intenta hacer, una computadora consultará las reglas y verá si puede hacerlo o no.

Cuando lo piensas, haces lo mismo, pero como lleva tiempo leer las reglas en papel y tu cerebro tiene un sistema de almacenamiento en caché razonable, consulta las reglas en tu cabeza. Es probable que a una computadora le resulte fácil leer las reglas nuevamente, a menos que estén almacenadas en la base de datos, en cuyo caso también podría almacenarlas en caché.

Y esta es la razón por la que TDD es tan popular para conducir el diseño. Debido a que tiende a conducir su proceso de pensamiento rápidamente a los lugares correctos:

Cuando pienso que voy a escribir algunas pruebas para mi juego Monopoly. Podría mirar mi set e intentar encontrar los objetos. Entonces, tenemos estas piezas. Escribiré algunas pruebas para eso.

Tal vez tendré un MonopolyPiece de clase base y cada tipo de pieza derivará de ellos. Comenzaré con el DogPiece. Primera prueba ... ahh. En realidad, no hay lógica aquí. Sí, cada pieza se dibujará de manera diferente, por lo que podría necesitar un DogDrawer, pero mientras estoy desarrollando el juego, solo quiero escribir "D" en la pantalla. Voy a darle vida a la interfaz de usuario al final.

Encontremos alguna lógica real para probar. Hay muchas de estas casas y hoteles, pero no necesitan pruebas. Dinero no. Tarjetas de propiedad, no. Y así. Incluso la placa no es más que una máquina de estado, no contiene ninguna lógica.

Rápidamente descubrirá que le quedan tres cosas en la mano. Las cartas de Oportunidad y Cofre comunitario, un par de dados y un conjunto de reglas. Estas serán las partes importantes para diseñar y probar.

¿Lo viste venir cuando escribiste los sustantivos y los verbos?

De hecho, hay un gran ejemplo en los patrones y prácticas de principios ágiles de Robert Martin en el que intentan desarrollar una aplicación Bowling Score Card usando TDD y encuentran todo tipo de cosas que pensaban que eran clases obvias con las que no valía la pena molestarse.

pdr
fuente
No puedo entender por qué TDD es una respuesta para hacer un análisis OO sobre el que pregunta el OP. El sustantivo / verbo es la primera aproximación del dominio del problema (lo más útil para los principiantes) y, por supuesto, las clases de refinado se pueden hacer más tarde, pero la afirmación de que TDD dirige el diseño en la dirección correcta es, en mi humilde opinión, totalmente errónea (¿realmente sugiere omitir la planificación? , diseñar y comenzar a codificar ?!). El ejemplo de Monopoly también es engañoso, dependiendo de en qué parte del sistema esté trabajando: UI o lógica central. En UI, los dados laterales y demás no tienen mucho sentido.
Roman Susi
+1 y favorito. Primero, mi experiencia es que TDD conduce su proceso de pensamiento rápidamente a los lugares correctos (Bueno, a veces podría discutir sobre "rápidamente"). Y también puede ayudar a revelar defectos de diseño desde el principio: ¡aprenderá la inyección de dependencia si nada más! Verbo sustantivo : ¿quién no comienza aquí? Pero la mayoría de estos objetos son completamente tontos. Datos, si quieres es profundo. El título de un libro seminal lo dice todo para mí Algoritmos + Estructuras de datos = Programas
radarbob
3

Nunca he encontrado tales métodos útiles para mí. De hecho, descubrí que usarlos simplemente me confunde peor. Echa un vistazo a la cafetera de Robert C. Martin , no creo que use este tipo de enfoque tampoco.

Una cosa que me molesta de inmediato es la solución a la que llega la persona en el artículo de CRC al que se vincula. La colaboración Cliente / Pedido no es algo que considero que valga la pena, no como está escrito de todos modos. No hay nada particularmente interesante en ese modelo sobre un Cliente que merezca el estado de la clase. Lo único interesante de ser un "cliente" es que hay una o más órdenes asociadas con esa Persona .

El modelo de la universidad también. Hay muchas cosas que pueden, y probablemente deberían compartirse entre el Estudiante y el Profesor. Además, ¿qué sucede cuando un profesor toma una clase, ya que a menudo se permite de forma gratuita en los campus universitarios?

Supongo que podría ser una práctica valiosa, un elemento en el kit de herramientas de diseño. Sin embargo, no creo que deba ser la única forma de abordar el diseño. Francamente, encuentro que el enfoque de análisis de variación / comunidad es más útil. Me parece modelar muy de cerca lo que hacemos al clasificar las abstracciones durante la vida cotidiana.

Editar: Acabo de leer la mitad de ese segundo blog y tengo que decir que estoy bastante de acuerdo. Tendré que leer el resto y ver qué ofrece en términos de aprendizaje.

Edward extraño
fuente
2
Error: Línea 2: hipervínculo no válido
Cracker
1
El software SE lo manguera. Estaba funcionando bien en la vista previa. Aquí está el enlace en forma de texto: objectmentor.com/resources/articles/CoffeeMaker.pdf
Edward Strange el
0

Mi opinión es que las clases deben agregarse (y eliminarse) a medida que codifica para separar las preocupaciones y reducir las dependencias. Tener fluidez en los patrones de diseño es probablemente una buena apuesta para ver las posibilidades de refactorización y simplificación.

Las clases en general, en mi experiencia, no caen perfectamente en las categorías de sustantivo / verbo, sino que terminarás con una mezcla de clases de sustantivo / verbo junto con diferentes clases de patrones (fábricas, singletons, patrones de estrategia, etc.) y otras clases de gerentes que aborda un aspecto de su aplicación.

La clave es que su objetivo debe ser poder mirar una clase y deducir lo que hace y modificarla solo cambiando esa clase. Cuanto más código para un aspecto de su aplicación se distribuya entre las clases, más difícil será seguirlo, administrarlo y extenderlo.

Homde
fuente