Új hozzászólás Aktív témák

  • Pala

    veterán

    Sziasztok! :) Akad itt valaki, aki object composition (és ezzel kapcsolatos patternek, best practice-ek) terén otthonosabban mozog.

    Szinte bárhol olvasok a témáról, általában a lentihez hasonló példákkal illusztrálják, hogyan is néz ez ki a gyakorlatban (ez nem az én kódom, csak példa):

    const canCast = (state) => ({
    cast: (spell) => {
    console.log(`${state.name} casts ${spell}!`);
    state.mana--;
    }
    })

    const canFight = (state) => ({
    fight: () => {
    console.log(`${state.name} slashes at the foe!`);
    state.stamina--;
    }
    })

    const fighter = (name) => {
    let state = {
    name,
    health: 100,
    stamina: 100
    }

    return Object.assign(state, canFight(state));
    }

    const mage = (name) => {
    let state = {
    name,
    health: 100,
    mana: 100
    }

    return Object.assign(state, canCast(state));
    }

    scorcher = mage('Scorcher')
    scorcher.cast('fireball'); // Scorcher casts fireball!
    console.log(scorcher.mana) // 99

    slasher = fighter('Slasher')
    slasher.fight(); // Slasher slashes at the foe!
    console.log(slasher.stamina) // 99

    Namármost, nekem ezzel az a problémám, hogy a kompozíció során minden egyes object instance új példányt kap ugyanabból a metódusból is, tehát tkp. elkezdjük szépen teleszemetelni a memóriát, kvázi feleslegesen. Kérdés, hogy:
    1. El tudjuk-e ezt kerülni úgy, hogy a fenti kódban a canCast és canFight továbbra is pure function-ök maradjanak (mondjuk most a bennük lévő console.log miatt nem azok, de azt most gondolatban vegyük ki :) )!? (Pusztán azt elérni, hogy egy metóduson osztozzanak az instance-ek, nem nehéz.)

    Épp most írok egy játékot, ahol object compositiont használok, százas nagyságrendben készülnek majd objektumok, és nem találtam igazán szép megoldást erre a problémára.

Új hozzászólás Aktív témák