No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Duck typing en JavaScript

16/20
Recursos

Vamos a definir cu谩les son las propiedades que deben tener ciertos objetos para determinar cu谩l es cu谩l y as铆 construir objetos m谩s completos.

Validando que un objeto tenga lo necesario

Vamos a validar que cuando generemos un nuevo estudiante, las rutas de aprendizajes tengan los datos necesarios para poder ser agregados en el array del atributo learningPaths:

  1. Creamos una funci贸n createLearningPath para poder generar nuevas rutas de aprendizaje. Aqu铆 validaremos que tenga los atributos necesarios:

    function isObject(subject) {
      return typeof subject == "object";
    }
    
    function isArray(subject) {
      return Array.isArray(subject);
    }
    
    function requiredParam(param) {
      throw new Error(param + " es obligatorio");
    }
    
    function createLearningPath({ // 馃憟馃憟
    	name = requiredParam("name"), // Campo obligatorio
    	courses = [], // Lista de Cursos que pertencen a la ruta de aprendizaje
    }) {}
    
    function createStudent({
      name = requiredParam("name"),
      email = requiredParam("email"),
      age,
      twitter,
      instagram,
      facebook,
      approvedCourses = [],
      learningPaths = [],
    } = {}) {
      const privateAtributos = {
        "_name": name,
      };
    
      const publicAtributos = {
        email,
        age,
        approvedCourses,
        learningPaths,
        socialMedia: {
          twitter,
          instagram,
          facebook,
        },
    		get name() {
          return privateAtributos["_name"];
        },
    		set name(newName) {
          if (newName.length != 0) {
            privateAtributos["_name"] = newName;
          } else {
            console.warn("Tu nombre debe tener al menos 1 caracter");
          }
        },
      };
    
      return publicAtributos;
    }
    
  2. Creamos 2 variables en las que dividiremos nuestras propiedades p煤blicas y privadas:

    function isObject(subject) {
      return typeof subject == "object";
    }
    
    function isArray(subject) {
      return Array.isArray(subject);
    }
    
    function requiredParam(param) {
      throw new Error(param + " es obligatorio");
    }
    
    function createLearningPath({
    	name = requiredParam("name"), // Campo es obligatorio
    	courses = [], // Lista de Cursos que pertencen a la ruta de aprendizaje
    }) {
    	const private = { // 馃憟馃憟 Atributos privados
    		"_name": name,
    		"_courses": courses,
    	};
    	const public = {}; // 馃憟馃憟
    }
    
    function createStudent({
      name = requiredParam("name"),
      email = requiredParam("email"),
      age,
      twitter,
      instagram,
      facebook,
      approvedCourses = [],
      learningPaths = [],
    } = {}) {
      const privateAtributos = {
        "_name": name,
      };
    
      const publicAtributos = {
        email,
        age,
        approvedCourses,
        learningPaths,
        socialMedia: {
          twitter,
          instagram,
          facebook,
        },
    		get name() {
          return privateAtributos["_name"];
        },
    		set name(newName) {
          if (newName.length != 0) {
            privateAtributos["_name"] = newName;
          } else {
            console.warn("Tu nombre debe tener al menos 1 caracter");
          }
        },
      };
    
      return publicAtributos;
    }
    
  3. En la variable public definiremos los getters y setters para los atributos name y courses:

    function isObject(subject) {
      return typeof subject == "object";
    }
    
    function isArray(subject) {
      return Array.isArray(subject);
    }
    
    function requiredParam(param) {
      throw new Error(param + " es obligatorio");
    }
    
    function createLearningPath({
    	name = requiredParam("name"), // Campo es obligatorio
    	courses = [], // Lista de Cursos que pertencen a la ruta de aprendizaje
    }) {
    	const private = { // Atributos privados
    		"_name": name,
    		"_courses": courses,
    	};
    	const public = { // 馃憟馃憟 Getters y Setters
    		get name() {
    			return private["_name"];
    		},
    		set name(newName) {
    			if (newName.length != 0) {
    				private["_name"] = newName;
    			} else {
    				console.warn("El nombre debe tener al menos 1 caracter");
    			}
    		},
    		get courses() {
    			return private["_courses"];
    		},
    	};
    }
    
    function createStudent({
      name = requiredParam("name"),
      email = requiredParam("email"),
      age,
      twitter,
      instagram,
      facebook,
      approvedCourses = [],
      learningPaths = [],
    } = {}) {
      const privateAtributos = {
        "_name": name,
      };
    
      const publicAtributos = {
        email,
        age,
        approvedCourses,
        learningPaths,
        socialMedia: {
          twitter,
          instagram,
          facebook,
        },
    		get name() {
          return privateAtributos["_name"];
        },
    		set name(newName) {
          if (newName.length != 0) {
            privateAtributos["_name"] = newName;
          } else {
            console.warn("Tu nombre debe tener al menos 1 caracter");
          }
        },
      };
    
      return publicAtributos;
    }
    

    En este caso no definimos un setter a courses, ya que聽no cualquiera deber铆a realizar asignaciones a ese atributo.

  4. Ahora en la funci贸n createStudent eliminamos el atributo learningPaths de los atributos p煤blicos y lo pasamos al objeto de atributos privados. Luego, generaremos el getter y setter respectivo:

    function isObject(subject) {
      return typeof subject == "object";
    }
    
    function isArray(subject) {
      return Array.isArray(subject);
    }
    
    function requiredParam(param) {
      throw new Error(param + " es obligatorio");
    }
    
    function createLearningPath({
    	name = requiredParam("name"), // Campo es obligatorio
    	courses = [], // Lista de Cursos que pertencen a la ruta de aprendizaje
    }) {
    	const private = { // Atributos privados
    		"_name": name,
    		"_courses": courses,
    	};
    	const public = { // Getters y Setters
    		get name() {
    			return private["_name"];
    		},
    		set name(newName) {
    			if (newName.length != 0) {
    				private["_name"] = newName;
    			} else {
    				console.warn("El nombre debe tener al menos 1 caracter");
    			}
    		},
    		get courses() {
    			return private["_courses"];
    		},
    	};
    }
    
    function createStudent({
      name = requiredParam("name"),
      email = requiredParam("email"),
      age,
      twitter,
      instagram,
      facebook,
      approvedCourses = [],
      learningPaths = [],
    } = {}) {
      const privateAtributos = {
        "_name": name,
    		"_learningPaths": learningPaths, // 馃憟馃憟
      };
    
      const publicAtributos = {
        email,
        age,
        approvedCourses,
        //learningPaths,馃憟馃憟
        socialMedia: {
          twitter,
          instagram,
          facebook,
        },
    		get name() {
          return privateAtributos["_name"];
        },
    		set name(newName) {
          if (newName.length != 0) {
            privateAtributos["_name"] = newName;
          } else {
            console.warn("Tu nombre debe tener al menos 1 caracter");
          }
        },
    		get learningPaths() { // 馃憟馃憟
    			return private["__learningPaths"];
    		},
    		set learningPaths(newLP) { // 馃憟馃憟
    			// AQU脥 empezamos a aplicar DUCK TYPING 馃憖馃
          if (!newLP.name) {
    				// Si la nueva ruta de aprendizaje NO tiene el atributo "name"...
            console.warn("Tu LP no tiene la propiedad name");
            return; // Cortamos el proceso y no agregamos la ruta de aprendizaje
          }
    
          if (!newLP.courses) {
    				// Si la nueva ruta NO tiene asignado un array
    				// en el atributo "courses"
            console.warn("Tu LP no tiene courses");
            return; // Cortamos el proceso y no agregamos la ruta de aprendizaje
          }
    
          if (!isArray(newLP.courses)) {
    				// Si el atributo "courses" en la nueva ruta de aprendizaje NO es un Array
            console.warn("Tu LP no es una lista (*de cursos)");
            return; // Cortamos el proceso y no agregamos la ruta de aprendizaje
          }
    
    			// Si la nueva ruta de aprendizaje pas贸 por todas las validaciones
    			// correctamente...Quiere decir que S脥 es una ruta v谩lida tal como
    			// la deseamos que fuese. Por tanto, procedemos a a帽adir ese Learning Path
    			// a la lista de rutas del estudiante:
          private["_learningPaths"].push(newLP);
        },
      };
    
      return publicAtributos;
    }
    

