RORO PIRRORO

Recursos
Resumen
Factory pattern (o fábrica de objeto) y RORO (Recibir un Objeto, Retornar un Objeto) son dos patrones que nos ayudan a crear moldes de objetos a partir de funciones. Con ello ya no sería necesario utilizar objetos literales ni deep copy con recursividad.
Generando objetos a partir de funciones
Generaremos una función que nos permita generar nuevos estudiantes. Esta función va a recibir un objeto (con los datos del nuevo estudiante) como parámetro y devolverá el nuevo objeto generado.
function isObject(subject) { return typeof subject == "object"; } function isArray(subject) { return Array.isArray(subject); } function createStudent({ name, email, age, twitter, instagram, facebook, approvedCourses, learningPaths, }) { return { name, email, age, approvedCourses, learningPaths, socialMedia: { twitter, instagram, facebook, }, }; }
Antes de crear nuevos objetos, podríamos darles unas mejoras a nuestra función:
- Los atributos
approvedCoursesylearningPathsdeberían ser arreglos vacíos por defecto y así evitamos que seanundefineden caso de que no se envíen datos en el momento que se genere un nuevo estudiante:
function isObject(subject) { return typeof subject == "object"; } function isArray(subject) { return Array.isArray(subject); } function createStudent({ name, email, age, twitter, instagram, facebook, approvedCourses = [], // 👈👈 learningPaths = [], // 👈👈 }) { return { name, email, age, approvedCourses, learningPaths, socialMedia: { twitter, instagram, facebook, }, }; }
-
Si en caso de invocar a la función
createStudentno mandamos siquiera un objeto vacío como argumento, nos dará un error. Evitemos esto declarando que el parámetro que recibe la función puede ser un objeto vacío por defecto:
function isObject(subject) { return typeof subject == "object"; } function isArray(subject) { return Array.isArray(subject); } function createStudent({ name, email, age, twitter, instagram, facebook, approvedCourses = [], learningPaths = [], } = {}) { // 👈👈 return { name, email, age, approvedCourses, learningPaths, socialMedia: { twitter, instagram, facebook, }, }; }
- Deberíamos hacer que algunos campos como
emailsean obligatorios de enviar, pues, no todos los atributos se deberían quedar comoundefinedni tampoco deberíamos poner valores por defecto a ciertos datos personales de un estudiante. Por tanto, deberíamos avisar mediante un mensaje de error personalizado que ciertos campos son obligatorios:
function isObject(subject) { return typeof subject == "object"; } function isArray(subject) { return Array.isArray(subject); } // Creamos una función con el objetivo de generar un Error el cual // tendrá un mensaje customizado por nosotros. // Como parámetro indicamos el nombre del atributo que no se está enviando (String) function requiredParam(param) { // 👈👈 throw new Error(param + " es obligatorio"); // Este es el mensaje de error generado } function createStudent({ // Por defecto, invocamos a la nueva función requiredParam en aquellos // atributos que deseamos que sean obligatorios. Indicamos como argumento el nombre // de dicho atributo. name = requiredParam("name"), // 👈👈 email = requiredParam("email"), // 👈👈 age, twitter, instagram, facebook, approvedCourses = [], learningPaths = [], } = {}) { return { name, email, age, approvedCourses, learningPaths, socialMedia: { twitter, instagram, facebook, }, }; }
Ahora, si intentamos crear un objeto que no tenga, por ejemplo, asignado un valor en la propiedad `name`, la consola nos mostrará el mensaje de error que creamos:
const juan = createStudent({ email: "juanito@frijoles.co"});
 Aprendamos ahora a cómo crear [propiedades privadas en JavaScript](https://platzi.com/clases/2419-javascript-poo-intermedio/39817-module-pattern-y-namespaces-propiedades-privadas-e/). 👨💻🚀 *Contribución creada por: Martín Álvarez (Platzi Contributor)*

