es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mejores prácticas: agregar dos “event listeners” a un evento donde un “listener” requiere un parámetro pasado y el otro no lo requiere.

Podría ser una pregunta simple, pero tengo un evento, llamémoslo addObject. Emito este evento y tengo dos oyentes para él. Un oyente requiere que se pase un objeto “importante” constante, pero el otro no lo requiere. Entonces tengo algo como

myFunction1() {
  const importantObject = {...};
  // otra lógica
  this.emit('addObject');
  this.emit('addObjectWithParam', importantObject);
}

myFunction2() {
  // otra lógica
  const forceUpdate = this.forceUpdate.bind(this);
  this.addListener('addObject', forceUpdate);
}

myFunction3() {
  this.addListener(
    'addAuditTest',
    this.handlerFunction.bind(this),
  );
}

Parece que rompo una barrera de abstracción al emitir ‘addObject’ dos veces, pero lo hago así porque forceUpdate() no toma parámetros, pero necesito importantObject en handlerFunction().

¿Cuál es la mejor práctica o la forma más limpia de hacer esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución podría ser crear otro evento personalizado, llamémoslo addObjectWithoutParam, que se emite sin pasar ningún parámetro. Entonces, en lugar de addObject, myFunction2 puede escuchar este evento, y myFunction3 puede escuchar addObjectWithParam. De esta manera, ambos escuchadores podrán recibir el evento que necesitan sin que se pasen parámetros innecesarios.

    Entonces, el código se vería algo así:

    myFunction1() {
      const importantObject = {...};
      // lógica adicional
      this.emit('addObject');
      this.emit('addObjectWithParam', importantObject);
      this.emit('addObjectWithoutParam');
    }
    
    myFunction2() {
      // lógica adicional
      const forceUpdate = this.forceUpdate.bind(this);
      this.addListener('addObjectWithoutParam', forceUpdate);
    }
    
    myFunction3() {
      this.addListener(
        'addObjectWithParam',
        this.handlerFunction.bind(this),
      );
    }
    

    Este enfoque sigue el principio de responsabilidad única, donde cada evento tiene una sola responsabilidad y solo emite la información necesaria. También evita romper la barrera de abstracción al emitir el mismo evento con diferentes parámetros.

Comments are closed.