Ser o parecer una instancia de otro objeto

Ahora ya podr铆amos a帽adir nuevas rutas con los atributos que esperamos que tenga una ruta de aprendizaje a los nuevos estudiantes:

// NUEVO ESTUDIANTE:
const juan = createStudent({email:"[email protected]",name:"Juanito"});

// Le asignamos al estudiante "juan" un ruta de aprendizaje:
juan.learningPaths = {
	name: "Escuela de Desarrollo Web",
	courses: [],
}

En teor铆a, la ruta que a帽adimos es un learning path, sin embargo, no hemos validado que se haya generado esa ruta de aprendizaje con la funci贸n generadora de learning paths (createLearningPath). Es decir, nosotros no creamos la ruta de 鈥渄esarrollo web鈥 de este modo:

const escuelaWeb = createLearningPath({
	name: "Escuela de Desarrollo Web",
	courses: []
})

Si no que lo hicimos directamente en el objeto juan. El objeto escuelaWeb es una ruta que hered贸 las propiedades de la funci贸n f谩brica de learning paths y el otro es uno que producimos directamente desde el objeto juan.

Lo anterior nos lleva al problema SER o TENER: no estamos validando si nuestros learning paths son realmente objetos que se construyeron desde createLearningPath, lo que validamos es que s铆 tienen los atributos que esperar铆amos que tenga una ruta de aprendizaje.

