Cornwall Peter: Klassenbasierte Programmierung - wie umgehen mit externen, globalen Werten?

Beitrag lesen

Danke für die fundierte Analyse!

Ich denke, dementsprechend hätten wir es tatsächlich mit einem Singleton zu tun.

Lässt es sich als Best Practice werten, hier eine entsprechend instanzenlose Singleton-Klasse zu kreieren? Würde ich diese dann einfach an Subklassen "durchreichen", frei nach dem [etwas verbosen] Motto:

/* ~~~~ ACTION! (GET TO DA CHOPPA) ~~~~ */

const myClassInstance = new MyClass(Singleton);
myClassInstance.createSubclassInstances(10); // creating 10 instances of SubClass (see below)
myClassInstance.mutateSharedSingleton("myValue"); // "myValue" could be any value: String | Number | Array | Object | Boolean
//
const mySubClassInstance = new SubClass(Singleton);
// !!!!!!!!!!!!!!!
// BOTH methods should now point to the SAME "myValue" (declared above):
myClassInstance.getSharedSingleton();
mySubClassInstance.getSharedSingleton();
//

/* ~~~~ CLASSES! ~~~~ */

class Singleton {
  static #singleton = "anyValue"; /* String | Number | Array | Object | Boolean */
  static set mutateSingleton(val) {
    /* do something with #singleton */
    Singleton.#singleton = val; /* | Singleton.#singleton.push(val); | (...) */
  }
  static get getSingleton() {
    return Singleton.#singleton;
  }
}

class MyClass {
  #sharedSingleton;
  #subclassArray = []; /* dependency with subclasses, to make matters even nicer and crispier 😏 */
  constructor(sharedSingleton) {
    this.#sharedSingleton = sharedSingleton;
  }
  mutateSharedSingleton(val) {
    this.#sharedSingleton.mutateSingleton(val);
  }
  getSharedSingleton() {
    return this.#sharedSingleton.getSingleton();
  }
  /* dependency with subclasses, to make matters even nicer and crispier 😏 */
  createSubclassInstances(num) {
    for (let i = 0; i <= num; i++) {
      const subClassInstance = new SubClass(this.#sharedSingleton);
      this.#subclassArray.push(subClassInstance);
    }
  }
  getSubclassInstances(/* FURTHER... */) {
    /* ...LOGIC */
  }
  treatSubclassInstances(/* FURTHER... */) {
    /* ...LOGIC */
  }
}

class SubClass {
  #sharedSingleton;
  constructor(sharedSingleton) {
    this.#sharedSingleton = sharedSingleton;
  }
  mutateSharedSingleton(val) {
    this.#sharedSingleton.mutateSingleton(val);
  }
  getSharedSingleton() {
    return this.#sharedSingleton.getSingleton();
  }
  /* More Code */
}

...? Danke nochmal für eure Gedanken dazu!

LG, Cornwall Peter