Apuntes
- Presentaciones
- Git
- Apunte teórico
- Conceptos fundamentales
- Heurísticas de diseño
- Reemplazar if por polimorfismo
- TDD
Presentaciones 
- 01 Introducción a la materia
- 01B Introducción a la ingeniería de software
- 09 Historia de Smalltalk
- 09 Intro a Patrones de diseño
- 10 TDD
Esta sección se irá completando con el correr del cuatrimestre
Git 
Taller de git 
Apunte teórico 
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
- Crear una jerarquia de clases con una clase por cada condicion del if (si no existe)
- Mover el cuerpo del if de cada condicion a cada abstracción del paso 1) utilizando un mensaje polimorfico.
- Nombrar el mensaje polifmorfico
- Nombrar las abstracciones del paso 1)
- Reemplazar el if por el envio de mensaje polimorfico
- Buscar el objeto polimorfico (si es necesario)
TDD
- Escribir el test mas sencillo posible que falle.
- Hacer pasar todos los tests con la implementación más simple posible.
- Reflexionar. ¿Se puede mejorar?