1 من 41

POO en JS

Programación Orientada a Objetos

2 من 41

¿Qué saben de POO?

3 من 41

JSON (Repaso)

JavaScript Object Notation

Formato ligero para el intercambio de datos.

Alternativa a XML como representación de objetos.

let objeto =

{

"propiedad": valor,

"propiedad2": valor2,

"arreglo": [val1, val2]

}

4 من 41

Programación Estructurada

En Programación Estructurada

  • Los datos y los procedimientos están separados y sin relación.
  • Se procesan datos de entrada para obtener los de salida.
  • Anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan.
  • En la programación estructurada sólo se escriben funciones que procesan datos.

5 من 41

POO

  • Es un paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos.

  • Está basado en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento

6 من 41

POO

Los programadores que emplean POO primero definen objetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos.

Los objetos son entidades que tienen un determinado "estado", "comportamiento (métodos)" e "identidad".

7 من 41

Java

  • En Java y la mayoría de los lenguajes existen clases.
  • Las clases son un “molde” para objetos de esa clase.
  • Definen las propiedades y comportamiento de un tipo de objeto concreto.
  • La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ella.

8 من 41

Objetos en JS

  • Son pares clave-valor no ordenados
  • Se pueden acceder como array o como objeto
  • Son iterables
  • Se crean con funciones constructoras o escritos léxicamente {}
  • No existe control de privacidad explícito (se puede hacer usando ámbitos)
  • Hasta antes de ES6 no había clases

9 من 41

Cómo encarar un problema con POO

  • Detectar partes del problema (conceptos)
    • Una parte puede ser una cosa o un algoritmo/proceso.
    • Cada parte va a ser un objeto (o varios del mismo tipo) o un método del objeto

10 من 41

Javascript - Creemos un objeto

let dado = {}; //dado es un objeto

Les podemos agregar miembros dinámicamente.

dado.valor = 5;

En JS los objetos son como arreglos (el índice es un string)

console.log(dado["valor"]);//5

11 من 41

Objeto

Un objeto encapsula datos y comportamiento.

¿Dónde está el comportamiento?

dado.Tirar = function(){

this.valor = Math.floor((Math.random() * 6) + 1);}

https://codepen.io/webUnicen/pen/MoYmqz

12 من 41

Palabra this

La palabra clave this hace referencia al mismo objeto.

let dado1 = …

let dado2 = …

dado1.tirar() ;

dado2.tirar() ;

this en el código de tirar es “dado1” y “dado2” respectivamente.

13 من 41

Diseñando con POO

14 من 41

Diagramas

Los diagramas se utilizan para

  • visualizar mejor una idea
  • ordenar el pensamiento
  • comunicarse

15 من 41

Diagrama de Clases

Diagrama de UML.

Muestra las clases, sus atributos, operaciones (o métodos), y las relaciones entre los objetos.

Métodos

Miembros (atributos)

Clase

16 من 41

Clases

TBC...

Dado

17 من 41

Factory Functions

18 من 41

Funciones fábrica

Ok! Tengo un objeto con comportamiento. Pero yo tenía dos dados, no voy a copiar el JSON entero muchas veces!

Hago una función que me fabrica dados:

function crearDado() {

let d = {

"value":1,

"Tirar" : function() {

this.value...;

return this.value;

}

};

return d;

};

let d1 = crearDado();

d1.Tirar();

https://codepen.io/webUnicen/pen/MoYvaj

19 من 41

Let’s Work

Re armemos el juego de dados

20 من 41

Función constructora

Otra forma de escribir lo mismo

21 من 41

Función Constructora

  • Similar a la anterior.
  • No devuelve una nueva variable, sino que
    • Construye un objeto sobre “this”

22 من 41

Función Constructora

let Dado = function (initial) {

this.value = initial;

this.Tirar = function() {

this.value...;

return this.value;

};

};

let d1 = new Dado(1);

d1.Tirar(); // "Nacho"

No olvidar el new!!!

Siempre usar this!

https://codepen.io/webUnicen/pen/eRmRwd

23 من 41

Let’s Work

Re armemos el juego de dados

24 من 41

Prototipo

Otra forma de escribir lo mismo

25 من 41

Repetición de código

  • Cada variable es una función, pero todas las funciones son iguales.
  • El código lo escribimos una vez, pero en la memoria está muchas veces!
  • Ocupa mucha memoria innecesariamente.

26 من 41

Prototipo

  • Todos los objetos tienen un prototipo.
  • Concepto (un poco) parecido a una clase.
    • En lugar de agregar los métodos (las funciones) a cada objeto, podemos agregárselos al prototipo.
    • Todos los objetos tienen los mismos métodos y propiedades que su prototipo (busca en el objeto, después busca en el prototipo).

27 من 41

Prototipo

Agregamos los miembros y métodos al prototipo.

function Dado () {

this.value = 1;

};

/*No hacer así. Tiene efectos colaterales difíciles de encontrar si value es un objeto (tipo no primitivo).

Dado.prototype.value = 1; //NO!

*/

Dado.prototype.Tirar = function() {

this.value = ...;

return this.value;

};

https://codepen.io/webUnicen/pen/gRbxry

28 من 41

Sólo a tus objetos

No modificar prototipos que no posees vos

  • posees solo aquellos que vos definiste

29 من 41

Let’s Work

Re armemos el juego de dados

30 من 41

Closures (para tener privacidad)

Otra forma de escribir lo mismo

31 من 41

Usar JSON como clase

  • El uso del closure permite encapsular los datos internos.
  • Encapsular: nadie que no sea el objeto los puede modificar
  • Esto es uno de los principios de POO.
  • Implica que necesariamente tengo una función para cada objeto (porque cambia las variables que accede).

32 من 41

Usar JSON como clase

Podemos crear objetos JSON y devolverlos en el “constructor”.

function Dado (name) {

let value = 1; //variable dentro de este scope

return {

getValue: function() {return value;},

Tirar: function() {

value = Math.floor((Math.random() * 6) + 1);

...getElementById(name).src = "..."+value+"...";

}

}

};

https://codepen.io/webUnicen/pen/MoYvbJ

33 من 41

Let’s Work

Re armemos el juego de dados

34 من 41

Class (ES6)

Otra forma de escribir lo mismo

35 من 41

Creemos un objeto (ES6)

class Dado {� constructor(valor) {� this.valor = valor;� }�}�let dado = new Dado(5);�console.log(dado.valor);

36 من 41

Comportamiento

Un objeto encapsula datos y comportamiento.

¿Dónde está el comportamiento?

class Dado {� constructor(valor) {� this.valor = valor;� }� tirar(){� this.valor = Math.floor((Math.random() * 6) + 1);� }�}

https://codepen.io/webUnicen/pen/BZydxN

37 من 41

Instancias de Dado

Para crear dados tengo que llamar a new.

Esto llama al constructor, que en nuestro caso asigna el valor por parámetro a la variable valor del objeto.

let dado1 = new Dado(5);�let dado2 = new Dado(6);�console.log(dado1.valor);�console.log(dado2.valor);

38 من 41

Llamando funciones

  • ¿Cómo hago para llamar tirar?
  • ¿Qué número va a imprimir en la consola?

let dado = new Dado(5);�dado.tirar();�console.log(dado.valor);

39 من 41

Let’s Work

Re armemos el juego de dados

40 من 41

Bibliografía

41 من 41

AHORA LES TOCA PRACTICAR :D