Diagrama UML abstraido o real

EnZo

Buenas, estoy haciendo un diagrama UML de un servidor de sockets. El diagrama está hecho un poco a mi manera, ya que soy un poco novato en el tema.

Tengo en mente publicarlo para estrenar mi github, pero tambien lo uso para agilizar mi programación con el.

Una buena programación orientada a objetos requiere encapsulamiento, entonces por poner un ejemplo tengo una variable que es privada. SOLO se puede obtener su valor, y no se puede cambiar nunca.

Bien, la pregunta es: Los diagramas se suelen hacer mostrando su ambito real como si lo estuvieses viendo directamente desde el codigo fuente. O se debe representar abstrayendo al programador que va a usar la clase desde fuera?

Dicho de otra forma. La variable de ejemplo que he puesto deberia representarla como privada o como publica?
Como se suele hacer? Como lo hariais o lo haceis vosotros?

Gracias de antemano :P

elkaoD

#1 para quién es el UML?

Si es para documentar la API, modela sólo la API.

Si es para documentación interna, modela todo.

EnZo

Como se modelaria todo?

1 respuesta
elkaoD

#3 no sé si entiendo la pregunta. Se hace exactamente como harías las clases programando, pero en UML.

Una vez tengas el UML puedes generar el esqueleto EXACTO del programa a partir de este, así que imagina el nivel de detalle al que debes llegar.

Yo es que no soy muy fan del UML porque considero que el desarrollo de software es una actividad tan compleja que modelar vale sólo para documentar, no para diseñar (a no ser que lo tomes como una guía inicial MUY burda... pero para eso ni me molesto en usar UML.) UML está bien para cuando conoces el dominio del problema al 100%, pero el caso no se suele dar (porque entonces tendrías el problema resuelto y no te haría falta :P)

Desarrollo incremental wins.

2 respuestas
BLZKZ

#4 puedes diseñar con uml :S (de hecho es cuando se hace, no después)

De hecho solo has nombrado diagramas de clases pero puedes hacer muchos otros (dependiendo del modelo de diseño que sigas).

1 respuesta
Merkury

#1 Si la variable es privada, cuando hagas el diagrama de clases y reflejes esa variable la marcas con el - de privada y fiesta.

2 respuestas
elkaoD

#5 creo que #1 pregunta específicamente por diagramas de clases por cómo ha hecho la pregunta.

Sé que puedes (¿debes?) diseñar con UML, pero opino que es una cagada muy gorda. Sólo vale para cuando tienes MUY claro el dominio y el alcance del problema. El 90% de las veces los diagramas UML pueden ir perfectamente a la basura al final del proyecto... ¿Por qué usar UML entonces?

De UML me quedo con los diagramas de casos de uso, componentes y demás diagramas de alta abstracción que bien podrías sustituir por cualquier herramienta de charting aleatoria. Con diagramas de flujo y "charts" en general haces MÁS y MEJOR.

UML está muerto.

He trabajado en ambientes monolíticos y ahora estoy en agile y es toda una diferencia. En mi opinión las metodologías ágiles se ajustan mucho más a los procesos involucrados en el desarrollo de software. En agile las cosas van tan rápido que usar UML es una pérdida de tiempo.

1 respuesta
BLZKZ

#7 no estoy de acuerdo y me voy a explicar xD. Para empezar odio más que nadie uml, creo que entra demasiado en detalle y es demasiado rígido en "sintaxis" o como lo se quiera llamar. Pero yo sin un diagrama de clases, donde obviamente voy a aplicar modelos de diseño no soy nadie, y soy incapaz de hacer una aplicación medio decente.

Sin casos de uso lo mismo. Y obviamente tienes que aclarar antes el dominio y el alcance, porque me parece clave para un proyecto serio. Si no sabes qué, como y hasta donde quieres llegar dime tú cómo te pones a programar algo xD

Y no, no me vale extreme programming XD

