Presentaciones github icon

Esta sección se irá completando con el correr del cuatrimestre

Git github icon

Taller de git github icon

Apunte teórico github icon

Conceptos fundamentales

Software:

  • Modelo computable de un dominio de problema de la realidad. Dominio = recorte de la realidad.

Desarrollo de software:

  • Proceso de aprendizaje
  • Iterativo e incremental. Feedback inmediato es fundamental.
  • Eje descriptivo , funcional e implementativo. Foco en eje descriptivo y funcional.

Paradigma de Objetos:

  • Objetos que colaboran entre si mediante el envio de mensajes.

Objeto:

  • Representación de un ente de la realidad.
  • Se define a partir de los mensajes que sabe responder.

Mensaje:

  • Define el QUE del objeto (vs Método que define el COMO)
  • Define una responsabilidad que tiene el objeto.
  • Puede tener múltiples implementaciones asociadas (métodos).

Método:

  • Implementación de un mensaje. Define el COMO.
  • Conjunto de colaboraciones.

Colaborador:

  • También conocido como variable.
  • Interno (variable de instancia), externo (parámetro) o temporales (variables).
    • Interno: Lo conozco siempre. Relación de cercanía en cuanto al conocimiento.
    • Externo: Lo conozco para una colaboración puntual.
    • Temporal: Lo conozco temporalmente dentro de un conjunto de colaboraciones.

Closure:

  • Conjunto de colaboraciones, al igual que un método, pero no está asociado a ningún objeto. No hay mensaje asociado.
  • Están bindeados al contexto.
  • Closure vs “full” closures. Estos últimos tienen binding del return al contexto de ejecución (ej: Smalltalk, Ruby).

Clase:

  • Concepto que aparece en lenguajes OOP con clasificación (vs prototipado, como Self o JS).
  • Representa un concepto o idea de la realidad. Ej: “Silla” (clase) vs “esta silla blanca donde estoy sentado (instancia).
  • Todo objeto es instancia de una clase.
  • Abstracta: No tiene realizaciones concretas. No hay entes de la realidad que puedo relacionar de forma exclusiva con el concepto. Ej: Todo “Numero” es real, entero, fraccionario o imaginario.
    • Tiene al menos un método abstracto.
    • Corolario: No tiene sentido instanciarlo.
  • Métodos de instancia vs métodos de clase: Los primeros definen el comportamiento de las instancias, mientras que los segundos, el comportamiento de las clases.

Subclase:

  • Especialización. “Se comporta como” (ojo con el ES UN).
  • Subclasificación: Forma de organizar conocimiento mediante jerarquías de clases.

Polimorfismo: -Dos o mas objetos son polimorficos entre si respecto a un conjunto de mensajes <=> - Responden de la misma manera / Son semánticamente iguales - Mismo nombre del mensaje - Misma cantidad y tipo de parametros - Mismo tipo de resultado

Heurísticas de diseño

  • Buscar el 1:1 entre objeto - ente
  • Favorecer composicion por sobre subclasificación
  • Quitar código repetido: Señal de que falta una abstracción.
  • No romper encapsulamiento.
  • Nombrar a los objetos segun el ROL que cumplen en un determinado contexto
  • No subclasificar de clases concretas
  • Guiarnos por los aspectos funcionales conducen a mejores modelos
  • Favorecer el uso de polimorfismo por sobre ifs.
  • Favorecer inmutabilidad
  • Crear objetos completos
  • Crear objetos validos
  • No usar null

Reemplazar if por polimorfismo

  1. Crear una jerarquia de clases con una clase por cada condicion del if (si no existe)
  2. Mover el cuerpo del if de cada condicion a cada abstracción del paso 1) utilizando un mensaje polimorfico.
  3. Nombrar el mensaje polifmorfico
  4. Nombrar las abstracciones del paso 1)
  5. Reemplazar el if por el envio de mensaje polimorfico
  6. Buscar el objeto polimorfico (si es necesario)

TDD

  1. Escribir el test mas sencillo posible que falle.
  2. Hacer pasar todos los tests con la implementación más simple posible.
  3. Reflexionar. ¿Se puede mejorar?