Análisis y Diseño Orientados a Objetos: Por qué, cuándo y cómo

  • Por
  • y  
Todo programador debe conocer el Análisis y Diseño Orientados a Objetos. Resumimos el objetivo, la motivación y la necesidad de dominar estas áreas, si te dedicas a la programación profesional.

En este artículo, y en el vídeo que acompaña al final del texto, estamos haciendo un informe sobre los motivos por los que todo programador debería dominar el Análisis y Diseño Orientados a objetos, así como un resumen de los contenidos que deberían conocerse para abarcar estas materias.

El objetivo es, sobre todo, motivar a los programadores a realizar un estudio más profundo acerca de su profesión, lo que debe derivar en un trabajo más correcto y satisfactorio tanto para el profesional como para los proyectos en los que se encuentre involucrado.

En resumen veremos todas las cuestiones relacionadas con estas materias que vamos a abordar: Análisis y Diseño de Software, ¿Quién debería conocerlas? ¿Para qué?, ¿Por qué?, ¿Qué incluye?, ¿Cómo se debe abordar el estudio?, ¿Dónde y cuándo?, etc.

Con todo esperamos que los profesionales tengan más claro aquellos puntos y guías para poder avanzar en sus capacidades como programador.

Nota: Este artículo es una transcripción resumida de algunas partes del contenido de la clase impartida por Luis Fernández, profesor de la Escuela Superior de Informática de la Universidad Politécnica de Madrid. La grabación de la clase se puede encontrar al final del artículo. Este texto de transcripción lo ha realizado Miguel Angel Alvarez.

Objetivo de aprender Análisis y Diseño

El software no es como un bebé que entregas en adopción después de dar a luz. Al contrario, es más como tener un hijo en la vida real a lo largo de muchas fases:

  1. Durante la gestación la madre se cuida para que el bebé nazca bien, no tenga ninguna deformación o problemas de nacimiento que dificulte una vida normal.

  2. Además el software debe acompañarse durante la vida de la persona: durante la vida se debe colaborar para que el niño pueda desarrollarse, crecer, jugar, madurar, trabajar…

Las tasas mayores de éxito del software se tiene justamente cuando se crea una primera versión con muy pocos requisitos y luego se va ampliando su funcionalidad al cabo del tiempo. Eso lo hemos visto en cientos de productos de software, en los que hemos asistido a lo largo de los años a una sofisticación de un programa, según se iban lanzando distintas versiones, muchas veces publicando solo cambios sutiles entre ellas.

Por tanto, para un mejor desarrollo del software es importante esforzarse en alcanzar una elevada calidad. Esto significa crear unas buenas clases, jerarquías, dependencias, etc. y conocer los parámetros que nos indican justificadamente si una clase está bien o mal, si un método es correcto o mejorable, etc.

Al encontrar esa bondad en los componentes del software conseguimos un software legible y no uno viscoso, software flexible en lugar de rígido, robusto en lugar de frágil y reusable en lugar de inmóvil. Buscamos un software cuyas clases, métodos, jerarquías, herencias nos ofrezcan esas ventajas deseables en todo programa, ya que a lo largo de los años vamos a tener que mantener el software, ya sea para corregirlo, aumentar sus funcionalidades o adaptarlo a nuevas necesidades.

El motivo de buscar ese software correcto es por aumentar la productividad y la eficiencia, no por estética. Pero además y sobre todo es simplemente por ética profesional, lo que se conoce por deontología.

¿Para qué voy a estudiar análisis y diseño de software?

Debemos Realizar un desarrollo con diseño de mayor calidad calidad. Aparte, para permitirme evolucionar correctamente en el campo de la programación.

Esto lo podemos ver por medio de una serie de etapas que todo programador va cubriendo en su desarrollo profesional.

Etapa 1: Aprender programación
Etapa 2: Aprender programación orientada a objetos

