Estoy desarrollando un juego en el que muy a menudo deseo realizar la siguiente operación:
if (!buffs.has("shielding")) { buffs.add(new ShieldingBuff(50)); // 50 is the shield amount } donde buffs es Map<string, Buff> .
Pensé envolverlo en una función auxiliar así:
function addBuff(buffType, buff) { if (!this.buffs.has(buffType) { this.buffs.add(buff); } }y luego llamándolo así:
addBuff("shielding", new ShieldingBuff(50)); Pero el problema con eso es que en el 99 % de los casos, el beneficio ya se habrá aplicado, y esto genera un costo significativo de recolección de elementos no utilizados, ya que estamos asignando un objeto ShieldingBuff independientemente de si realmente lo necesitamos o no.
Estaba pensando en usar un cortocircuito de alguna manera, pero no puedo pensar en una forma ergonómica de hacerlo. Lo mejor que pude hacer es llegar a algo como esto:
buffs.add(!buffs.has("shielding") && new ShieldingBuff(50)); que funciona para evitar la asignación en el caso de que el beneficio ya se haya aplicado ... pero aún es bastante detallado. Idealmente, sería capaz de encapsular el cheque has en la función de ayuda de alguna manera, pero no puedo ver una manera de hacerlo mientras mantengo el truco de cortocircuito para evitar la asignación en el caso mayoritario donde el beneficio ya está aplicado y nada. hay que hacer
Mi preocupación es que si tengo que acordarme de llamar a has check cada vez, eventualmente lo olvidaré y eso conducirá a un error. Me gustaría evitar eso si es posible.
Algo que tiene un poco de sobrecarga pero probablemente no tanto como ShieldingBuff sería una función simple que, cuando se llama, crea una:
addBuff("shielding", () => new ShieldingBuff(50)); function addBuff(buffType, makeBuff) { if (!this.buffs.has(buffType) { this.buffs.add(makeBuff()); } } Otro enfoque sería refactorizar su código para que no tenga que repetir 'shielding' y shieldingBuff ; en su lugar, use un objeto o Mapa para las mejoras en lugar de tener múltiples variables independientes.
Por ejemplo, con un objeto como
const buffs = { Shielding: function() { // code of ShieldingBuff here } // ... }Entonces puedes hacer
addBuff("shielding", 50) donde, si se cumple la condición, addBuff mayúscula la primera letra y pasa el 50 al constructor cuando es necesario, utilizando la notación de paréntesis para encontrar el constructor en el objeto de buffs .