Me parece que cada vez que empiezo a escribir una aplicación en Java/C#, las cosas comienzan bien, pero con el tiempo, a medida que la aplicación se vuelve más compleja, se vuelve cada vez más complicada. Me he dado cuenta del hecho de que no soy muy bueno en diseño y arquitectura de alto nivel. Todas mis clases se acoplan fuertemente y el diseño no es "elegante" en absoluto. Soy bastante competente en la programación de "bajo nivel". Es decir, puedo hacer prácticamente cualquier cosa dentro de una función o clase, pero mi diseño de alto nivel es débil y realmente me gustaría mejorarlo. ¿Alguien tiene consejos sobre técnicas, libros, etc. que serían útiles para hacerme un mejor ingeniero de software?Recomendaciones sobre cómo hacer el diseño OOP
Respuesta
Comenzaría esbozando mi diseño. Ese boceto podría ser un cuadro y un diagrama de flecha para mostrar las relaciones entre las clases o podría ser una variación en UML (o quizás incluso UML estándar). Pero me parece que los bocetos me ayudan a ver que un diseño es bueno/malo y tal vez incluso cómo solucionarlo.
También vería un libro sobre patrones de diseño.
Libros:
- código completo, por Steve McConnell
- patrones de diseño, por Gamma, et. Alabama.
Escribe un proyecto grande y deja que se extienda lo más posible. Luego, estudie qué puede hacer para mejorar su código.
Quizás las grandes rutinas individuales también pueden ser limpias y comprensibles, si están bien estructuradas.
No hay una sola buena respuesta para un buen diseño. En realidad, es una de esas cosas valiosas que un programador puede aprender.
La respuesta a su pregunta podría llenar un libro por sí misma, pero le sugiero que eche un vistazo a los patrones de diseño.
El libro clásico sobre el tema se conoce como el libro "banda de los cuatro":
Gang of Four Design Patterns Book
Martin Fowler es también muy apreciada en el campo.
Pruebe hacer esquemas y diagramas del programa antes de comenzar, y pida a alguien más que lo revise y lo critique. Luego, a medida que el programa crezca, actualice continuamente los contornos y diagramas para incluir la nueva funcionalidad. Recíbelo y critíquelo por otra persona. Eventualmente, asumiendo que estás aprendiendo de las críticas, serás mejor en el diseño de programas.
Los libros y tutoriales solo pueden ayudarlo hasta el momento. Si bien necesitas aprender las herramientas y métodos disponibles, el conocimiento por sí mismo no te ayudará aquí. La práctica es lo que lo hará mejor en el diseño, junto con tener un mentor que de vez en cuando le mostrará cómo puede aplicar mejor algunos de los conocimientos que ha obtenido de los libros.
Lea los libros por todos los medios, pero no se sienta mal si escribe un código que termine teniendo estupideces en él. Todo el mundo lo hace. La pregunta es, ¿puedes refactorizar lo que tienes que arreglar? Para poder hacer eso de manera efectiva y con frecuencia, necesita usar TDD y escribir muchas pruebas unitarias.
Puede refactorizar sin piedad para mejorar el diseño del código existente.
La idea principal es que, en algún momento, el código tenía sentido, cuando se introducen nuevas características en el código, entonces probablemente algunas características o responsabilidades se deben mover a otras clases, eso está bien. Luego dejas de desarrollar nuevas funciones y comienzas a cambiar la forma de tu código.
Yo recomendaría que lea:
Yo recomendaría encarecidamente que probar Test Driven Development (TDD). Descubrirá que para que su código sea comprobable y no necesite realizar repetidamente la reelaboración de sus pruebas, deberá tener un diseño sólido. Lo que encontrará es que cuando agrega \ change \ remove funcionalidad, sus mejores diseños requerirán un conjunto muy pequeño de cambios en un conjunto específico de pruebas. Un diseño deficiente borrará un gran conjunto de pruebas, porque tiene un acoplamiento ajustado, objetos responsables de múltiples preocupaciones, etc., etc.,
He descubierto que cuanto mejor recibo en TDD, mejor es mi la arquitectura es, y mejor es el resultado final.
Tenga en cuenta que TDD requiere una gran disciplina mental. No debe esperar que lo use durante 1-2 días y ver resultados inmediatos. Tendrá que querer hacerlo realmente, y realmente hacer el esfuerzo; de lo contrario, no se beneficiará y probablemente termine odiando.
HTH ...
Hay un par de cosas que usted puede hacer
Use herramientas de alto nivel y de bajo nivel de diseño antes de empezar programación. P.ej. Creación de diagramas UML de clase ayuda a su mente a visualizar la solución en forma de diagrama más bien que forma de código.
Familiarícese con Java Patrones de diseño. P.ej. Usar Herencia polimórficamente para comenzar con lo calentará para comenzar a usar los patrones estándar de diseño Java y J2EE patrones.
Hay una tonelada de libros y sitios web relacionados con los dos temas que acabo de señalar aquí.
usa Principios de diseño orientados a objetos (http://www.surfscranton.com/Architecture/ObjectOrientedDesignPrinciples.htm). también considere algunos de los diseños de heursitics (http://www.cs.colorado.edu/~kena/classes/6448/s02/lectures/lecture27.pdf)
Examine mediante un buen código API. Por ejemplo, el código de marco Spring. Lea algunos buenos libros como Design Patterns (como todos los demás mencionados aquí) y algunos otros libros sobre buenas prácticas. Por ejemplo, en Java, Head First Design, serie Effective Java, etc. C++ - Serie C++ efectiva
Obviamente, leer algunos de los libros recomendados ayudará. Creo que Head First Design Patterns es definitivamente menos abstracto que el libro GoF.
La pregunta principal que hago es "¿Este código está haciendo algo muy específico que podría reutilizarse en cualquier otro lugar?"Si es así, colóquelo en una clase en un ensamblaje que permita la reutilización.
Si realmente está comenzando, una cosa que solía hacer era considerar cada tabla de base de datos como un 'objeto'. tabla representa una clase. Los puristas te dirán que esto es un desastre, pero me pareció una buena manera de empezar a pensar en términos objetivos.
No estoy de acuerdo con comenzar con un libro sobre patrones de diseño o refactorización.
En mi opinión, para un diseño de OO sólido, primero debe estar familiarizado con los principales principios de diseño de OO, luego comprender cómo su problema puede ser representado en esos b principios básicos. Luego, puede comenzar a descubrir oportunidades para aplicar patrones de diseño y técnicas de refactorización para alcanzar esos principios fundamentales.
Me gustaría empezar con este libro:
Agile Software Development, Principles, Patterns, and Practices por Robert C. Martin
En este libro, Robert Martin describe el fundamental principles que hacen un buen diseño orientado a objetos, todos ellos relacionados con la encapsulación, el acoplamiento y modularidad:
- El Abierto/cerrado Principio
- Liskov Sustitución
- Dependencia Inversion
- Granularidad
- Cierre Común
- reutilización
- Sin cíclica Dependencia
- Estabilidad de la dependencia
- la abstracción y la estabilidad
Después de todo, casi todos los del diseño del modelo y la técnica Refactoring He visto documentado en GoF y Fowler tiene como objetivo lograr uno de varios de estos principios básicos, dependiendo de la ir prioridad relativa para un escenario dado.
Me gustaría empezar con: Head first object-oriented analysis and design. y una vez que dominado: Head first design patterns.
- 1. OOP: buen diseño de clase
- 2. ¿Corregir el diseño OOP sin getters?
- 3. Recomendaciones sobre el trazado de un gráfico
- 4. Recomendaciones de diseño de diseño de programas Java?
- 5. Preguntas de diseño filosófico para OOP-Tetris
- 6. ¿Cómo pasar de malo a buen diseño OOP?
- 7. ¿Recomendaciones sobre cómo anotar archivos PDF mientras trabaja con Emacs?
- 8. Recomendaciones sobre el análisis de archivos .eml en C#
- 9. Pregunta sobre el estilo OOP funcional en JavaScript
- 10. Recomendaciones de búsqueda Recomendaciones
- 11. Elegir qué clases usar en un diseño OOP de php
- 12. Un buen diseño OOP para un solucionador con Fortran moderno
- 13. OOP Game Design Theory
- 14. Pregunta sobre el diseño de la tabla
- 15. Diseño de OOP: Cómo incorporar el manejo de DB en los objetos de aplicación
- 16. Necesito consejo sobre el diseño de clase adecuado
- 17. CSS sobre dos columnas diseño
- 18. C# Patrón de diseño de estrategia por delegado vs OOP
- 19. Recomendaciones para la información sobre herramientas de jQuery
- 20. Proyecto PHP con excelente diseño OOP para fines de estudio
- 21. ¿Cómo puedo visualizar mi diseño de desplazamiento sobre el teclado?
- 22. .net grid computing computing migration, recomendaciones sobre bibliotecas, arquitectura
- 23. Recomendaciones sobre una Biblioteca de acoplamiento de WPF
- 24. Sitio web para practicar las habilidades de diseño de OOP
- 25. Esto es OOP o como OOP
- 26. jQuery: ¿hay recomendaciones sobre los complementos de jQuery Ribbon?
- 27. Cómo hacer el mismo diseño para todas las páginas web
- 28. D3 diseño vigor: hacer el molde sobre arrastre (zoom) más suave
- 29. ¿Por qué usar PHP OOP sobre funciones básicas y cuándo?
- 30. ¿Es esta una buena manera de hacer JS OOP?
Puede comenzar su viaje para escribir un mejor código reestructurando su pregunta para que sea agradable de leer. En este momento hay oraciones muy largas separadas por comas. – Cheery
No tuve problemas para entender la pregunta. –
Ni yo. Pero se trata de la comodidad. Lo pondría en dos párrafos si pudiera. – Cheery