Estas 2 primeras etapas, son en sí un primer paso, es algo que todos conocemos o debemos de conocer ya. De hecho, es posible que muchas personas las hayan podido realizar ambas etapas a la vez, puesto que muchas personas pueden haber aprendido a programar directamente con orientación a objetos y no hay problema alguno en ello.

Etapa 3: Análisis y diseño

Esta etapa es fundamental para poder desarrollarse profesionalmente como programador y es a la que nos estamos refiriendo en este artículo. Sin embargo, a pesar de su importancia, muchísima gente se las ha saltado, yendo directamente a las siguientes etapas.

Queremos insistir en que el análisis y diseño es la lanzadera a las siguientes etapas de la programación, porque permite justificar por qué un código está bien y un código está mal. Cuando lo tengas bien claro, podrás pasar a las siguientes etapas con garantías:

Etapas 4 y en adelante: Patrones de diseño, arquitecturas de software, pruebas, TDD, Ecosistema (workflow), metodologías, tecnologías…

El problema es que mucha gente, como decimos, después de aprender programación orientada a objetos, ha pasado directamente a aprender escalones superiores como por ejemplo patrones de diseño, sin pasar por el dominio del análisis y diseño. Aplican un patrón de diseño sin saber realmente cuándo se debe aplicar y si es correcta o necesaria su aplicación. "Saben patrones" (entre comillas) pero no aciertan a aplicarlos correctamente.

Para poder aprender patrones de diseño, o sabes los conceptos generales de análisis y diseño (etapa 3), o lo más seguro es que metas un patrón donde no debías aplicarlo. Lo más seguro es que hagas un software sin arquitectura, o no apliques las arquitecturas correctamente porque no las has podido entender bien. Te incapacites a hacer pruebas automatizadas. Que tengas herramientas habituales para un buen ecosistema (el Workflow de procesos y herramientas, como control de versiones, métricas, check style…) pero no les saques el partido que debes, y de ahí en adelante.

¿Quién debe conocer el análisis y diseño orientados a objetos?

Esta parte la veremos analizando el perfil del estudiante que debería tener claras estas disciplinas (Diseño y Análisis). Es una persona que conoce lenguajes de programación orientados a objetos, como Java, PHP, C#, C++, Ruby o similares. En general cualquier lenguaje que implemente el paradigma de orientación a objetos.

Además debe tener claros los conceptos básicos del mundo de la programación: Tipos primitivos, arrays, punteros y/o referencias, sentencias de control, parámetros y argumentos, acumuladores y flags.

Luego tendrá claros conceptos relacionados con la programación orientada a objetos como clases, atributos, métodos, enumerados. Miembros de instancia Vs miembros de clase (static). Objetos, estado, mensajes, así como herencia, polimorfismo, programación parametrizada, excepciones y aserciones.

Qué contenido debes conocer para dominar análisis y diseño orientados a objetos

Primero tener un contexto teórico, conocer la naturaleza, fundamentos y complejidad del software, economía y crisis del software, lo que son los patrones de diseño y las aquitecturas del software, así como disciplinas y metodologías.

Después de todo ese conocimiento teórico nos vamos al contenido real que debes dominar para el aprendizaje y aquí hay una cantidad enorme de principios, patrones, métricas de calidad, etc. que deberías estudiar y que ahora te enumeramos y resumimos.

Principios DRY, YAGNI, KEEP, Mínima Sorpresa,...
Patrones GRASP (General Responsabilities Assigment Software Patterns): Alta cohesión, bajo acoplamiento, Controlador…
Relaciones entre clases: Composición / agregación, asociación…
Código limpio: Formato, nombrado, comentarios…
Principios SOLID: (Sustitución de Liskov, Abierto / Cerrado de Meyer, Inversión de dependencias…)
Diseño por contrato: precondiciones, postcondiciones…
Métricas de calidad: tamaño de clases, métodos, acoplamiento…
Código sucio: números mágicos, demasiados argumentos…
Anti patrones de desarrollo: BLOB, código muerto…