Edit: por cierto los diagramas de comunicación, secuencia y mierdas del estilo me los paso por donde yo te diga, menuda basura por dios xD

2 respuestas
elkaoD

#8 pero por qué necesitas UML para esos diagramas de clases?

Si no digo dejar de "diagramar" sino que, como tú mismo comentas, UML es tan rígido que es muy poco práctico. Me puedes decir que los diagramas de clases UML facilitan la tarea porque ya te prepara todo el tema de miembros, métodos y demás sin tener que pelearte con la herramienta de charting, pero es que el 99,9% de las veces me sobra con nombrar la clase y sus relaciones sin entrar en detalles (detalles que casi seguro van a cambiar según vaya programando y salgan a la luz nuevos aspectos que no se han pensado.)

Una herramienta cualquiera de charting/lápiz y papel te dan la misma o mayor expresividad. Por ejemplo: los patrones y demás se pueden aplicar sin necesidad de modelar todo el "boilerplate" que hay a su alrededor. Con UML estás obligado a introducir este boilerplate (y si no, ¿para qué usas UML?)

Si no sabes qué, como y hasta donde quieres llegar dime tú cómo te pones a programar algo xD
Y en efecto, hemos topado con el mayor problema en el desarrollo de software :P Por eso pienso que UML es una pérdida de tiempo y sólo vale para cerrar contratos con empresas "a la vieja usanza".

por cierto los diagramas de comunicación, secuencia y mierdas del estilo me los paso por donde yo te diga, menuda basura por dios xD
Entonces, como yo, de UML te quedas con todo lo que podrías hacer con cualquier herramienta de charting normal y corriente: diagramas ultra-abstraídos que como mucho separan en paquetes/componentes/casos de uso/etc.

cabron

#1

Depende del uso del diagrama.

  • Para generar código. Hay herramientas que te generan el esqueleto de la clase en el lenguaje que quieras a partir del diagrama. En ese caso tendrás que hacer lo que te diga la herramienta.

  • Para diseñar. A veces si no tienes muy claro como hacer una cosa, verlo en dibujo te lo puede aclarar. No es necesario que hagas el diagrama como si estuvieses haciendo código... pon solo aquello que sea relevante para que te ayude a encontrar una solución.

  • Para explicar. La gente es muy visual, y muchas veces si tienes que explicar un diseño a otra persona, es más fácil ponerle un dibujo, que 500 líneas de código o un tocho de texto de 50 páginas. Al igual que cuando vas a diseñar, no es necesario que lo detalles todo como si lo fueses a compilar... pon solo aquello que pueda resultar útil para lo que quieres explicar y omite el resto.

-Para documentar. Nunca lo hagas, es la mayor estupidez del mundo.

En resumen, mostrar una variable privada en el diagrama, es independiente de que exista o no en la clase real, solo la pones si es relevante para lo que quieres mostrar en el diagrama. En el caso de que la pongas, es como te ha dicho #6. Las variables privadas llevan un - y las públicas un +, casi todas las herramientas de modelado uml te ponen el + o el - automáticamente, en lugar de ponerlo tú tienes que indicar en las propiedades si es público o privado.

1 respuesta
elkaoD

#10 Para documentar. Nunca lo hagas, es la mayor estupidez del mundo.

Why? Opino al contrario. Las veces que más rápido he cazado un proyecto es cuando me han presentado la API modelada en lugar de un chorraco de JavaDoc, Doxygen y demás mierdas en las que te puedes perder asqueado de ver texto tabulado :P

Ver las relaciones entre clases, es decir, "the big picture of the project", facilita el poder meterte con documentación sin sentirte perdido.

1 respuesta
cabron

#11

Son filosofías de desarrollo, no hay una verdad absoluta, solo opiniones.

