Estoy tratando de crear un modelo para la aplicación NodeJS usando JavaScript y MySQL. Ahora, recibí un consejo para usar el patrón de construcción porque mi objeto se vuelve demasiado grande y no se puede leer. Por lo tanto, creé otra clase y dentro del constructor creé una instancia de la clase básica, como la vi en los tutoriales.
// Basic class User { constructor(fname) { this.fname = fname; }; } // Builder for the user class module.exports = class UserBuilder { constructor(fname) { this.user = new User(fname); } setLname(lname) { this.user.lname = lname; return this; } setEmail(email) { this.user.email = email; return this; } setPassword(password) { this.user.password = password; return this; } setAge(age) { this.user.age = age; return this; } setGender(gender) { this.user.gender = gender; return this; } setAvatar(avatar) { this.user.avatar = avatar; return this; } setPhoneNumber(number) { this.user.number = number; return this; } build() { return this.user; } } Mi primera pregunta es: ¿cómo puedo validar todos los argumentos? algunos de los argumentos no son obligatorios y isAdmin debe ser False por defecto.
Para verificar esto, creé una instancia básica para ver cómo se construye.
const user = require('./models/user.js'); const User = new user('bob').setAge(22).build(); console.log(User);Mi segunda pregunta es cómo puedo crear un método dentro de la clase para editar o eliminar el objeto e interactuar con la base de datos. ¿O debería estar en los controladores?
Probablemente no te entendí en algunas partes de tu pregunta. Pero lo intenté. Básicamente, esto hizo que la clase de constructores fuera mucho más pequeña al agregar nuevas propiedades. Ahora solo necesita proporcionar la clave y el valor para agregar algo al objeto en lugar de llamar a un método separado para ello.
Nota : el método de edit y remove no necesita llamar al método de build para devolver la clase de usuario base. Todas sus preguntas han sido respondidas en los comentarios del código.
/// Basic class User { constructor(fname) { this._validate(fname); this.fname = fname; } _validate(param) { //what ever you wanna check before adding into object } } // Builder for the user class class UserBuilder { constructor(fname) { this.user = new User(fname); } addSomething(key, value) { if (typeof key !== "string") { //throw "Key provided is not a string." } key = key.toLowerCase(); if (key == "role") { this.user[key] = this.isAdmin(); return this; } this.user[key] = value; return this; } isAdmin() { // your way to check if its admin. /** * if(admin == true) { * return true; * } else return false; */ } edit(param, val) { if (!this.has(param)) { //throw } else { this.user[param] = val; //db operation to edit it. } return this.user; } /** * By delete Object I suppose delete a property. */ remove(param) { if (!this.has(param)) { //throw } else { delete this.user[param]; //db operation to remove it. } return this.user; } has(val) { return this.user[val] ? true : false; } build() { return this.user; } }; const userr = new UserBuilder("Vox"); console.log(userr.addSomething("age", 19).build()); console.log(userr.edit("age", 21)); console.log(userr.remove("age"));Esto es lo que registró el código.
User { fname: 'Vox', age: 19 } User { fname: 'Vox', age: 21 } User { fname: 'Vox' }