Comenzaremos a utilizar nuevamente prototipos de JavaScript para ahora s铆 validar qu茅 objetos son realmente rutas de aprendizajes y no solo confirmar si tienen o no las propiedades que los convierte en un learning path. Aprendamos acerca de *instance of* en JavaScript. 隆Vamos a ello! 馃懆鈥嶐煔馃殌

Contribuci贸n creada por: Mart铆n 脕lvarez (Platzi Contributor)

Aportes 27

Preguntas 12

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

En mi ruta de aprendizaje personal si puedo agragar cursos. Jaque mate! B)

Esta clase en especifico me parece que es la viva muestra de las dificultades que enfrenta la ense帽anza del oficio de la programaci贸n a base de escribir c贸digo con las comodidades de una computadora.
Una pizarra tiene la posibilidad de aterrizar toda la abstracci贸n que representan los paradigmas y sus soluciones, despues de que esto este aterrizado, ahi si hay que escribir codigo, ah铆 si hay que hacer la transferencia sintactica.
Ojala se den cuentra pronto de este grave problema en Platzi, tienen un trabajo fuerte que realizar en didactica.

Muy entendible todo, pero cada vez me gusta mas TS por lo mismo xd

La clase esta entendible pero hay q hacer un gran esfuerzo de parar muchas veces volver a verlo y apuntar el estado del codigo segun los min del video.
seria muy util ponerle un 鈥渋ndice de minutos鈥 vs eventos (asi como se puede hacer en youtube 鈥 mas o menos asi) .
eso ayudaria bastante a brincar de un punto a otro mas rapido para ver bien que parte del codigo nos perdimos.
por que mucho scroll.
y esa mecanica serviria para toda la plataforma creo yo.

Me gusta la manera en la que nos introducimos en los getters y setters, es mucho m谩s integral que en otros cursos =)

Viene pasando en muchos de los cursos de la ruta de Desarrollo Web, a veces el profesor tiene un ritmo de scroll bastante r谩pido y desorienta much铆simo. Ni siquiera viendo varias veces el v铆deo logras centrarte. Es una pena.
Hay m茅todos mucho mejores para ense帽ar que scrollear todo el rato un c贸digo. Una l谩stima.

Se puede declarar una variable como privada asi #miVariable, con el # la volvemos privada y sha

Como recomendaci贸n, se deber铆a mejorar en la metodolog铆a, eso de borrar c贸digo o editar c贸digo de anteriores clases confunde, se pierde mucho tiempo en tratar de entender un video, adem谩s se deber铆a explicar el porque de cada paso q se realiza. Los cursos muy poco did谩cticos.

Hola! Me gusta mucho como explica el profe pero me gustaria profundizar mas en esta clase, asi sea con un ejemplo un poco mas sencillo! Creo que por lo que ya teniamos un codigo tan grande y toco borrar todos los commentarios y mover codigo de un lado a otro me perdi mucho 馃槮

