Presentaciones github icon

Ejercicios en clase github icon

Pueden encontrarlos en el repo de Ejercicios en clase

Git github icon

Taller de git github icon

Apunte teórico github icon

Esta sección se irá completando con el correr del cuatrimestre, a medida que vayamos aprendiendo conceptos nuevos :)

Conceptos fundamentales

Software / Programa:

  • Modelo computable de un dominio de problema de la realidad (vs Secuencia de instrucciones)
  • Paradigma de Objetos: Objetos que colaboran entre sí mediante el envío de mensajes para resolver un problema.

Desarrollo de software:

  • Proceso de aprendizaje, iterativo e incremental
  • Eje descriptivo, funcional e implementativo. Foco en eje descriptivo y funcional.

Filosofía Smalltalk:

  • Ambiente de aprendizaje
  • Fundacional del paradigma
  • Ambiente vivo
  • Imagen + VM
  • Feedback inmediato
  • “Todo es un objeto”

Conceptos del paradigma

Objeto:

  • Representación de un ente de un dominio de problema
  • Se define a partir de los mensajes que sabe responder.
  • Nueva definición (más precisa): Representación del rol que desempeña un ente de la realidad en el contexto de un dominio de problema

Mensaje:

  • Define el QUE de un objeto
  • Define una responsabilidad
  • Comportamiento definido a través de un método asociado a un objeto con el mismo nombre que el mensaje
  • Conjunto de mensajes define la escencia de un objeto
  • Son objetos

Método:

  • Implementación de un mensaje
  • Representa un conjunto de colaboraciones
  • Define el CóMO
  • 1 mensaje -> 1 o más métodos asociados
  • Son objetos
  • self: Pseudo-variable que hace referencia al objeto receptor en el contexto de un método.

Colaboradores:

  • Otro objeto con el que un objeto colabora
  • También conocido como variables
  • Interno: Lo conozco siempre, relación de cercanía (variable de instancia)
  • Externo: Colabora para un mensaje puntual (parámetro)

4 caracteristicas de una colaboración:

  • Sincrónica: Se envia un mensaje y esperamos que el mismo sea respondido. No continuamos con la siguiente colaboracion.

  • Dirigida: Envio un mensaje que va a un objeto receptor. Al cual se a quien.

    Ejemplo:

      AlanTuring dateOfBirth.
    
    Receptor Mensaje Emisor
    AlanTuring dateOfBirth Yo en el ambiente
  • Siempre tiene se responde un objeto: En el caso de smalltalk si uno no pone el return explícito responde self.

  • Receptor desconoce al emisor: La respuesta a una colaboración es independiente del emisor.

    Ejemplo:

      January/1/2019 distanceTo: March/21/2019.
    

    El objeto

      March/21/2019
    

    esta colaborando con el objeto

      January/1/2019
    

    a traves de este mensaje

      distanceTo:
    

Otros conceptos importantes del paradigma

Encapsulamiento:

  • El mismo se logra cuando el resto de los objetos no conocen a los colaboradores internos del objeto en cuestión. Decimos que rompemos encapsulamiento cuando compartimos a nuestro colaborador interno con otros objetos.

Subclasificación:

  • Forma de organizar conocimiento, derivado de las ideas de Aristóteles. La más común Smalltalk, Java, C++, Python, Ruby, etc.
  • Alternativa: Prototipado, derivado de ideas de Wittgenstein (Lenguajes: Self, JavaScript, DenotativeObjects).
  • Clase: Un objeto que representa un concepto presente en un dominio de problema.
  • Todo objeto es instancia de una clase. Los métodos está definidos en las clases.
  • Métodos de instancia vs métodos de clase: Los primeros definen el comportamiento de las instancias, mientras que los segundos, el comportamiento de la clase.
  • Objeto: Un objeto es todo lo que su jerarquía define (+ complejo!)
  • Subclase: Especialización. Ojo con el “es un”. Es más bien un “se comporta como”.
  • Clase abstracta (vs concreta):
    • No tiene realizaciones concretas, es decir, no hay entes de la realidad que puedo relacionar de forma exclusiva. Ej: Todo Número (abstracto) es real, entero, fraccionario, imaginario, etc.
    • Tiene al menos un mensaje abstracto (es decir, sin implementación y que debe definirse en las subclases).

Algorítmo de Method Lookup:

  • Se encarga de buscar el método asociado a un mensaje enviado.
  • Prototipado: Se busca en el objeto receptor un método con el mismo nombre que el del mensaje enviado. Si no está definido allí, se recorre hacia arriba la cadena de “padres”.
  • Subclasificación: Se busca primero en la clase de la cual el objeto es instancia. Si no se encuentra allí, se comienza a buscar en la jerarquía de superclases, comenzando por la superclase inmediata de la clase del objeto.
  • super: Pseudo-variable que referencia a self dentro de un método. A diferencia de self, al enviarle un mensaje, el método asociado se comienza a buscar a partir de la superclase donde está definido el método.

Acerca de los métodos y mensajes en smalltalk

nombreMensaje
	"comentarios"
	|respuesta|
	respuesta := 'Hello world'
	^respuesta

El ^ vendria a remplazar el return.

Se asigna el valor a una variable temporal con := o tambien con _.

Las variables se declaran entre | |

Podemos concatenar strings a traves de ,

El punto separa las colaboraciones. Es una forma de decir que viene otra colaboración luego del .

Heurísticas de diseño

  • Relación 1:1 entre objeto y ente de la realidad.
  • Buscamos que el conjunto de mensajes sea minimal -> Bajo acoplamiento, alta cohesión.
  • Guiarnos por el aspecto funcional conduce a buenos modelos.
  • Evitar romper encapsulamiento.
  • Nombrar a los objetos (colaboradores externos e internos) según el rol que cumplen en cada contexto.
  • Código repetido: Señal de que nos falta una abstracción.
  • Evitar subclasificar de clases concretas.
  • Pensar primero en composición/delegación por sobre subclasificación al momento de reutilizar código.

Técnicas

Algoritmo de quitar codigo repetido:

  1. Copiar lo repetido a “un lugar”
  2. Parametrizar lo que cambia
  3. Nombrar la nueva abstracción
  4. Reemplazar lo repetido por la nueva abstracción

Reemplazar if por polimorfismo

  1. Crear una jerarquía de clases con una clase por cada condición del if (si es que no existen).
  2. Mover el cuerpo del if de cada condición a cada abstracción del paso 1) utilizando un mensaje polimórfico.
  3. Nombrar el mensaje polimórfico.
  4. Nombrar las abstracciones generadas en el paso 1.
  5. Reemplazar el if por el envío del mensaje polimórfico.
  6. Buscar el objeto polimórfico (si es necesario)

TDD

  1. Escribir el test más sencillo que se me ocurra.
  2. Correrlo para comprobar que falle y hacerlo pasar con la implementación más simple posible.
  3. Reflexionar. ¿Se puede mejorar? Si es así, refactorizar.

Buenas prácticas

  • Definir mensajes abstractos de forma explícita (en Smalltalk: self subclassResponsibility)