En Agile Modeling nunca se documenta con diagramas (no es por que sí, tiene su explicación, con la que puedes estar de acuerdo o no), y como experiencia personal, he trabajado durante 5 años en una empresa que exigía montones de documentación con una exactitud casi calcada a la del código, y no he visto los supuestos buenos resultados que te daría tener una documentación casi perfecta.

"Ver las relaciones entre clases, es decir, "the big picture of the project", facilita el poder meterte con documentación sin sentirte perdido"

Es que eso yo no lo considero documentación, entraría en el apartado que he puesto de "explicar algo". Parece lo mismo, pero el matiz es que solo muestras aquello que es relevante, no haces un calco del código.

1 respuesta
elkaoD

#12 y no he visto los supuestos buenos resultados que te daría tener una documentación casi perfecta.
Coméntame cuando desarrolles un webservice para consumidores externos que no tienen acceso al código y tu documentación sea escasa y vieja. INFIERNO. Y lo he vivido xD

Por supuesto, lo ves mal porque estás viendo el UML generado a mano. Obviamente eso NO tiene sentido y es un trabajo extra que da el mismo o más asco que documentar en un .DOC monolítico que hay que actualizar a la par que el proyecto (multiplicando el trabajo y generando burocracia innecesaria.) La documentación y el modelado debe ser generado AUTOMÁTICAMENTE por herramientas apoyándose en la meta-documentación del proyecto (en UML le llaman reverse-engineering.)

Véase Marginalia (la web del proyecto es la propia documentación de este, autogenerada of course.)

http://fogus.me/fun/marginalia/

El problema no es la documentación sino las malas prácticas empresariales en cuanto a la burocracia que rodea a esta (véase estupideces como obligar a usar una plantilla .DOC para documentar mierda en párrafos gigantes que NADIE se va a leer.)

Es que eso yo no lo considero documentación, entraría en el apartado que he puesto de "explicar algo".
Entonces entendemos de forma diferente la documentación. ¿Qué es la documentación sino "explicar algo"? Porque UML es documentación, JavaDoc es documentación, diagramas de clases son documentación y los comentarios en tu código son documentación.

1 respuesta
MTX_Anubis

#8 y si los casos de uso, el modelo y todo cambia constantemente? xD

Yo estoy con cabron, los uml, sus mierdas y su metrica3 se lo pueden meter por el ojal.

1 respuesta
BLZKZ

#14 si eso pasa me cago en el puto cliente xD

#16 metodologias ágiles obv

1 respuesta
MTX_Anubis

#15 te vas a cagar en muchos clientes a lo largo de tu vida xDD

Eso o simplemente cambias de metodología de trabajo a otra que se adapte mejor a los cambios.

1 respuesta
elkaoD

Así que estamos todos de acuerdo en que UML es una mierda y las metodologías ágiles son el futuro.

Cerrad el thread. Esto no se va a volver a dar en ForoDev.

cabron

#13

A lo que me refiero es que hay gente que su idea de documentar es crear una copia del código fuente con todo detalle pero en formato doc explicado con palabras o con diagramas, y eso es el demonio a punto de llevarse tu alma.

Es un tema que da mucho de sí, donde también influye como estén diseñadas las interfaces, buscando una especie de nirvana donde la propia interfaz sea la documentación del método (algo que no se va a conseguir 100% pero se puede conseguir mucho)

2 respuestas
elkaoD

#18 agree 1000%

Insisto: http://fogus.me/fun/marginalia/ <- ÉSTE es el nirvana de la documentación

Documentación auto-generada con los docstrings = poco esfuerzo para el programador + gran documentación, tanto in-code como standalone. ¿Alguien da más?

1 respuesta
EnZo

#4 Vale vale, es que no te habia entendido bien. Pensaba que te referias a modelarlo todo tanto para api externa como el esqueleto.

#6 Si, es de ambito privado. Pero se puede obtener su valor. Entonces tambien se consideraría publica.