Todo esto son las materias de estudio de los libros de informática más representativos de los últimos años. Materias que generalmente no se explican en los ciclos universitarios, más concretamente en el "grado universitario" y que solo se abordan para los pocos estudiantes del "post grado". Pero a la vez, son materias esenciales para que las personas que se van a dedicar a la programación puedan asentar el conocimiento posterior, sin dar tumbos.

Sobre todo este contenido de Análisis y Diseño Orientados a Objetos, si te interesa (que debería), vamos a hacer un curso en EscuelaIT a partir de este lunes, con Luis Fernández. Serán 2 semanas de clases diarias, a razón de 2 horas por día. En total están planificadas un mínimo de 20 horas de clase, ya que en la práctica seguro que nos extendemos algo más, en función de la marcha de las sesiones y la cantidad de preguntas que se realicen durante las clases en directo. Puedes encontrar más información en la página del Curso de Análisis y Diseño Orientados a Objetos de EscuelaIT.

Vídeo de la sesión

En este artículo hemos resumido los primeros 25 minutos de la sesión que Luis nos ofreció en abierto antes del curso de EscuelaIT. Sin embargo, como contenido se tocaron muchos otros temas relacionados, como ingeniería del software, una completa bibliografía de los libros más fundamentales que se pueden usar para documentarse en la materia, mecánicas y objetivos del curso de EscuelaIT, etc.

Te recomendamos ver este vídeo porque es tremendamente inspirador. Si te dedicas a la programación deberías invertir un poco de tiempo, pues merece mucho la pena, ya sea para conocer los siguientes objetivos que deberías plantearte en tu carrera profesional o para verificar si te encuentras en el buen camino.

Autor

Luis Fernández Muñoz

Profesor de la Escuela Superior de Informática de la UPM

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

jagarsoft

26/10/2015
Codigo fuente de ejemplos
Hola
Enhorabuen por el curso.
No podré asistir pero estoy muy interesado en ver codigo desarrollado por Luis.
¿Tienes algun repositorio publico para consultar? Por ej, el que citas en el video de las 25 versiones...
u otro.
Gracias por adelantado
Un cordial saludo!

David Cardona

27/10/2015
Este es un curso de pago o es gratis. Mas info
Hola. Aún no tengo claro si estas clases son parte de un curso o si son entregas esporádicas. Si es de un curso cuando inicia? cuanto cuesta?

Muchas gracias

David

31/10/2015
Recomendado
Luis Fernández Muñoz, es de los mejores profesores que he tenido en la UPM, me dio Programación II y es una máquina. Os lo recomiendo 100%

Roberto

02/11/2015
Duda
Tengo una duda sobre el NOMBRE que se le da al principio de programacion (creo), que a continuacion describo en ejemplo.

- Imaginen que tengo el siguiente metodo:
private bool eliminar(int id){
// codigo que elimina registro segun id
}
- obviamente, este metodo ELIMINA x registro de x tabla (supongamos) y SOLAMENTE deberia hacer eso, eliminar dicho registro.

Ahora la pregunta, como se llama el principio/patron de programacion (que se debe evitar por cierto) cuando dentro de este metodo, hacemos otra cosa con el registro u proceso de la aplicacion ? mmm no se, imaginen que dentro del metodo eliminar(), mandamos un email y mas cosas que NO tienen que ver con "eliminar un registro segun su id"

Quedaria asi>
private bool eliminar(int id){
// codigo que elimina registro segun id
// codigo que envia un email
// codigo que hace otra cosa que no tiene que ver con la eliminacion del registro
}


Espero se haya entendido, gracias!

Santiago

08/11/2015
Respuesta para roberto
Hola roberto.
Eso es el principio de "Alta Cohesión y Bajo Acoplamiento" Los conceptos de cohesión y acoplamiento no están íntimamente relacionados, sin embargo se recomienda tener un mayor grado de cohesión con un menor grado de acoplamiento. De esta forma se tiene menor dependencia y se especifican los propósitos de cada objeto en el sistema.
Son parte de los Principios GRASP.
Saludos.

Santiago

08/11/2015
Corrección
Perdon, Patrones GRASP.