2017-02-11 2 views
1

Ich habe es sehr schwer, Module zu schreiben, die typischerweise aus 3-5 kleineren Modulen oder Klassen bestehen. Das Problem tritt auf, wenn diese Unterkomponenten erweitert werden müssen, aber das Hauptmodul bereits ihre Basisversionen erstellt und implementiert.OOP für Mehrkomponenten-Klassen

Beispiel

// main module design 

class Car { 
    constructor() { 
    this.horn = new Horn(); 
    this.horn.on('honk', function() { 
     console.log('honked'); 
    }) 
    } 
} 

class Horn { 
    constructor() { 
    this.sound = 'hornA.wav' 
    } 
} 

// extended module design 

class RaceCar extends Car { 
    constructor() { 
    super(); 
    this.horn = new RaceHorn(); 

    // event handler is now missing 
    } 
} 

class RaceHorn extends Horn { 
    constructor() { 
    super(); 
    this.horn = 'hornB.wav' 
    } 
} 

Dies ist in der Tat ein sehr vereinfachtes Beispiel, während meine wahren Probleme Module mit mehr Komponenten und Einrichtungsanforderungen beinhalten. Ich verstehe, dass ich Dinge in eine andere init oder setup oder ähnliche Funktion setzen kann, aber für mich scheint es, als würde ich etwas falsch von Natur aus tun.

+1

weiter zu modularisieren. Sie sollten die Vererbung nicht als Mittel zum Konfigurieren verwenden. RaceCar sollte eigentlich nur eine Car-Instanz sein, die mit einer anderen Hupe konfiguriert ist, und das alles in einer Fabrik. – plalx

+0

Sie brauchen wahrscheinlich nicht einmal verschiedene Hörner, geben Sie einfach einen Parameter für den Sound-Dateinamen zu spielen. – Bergi

Antwort

1

Ich empfehle dringend, die Werte durch Parameter übergeben, was dieses Problem betrifft. Standardparameter kann viel helfen

// main module design 

class Car { 
    constructor(parametrizedHorn=Horn) { 
    this.horn = new parametrizedHorn(); 
    this.horn.on('honk', function() { 
     console.log('honked'); 
    }) 
    } 
} 

class Horn { 
    constructor() { 
    this.sound = 'hornA.wav' 
    } 
} 

// extended module design 

class RaceCar extends Car { 
    constructor() { 
    super(RaceHorn); 
    } 
} 

class RaceHorn extends Horn { 
    constructor() { 
    super(); 
    this.sound = 'hornB.wav' 
    } 
} 

Dieses sehr chaotisch bekommen, so stattdessen können Sie Initialisierungsmethoden verwenden

// main module design 

class Car { 
    constructor() { ... } 
    init(hornType=Horn){ 
    this.initHorn(hornType); 
    } 
    initHorn(hornType=Horn){ 
    this.horn = new Horn(); 
    this.horn.on('honk', function() { 
     console.log('honked'); 
    }) 
    } 
} 

class Horn { 
    constructor() { 
    this.sound = 'hornA.wav' 
    } 
} 

// extended module design 

class RaceCar extends Car { 
    constructor() { 
    super(); 
    } 
    init(hornType=RaceHorn){ 
    this.initHorn(hornType); 
    } 
} 

class RaceHorn extends Horn { 
    constructor() { 
    super(); 
    this.sound = 'hornB.wav' 
    } 
} 

const raceCar = new RaceCar(); 
raceCar.init(); 

Dies sind zwei modulare Muster, die Sie verwenden können, und in Abhängigkeit von der Art der Struktur Sie verwenden bereits, können Sie beurteilen, welcher der beste ist. Der Trick besteht darin, den Inhalt Ihrer Klasse zu parametrisieren oder mit Methoden