Para aclarar dudas, que no lo he dicho. Sí, es un diagrama de clases. En realidad es un diagrama para documentar, porque no son muchisimas clases y no tiene complejidad, es decir que no es para aclarar su entendimiento.

Y sí. Yo tambien estoy de acuerdo en que diseñar una APP grande y compleja es un fail. Vas a tener que reacerlo casi seguro, a menos que tengas una mente privilegiada y seas capaz de preveer todo lo que vas a necesitar.

Al final optaré por una documentacion tipo API.

Ya podemos cerrar el thread como dice kaod. Estamos todos de acuerdo xD

1 respuesta
Merkury

#20 Da igual que puedas extraer su valor desde una clase hija o algo así, el simbolito en el diagrama es - y si has de ponerla si crees que es una variable relevante para el diseño.

1 respuesta
B

Yo nunca entenderé utilizar UML más allá de los casos de uso o para explicar subsistemas concretos. Una api se documenta cojonudamente con un xxxdoc (javadoc por ejemplo).

Tengo pendiente mejorar toda mi forma de trabajar (desde el análisis hasta la implementación), quizás me mire algo del tema de agilismo. Aunque muchas cosas creo que están orientadas a equipos.

PD: No veas que puto coñazo documentar el PFC con las putas clases, y eso que las generaba desde el código (lo suyo es que hubiera diseñado y generado el código desde el UML, pero muchas cosas cambiaron).

1 2 respuestas
EnZo

#21 Piensa que esa clase va a ser usada de forma externa por otros (no deberia de modificarse). Mi intencion es facilitar el trabajo con ella a los demás.

Entonces, si se puede acceder a la propiedad por que representarla como privada? No confundiria un poco?

#19 Cada vez que veo algo de codigo en clojure me quedo loco xD

2 respuestas
elkaoD

#22 Una api se documenta cojonudamente con un xxxdoc
Depende de lo compleja que sea la API. Un framework por ejemplo queda mucho más claro y conciso con diagramas de clases (por lo "ligado" de sus clases.) Un xxxdoc no dice NADA de la relación entre clases (más allá de la herencia... e incluso ahí es muy poco descriptivo porque un árbol de clases tampoco me dice mucho...)

Por ejemplo, yo ahora estoy lidiando con overtone. Es un framework de generación de sonido sobre Clojure que usa Supercollider como backend de sonido. La documentación es penosa, mientras que un diagrama jerárquico de generadores/filtros me vendría de perlas!+

Agile ni te lo mires si no vas a estar en equipo, no tiene sentido. Como lone-developer el sentido común sobra.

#23 Entonces, si se puede acceder a la propiedad por que representarla como privada? No confundiria un poco?
Piensa que estás modelando/diseñando. Si lo que planeas es documentar, mejor hazlo AL ACABAR cuando tengas la API fijada.

Cada vez que veo algo de codigo en clojure me quedo loco xD
Me pasaba lo mismo y sin embargo ahora yo ya no puedo ver otra cosa, el resto de lenguajes me dan como grimilla xD

1 respuesta
Merkury

#23 Perdon, me he confundido antes, si es una variable que ha de ser accedida desde otra clase deberías usar una clase protected (#) que permite el uso y lectura de las clases friend.

Excepto si lo estas programando en C++ que las private son visibles desde las clases friend)

1 respuesta
EnZo

#24 No es algo que vaya a usar practicamente nadie, así que tampoco me merece la pena currarmelo mucho. Las clases estan definidas a un 95% así que ya estoy haciendo el diagrama como si fuese una API. La documentacion la haré con algun generador que lo haga automaticamente todo.

#25 Ya, si sé como representar el ambito en el diagrama. Pero ese no es mi problema/dilema, mi dilema es si representarlo como una API o como el esqueleto del codigo fuente. Alomejor no me he explicado bien, pero creo que no me has entendido.

C

Bonito debate.