Se trata de una estimaci贸n subjetiva de si el objeto es de un tipo u otro seg煤n las propiedades y m茅todos que lo compongan.

Sin embargo, en Javascript, puede ser una herramienta 煤til para determinar tanto el tipo de datos de un objeto concreto hasta para facilitar una pseudo implementaci贸n de interfaces cuando programamos en POO puro.
路鈹

en algunos cursos siento que falta practicas de verdad, 贸sea en los cursos el profesor que lo este dando, explica todo y va haciendo alg煤n ejercicio de ejemplo, pero si quiero practicar por mi cuenta no se donde podr铆a aplicarlo en algo que sea 煤til y no solo escribir c贸digo sin sentido,

me gastar铆a que los ejemplos que pongan sean de alg煤n problema que se vea en la vida real o se cree alg煤n programa que solucione algo de verdad, alguna mini pagina que resuelva alg煤n problema aplicando lo que se vea en las clases,

porque la mayor铆a de ejemplos que ponen, solo se hacen para que entendamos como funciona, pero no solucionan ning煤n problema, o es c贸digo que solo esta por estar, es como escribir la teor铆a

tambi茅n me gastar铆a alg煤n curso o una serie de cursos as铆 sea exclusivo para expert , donde hagamos una pagina completa con todas sus funcionalidades, como si ya estuvi茅ramos en una empresa o como FreeLancer y nos dijeran aqu铆 est谩n los dise帽os, crea esta pagina que consuma api que se conecte con el backend que tenga un login en fin que sea completa,

Seria mas practico si se realiza con un proyecto real.
ya que en este curso para poder interpretrar en los proyecto que uno quiera aplicar se tendra muchas falencias.

馃憖 Fue bastante confusa esta clase por el scroll. Pero veamos si entendi: 驴Hay que hacer verificaciones de los valores recibidos en las propiedades? En este caso comprobar que el nombre de la ruta no este vacio y que se halla recibido un array.(?

En resumen:
Todo fluye.
No puedo ba帽arme dos veces en el mismo r铆o, pues yo no soy el mismo, y el r铆o tampoco
Her谩clito de 脡feso

velocidad de video, todos poner su Playback Rate en 0.85x y no en 1x

Se olvido de decir learnignPath鈥 馃槖

鈥淒esarroSHo web鈥 bien argento jajajaja

Como critica constructiva, el scroll deber铆a ser mas lento y explicarse un poco mejor a donde se est谩 moviendo dentro del c贸digo. A partir del 4:10 me pierdo entre tantos scrolls r谩pidos.

el curso es bueno y esta bien dado. Esta mal ordenado a la hora de mostrar el c贸digo, ya que al reutilizar c贸digo hace todo en el mismo archivo y termina teniendo un chorizo gigante de cosas que usa en un momento borra en otras y as铆. Lo cual al final para la relectura del estudiante a futuro lo deja muy enredado. Creo que deber铆a tomar las propiedades de c贸digo que si usara, pegarlas en un nuevo archivo y ah铆 si mostrar lo que quiere hacer, para que quede mas ordenado y al final pegar todo en un solo main para la ejecuci贸n. Yo fui sacando pedazos de c贸digo de esa manera y lo note mucho mas legible. Este problema tambi茅n se encuentra en el curso b谩sico de POO de js y la verdad queda un main.js enorme y dif铆cil de releer.

Un poco dificil de enteder a la primera, pero luego se va aclarando poco a poco el contexto del ejercicio. Espero poder hacerlo individualmente en otro proyecto :篓)

Bueno, sent铆 que entend铆 esta clase, pero tambi茅n me complique por el desorden del profe.

10:14 toca verificar que funcione la clase o factorypattern createStudent tras sus nuevos cambios en get y set learningPaths

function createLearningPaths empezo a exisir

ya pego los get y set en createLearningPaths(){..... public={ por aca dentro }}

Borro setter de Courses en createLearningPaths()

crea dentro de createStudent los metodos get y set para la propiedad learningPaths ojo dentro de

Validando el parametro learningPaths en el set learningPaths dentro de createStudent