2010-05-11 13 views
9

He aprendido lo suficiente como para comenzar a escribir programas desde cero, pero me estoy enfrentando al problema de no saber cómo diseñar el diseño y la implementación de un programa. Para ser más precisos, tengo dificultades para encontrar una buena forma de elaborar un plan de acción antes de sumergirme en la parte de programación. Realmente quiero saber qué clases, métodos y objetos necesitaría de antemano en lugar de solo agregarlos en el camino.Recomendaciones de diseño de diseño de programas Java?

Mi intuición me lleva a utilizar algún tipo de software de gráficos que ofrece una vista jerárquica de todas las clases y métodos. He estado utilizando OmniGraffle Pro y aunque parece funcionar un poco, todavía tengo problemas para planificar el programa en su totalidad. ¿Cómo debo abordar este problema? ¿Qué softwares están disponibles para ayudar con este problema? ¿Alguna buena lectura sobre este tema?

¡Muchas gracias!

Editar: Oh, sí, estoy usando Eclipse y código principalmente en Java en este momento.

Respuesta

12

No me preocuparía el aspecto de la creación de gráficos. Trataría de documentar todas las entidades que vas a necesitar y todo lo que van a hacer. En el caso más simple, cada sustantivo será una clase, y cada verbo será un método.

Este es un enfoque muy básico, y lo que está pidiendo es alguna metodología de análisis. Libros enteros han sido escritos sobre esto y es un tema sustancial.

Puede tomar un enfoque alternativo y adoptar una metodología ágil. En esto resuelves un problema en particular (un sub-problema de tu objetivo final), y luego refactorizas (tal vez en gran medida) a medida que resuelves más problemas. Mientras codifica, escribe y mantiene pruebas unitarias para que su refactorización no rompa su código existente. Tienes que estar preparado para descartar el trabajo que has hecho, pero es una técnica poderosa que significa que tienes algo en funcionamiento temprano, en lugar de depender de un enfoque de big-bang.

+0

Acabo de asistir a una conferencia y adivinen qué, ¡mi profesor habló exactamente sobre esto! Incluso mencionó la palabra "ágil" al hablar sobre TDD y cómo usar J-Unit. Muchas gracias Brian esto realmente me alegra el día. No puedo esperar para comenzar con esto. –

+0

Esas son buenas noticias. ¡La mejor de las suertes! –

2

Existen herramientas específicamente para este tipo de problema (por ejemplo, Rational Rose). Desafortunadamente, aunque son años luz mejores que Omnigraffle, la mayoría de ellos son bastante caros. Hay algunas herramientas gratuitas que quizás desee examinar, como ArgoUML y UMLet, aunque este último es un plugin de Eclipse, por lo que probablemente no sea interesante a menos que esté usando (o esté dispuesto a usar) Eclipse.

+0

Si bien ha respondido específicamente la pregunta, creo que la respuesta de Brian es, en general, más útil al señalar el OP para un mejor enfoque. – SteveD

+0

@stevendick: sí, a menudo es un poco interesante decidir entre contestar la pregunta que se hizo y la pregunta que probablemente se debería haber hecho. La respuesta de Brian es más o menos la descripción estándar de 30 segundos del análisis orientado a objetos, pero debo decir que rara vez la encontré muy útil. La mayoría de las personas comienzan con una visión simple de que "el programa debe hacer X, Y y Z", dando "el programa" como el único objeto.En general, se requieren bastantes intentos de diagramación antes de poder señalar cualquier cosa que razonablemente pueda ser un objeto en código real. –

1

Considere la posibilidad de buscar en la filosofía de Diseño orientado a objetos una metodología sobre cómo estructurar programas. UML o Unified Modeling Language generalmente se acepta como un método para estructurar programas OO en lenguajes como Java y Python. Buenos programas para aquellos como BoUML y ArgoUML. Además, mire en esta página en re-factoring, aunque se trata de la reestructuración del código también puede ayudar con la estructura inicial. Finalmente busque en estos OO design principales

2

Lo mejor sería comenzar con algunas historias simples o incluso una lista de requisitos de lo que la aplicación puede hacer. A partir de ahí, puede pensar qué clases puede usar y cómo interactuarán entre sí.

Me gusta crear varios paquetes que planeo usar y poner clases de stub allí. Incluso puede anular los métodos si lo desea y agregar comentarios de Javadoc.

No me preocuparía demasiado tratar de planearlo exactamente como lo más probable es que cambie a medida que lo construyes, por lo que incluso si lo logras perfectamente en el momento del diseño, un requisito cambiante o algo que no funciona así como originalmente pensaste que podría alterar las cosas. Lo bueno de un diseño de esqueleto como este es que una vez que estás listo para codificar, solo tienes que ir y empezar a completar los cuerpos de los métodos.

0

La mayoría de los ingenieros que conozco usan Visio, generalmente está disponible como parte de su suite empresarial.

También hay algunas aplicaciones web libres que hacen el modelado para usted (modelado de objetos es la "palabra clave" para lo que está hablando)

lo podría hacer en diagramas de objetos UML - aunque no es importante seguir cualquier especificaciones exactamente, si usa eso como base, más personas tendrán una idea de lo que está hablando.

0

Uso una pizarra de buen tamaño para modelar. Descubrí que realmente me ayuda poder dar unos pasos atrás y poder ver todo el diseño, y la flexibilidad para poder cambiar algo con solo deslizar un borrador me permite concentrarme en la tarea que tengo entre manos.

Cuando termino, tomo una foto con mi cámara y la cargo en mi computadora para uso a largo plazo.

0

me gustaría añadir a los comentarios de Brian que, si bien la adopción de un enfoque ágil también adopta un enfoque Test Driven Development (TDD) a escribir el código. Esencialmente, usted escribe las pruebas para su código antes de escribe cualquier código de producción real. Esto realmente te obliga a reducir la velocidad y pensar mucho sobre lo que necesitas (y no necesitas) para programar, qué modelos de datos necesitarás y cómo interactuarán. Hay muchas ventajas para TDD, pero un mejor diseño es una gran ventaja para mí. Aquí hay un fragmento relevante del enlace de arriba:

El desarrollo basado en pruebas ofrece algo más que la simple validación de la corrección, pero también puede impulsar el diseño de un programa. Al centrarse primero en los casos de prueba, uno debe imaginar cómo los clientes usarán la funcionalidad (en el primer caso, los casos de prueba). Entonces, el programador se preocupa por la interfaz antes de la implementación.

Si nunca has hecho esto antes, puede ser realmente difícil, principalmente porque puede ser difícil no iniciarse directamente en la codificación. Pero persevera y nunca más volverás a escribir código de otra manera. Las ventajas realmente valen la pena. ¡Buena suerte!