Estoy con la mayoría de vosotros en un % entre el 70-100% dependiendo de lo opinado xD.
Estoy con #18 en que es una solemene pérdida de tiempo intentar transcribir código a diagramas.
Estoy con #22 en que los casos de uso son los que tienen utilidad real. Y, por mi experiencia, son tan tontos que los entiende hasta un ejecutivo (y estos son muy tontos).

Fuera de ahí, si estás modelando OOP, el diagrama de clases es útil.

Si estamos en un entorno de XP y sin diseño OOP, yo lo que suelo usar es mi diagrama de la base de datos pintado en ERWin con un doc o ppt indicando lo que sería en UML el diagrama de secuencia pero con más palabras que dibujos. Suena cutre pero para ir rápido, dejar algo de documentación y que un compañero técnico se entere, me parece práctico.

A veces también prima el tipo de compañeros técnicos. Tengo algunos talluditos (yo también empiezo a serlo pero me reciclo, joder!) que son consumidores de clases pero no han creado una en su vida como Dios manda. Con esta gente, te curras el megadiagrama UML y te llaman para que les expliques en persona los dibus porque el último diagrama que vieron fue el típico de cajitas torcidas, circulitos y demás flujos pre-UML hechos en Visio. Y claro, se te cae el alma al suelo.

tracker086

Pues yo no se si será cosa de costumbre o que, pero creo que llevar un buen diseño UML agiliza bastante luego a la hora de programar, organizar el código y hacer uso de patrones de diseño.

Las veces que he programado a capón luego he tardado más haciendo reingeniería porque tenia una mierda de código.

Normalmente hacer un análisis de requisitos, casos de uso y distintos diagramas (clase, etc..) suele hacerte comprender mejor el dominio del problema, y poder hacer un diseño mucho mas limpio para tu proyecto.

Por cierto me ha parecido leer por arriba, que usar agile implica no usar UML? Pregunto de verdad, porque yo pensé que una cosa no influía a la otra.

2 respuestas
BLZKZ

#28 pero lo que comentamos es que no es imprescindible que los diagramas sean estrictamente siguiendo el estandar UML (2.0), sino que esquemas en papel valen exactamente lo mismo xD

#28 depende, agile es muy amplio, hay distintos procesos o metodos, extreme programming es solo un ejemplo de agile. En algunos sí se usa UML en otros es opcional y en otros lo haces como te sale de la minga

cabron

#28

Agile no es NO usar es UML, es como no usarlo.

Normalmente a la hora de entender algo, lo realmente importante es entender como se relacionan unos objetos con otros, una visión general más que el detalle de que si la variable es un int o un float, o si un buffer tiene 40 bytes o 50. Los detalles más bajos, solo los vas a necesitar a la hora de tocar el código, y los puedes extraer directamente del propio código, pero para una discusión sobre cuál sería el mejor diseño, o la mejor forma forma de introducir una modificación en un sistema existente, suelen ser totalmente irrelevantes, así que te puedes sentar (tú solo o con algunos compañeros) y hacer un sketch tal que así:

No te molestas en llegar al punto en el que el diagrama refleja un código 100% real, si no en llegar al punto en que entiendes como funciona el conjunto y que es lo que tienes que hacer, y a partir de ahí empiezas el desarrollo. Todos los detalles que faltan, los rellenas directamente cuando programas a no ser que encuentres algo muy importante que no has tenido en cuenta, entonces vuelves al diagrama a darle otra pasada. Esa es otra característica de las metodologías agile, que son iterativas, y nunca un documento es inamovible ni hay que seguirlo al pie de la letra.

Realmente se trata de cuando hacer un diagrama (o cualquier otro tipo de documento), y cuando no hacerlo, que información poner en ella y cual omitir, que contrasta con la idea que hay en algunos sitios de hacer toneladas de documentos y todos con un detalle exacto.

Diagramas/Documentos: Si no lo necesitas, no lo hagas, Información: si no es relevante, no lo incluyas.

Usuarios habituales