JavaScript Object Oriented Patterns:

Koodin organisointi säästää meidät monelta tuskalta. Käyttämällä olio-ohjelmoinnin ominaisuuksia voimme käyttää tiettyjä suunnittelumalleja paremman luettavuuden saavuttamiseksi, redundanssin vähentämiseksi ja tarvittaessa abstraktioiden luomiseksi. Yksi tällainen malli on tehdasmalli.

Tehdasmalli on eräänlainen objektisuuntautunut malli, joka noudattaa DRY-menetelmää. Kuten nimestä voi päätellä, objektin instanssit luodaan käyttämällä tehdasta, joka tekee meille tarvittavan objektin.

Katsotaanpa hyvin yksinkertainen esimerkki tehdasmallin käytöstä alligator objektin kokoamiseen. Tätä varten meidän on ensin tehtävä tehtaat, jotka luovat alligator-osat puolestamme:

class TailFactory { constructor(props) { this.tailLength = props.tailLength; }};class TorsoFactory { constructor(props) { this.color = props.color; }};class HeadFactory { constructor(props) { this.snoutLenth = props.snoutLenth; }};

Luo nyt luokka, joka toimii välittäjänä varsinaisten tehdasluokkien ja käyttäjän välillä. Kutsutaan tätä ReptilePartFactory:

class ReptilePartFactory { constructor(type, props) { if(type === "tail") return new TailFactory(props); if(type === "torso") return new TorsoFactory(props); if(type === "head") return new HeadFactory(props); }};

Kootaan nyt varsinainen alligaattori ja käytetään ReptilePartFactory:a saadaksemme tarvitsemamme osat:

let alligator = {};let alligatorProps = { tailLength : 2.5, color: "green", snoutLenth: 1};//gets a tail from the tail factoryalligator.tail = new ReptilePartFactory("tail", alligatorProps); //gets a torso from the torso factoryalligator.torso = new ReptilePartFactory("torso", alligatorProps);//gets a head from the head factoryalligator.head = new ReptilePartFactory("head", alligatorProps);

Katsokaa yllä olevaa mallia, näyttää siltä, että voisimme käyttää samaa ReptilePartFactory:a luodaksemme osia alligaattorin kaltaisille objekteille. Taustalla olevien tehtaiden ei tarvitsisi koskaan tietää lopullisen objektin luonnetta.

Tehdasmallin käyttäminen antaa meille siis tiettyjä etuja:

  • Dynaaminen objektin luominen: Sitä voidaan käyttää tapauksissa, joissa objektin tyyppi päätetään ajonaikana.
  • Abstraktio: Käyttäjän ei oikeastaan koskaan tarvitse käyttää varsinaisen objektin konstruktoria.
  • Uudelleenkäytettävyys/ylläpito: Samoja tehtaita voidaan käyttää samankaltaisille objekteille ja sen avulla voimme lisätä/poistaa uusia objektiluokkia helposti muuttamatta paljon koodia.

Nyt kun meillä on jonkin verran ymmärrystä tehdasmallista, tutkitaan hieman paremman tehdasmallin koodin kirjoittamista.

Ylläolevassa esimerkissä käytetään if-taulukkoa sen selvittämiseen, mitä tehdasta pitää kutsua käyttäjän syötteen perusteella. Tämä on yksinkertainen toteutus, intuitiivinen eikä kovin avoin muutoksille. Jos meillä on uusia osia lisättäväksi myöhemmin, meidän pitäisi häiritä ReptilePartFactory. Tämä rikkoo SOLID-periaatteita, joiden mukaan ”Ohjelmistokokonaisuuksien (luokat, moduulit, funktiot jne.) tulisi olla avoimia laajennuksille, mutta suljettuja muutoksille.”

Miten olisi, jos tallentaisimme tehdasluokat objektiin ja kutsuisimme tarvittavan osatehtaan käyttämällä avaimena haluamaamme osaa? Ensin meidän pitäisi rekisteröidä tehtaat, se olisi niinkin yksinkertaista kuin:

let registeredPartFactories = {};registeredPartFactories = class TailFactory{ ...};registeredPartFactories = class TorsoFactory { ...};registeredPartFactories = class HeadFactory { ...};

Ja nyt abstrakti kerros voi kutsua tehtaita näin:

class ReptilePartFactory { constructor(type, props) { return new registeredPartFactories(props); }};

Tämä lähestymistapa on paljon siistimpi ja mahdollistaa tehtaidemme laajentamisen ilman, että se vaikuttaa koodiin ReptilePartFactory.

Johtopäätöksinä

On useita muitakin olio-orientoituneita malleja, jotka lisäävät myös luettavuutta ja laatua. Tarkista siis ennen tehdaskuvion käyttöä, onko sille todellista tarvetta. Jos aiot luoda samantyyppisiä objekteja toistuvasti ja tarvitset myös kerroksen, jolla voit luoda uusia instansseja käyttämällä näitä objekteja ja samalla tarjota jonkinlaisen abstraktiotason luomislogiikalle, niin kyllä – tehdasmalli on hyvä vaihtoehto.

Vastaa

Sähköpostiosoitettasi ei julkaista.