všetky vzory

Marker

Označí triedu prázdnym rozhraním, podľa ktorého sa dá rozhodovať za behu.

// Prázdne označenie. Nemá ani jednu metódu — nesie len príslušnosť.class Zalohovatelne {} class Dokument extends Zalohovatelne {  constructor(text) {    super();    this.text = text;  }} class Obrazok extends Zalohovatelne {  constructor(pixely) {    super();    this.pixely = pixely;  }} class DocasneData {  constructor(hodnota) {    this.hodnota = hodnota;  }} class Zalohovac {  zalohuj(polozky) {    for (const polozka of polozky) {      if (polozka instanceof Zalohovatelne) {        this.uloz(polozka);      }    }  }} new Zalohovac().zalohuj([  new Dokument('zmluva'),  new Obrazok(pixely),  new DocasneData(42),   // nie je označené, preskočí sa]);

Celý priebeh v texte (11 krokov)
  1. Zalohovatelne je prázdne označenie. Nemá ani jednu metódu — nehovorí, čo trieda vie, iba to, že patrí do jednej skupiny.
  2. Dokument ho dedí. Nezískal tým žiadnu schopnosť, len príslušnosť.
  3. Obrazok tiež.
  4. DocasneData nie — k označeniu z nej nevedie čiara. A to je celá informácia, ktorú vzor nesie; nič viac v ňom nie je.
  5. Zálohovač prejde všetko, čo dostal. Prvý na rade je Dokument — a nepýta sa ho na nič, iba či do skupiny patrí.
  6. Patrí, takže sa zálohuje.
  7. Druhý je Obrazok. Tá istá otázka.
  8. Patrí tiež, hoci s dokumentom nemá spoločné vôbec nič — ani jednu metódu, ani jeden údaj.
  9. Tretie sú DocasneData. Tá istá otázka po tretí raz.
  10. Označenie nemajú, takže sa nevracia nič. Zálohovač ich preskočil a nemusel o nich vedieť vôbec nič — stačilo, kam patria.
  11. Rozhodlo sa podľa toho, kto označenie dedí, nie podľa toho, čo trieda vie. Označenie samo nerobí nič — a to je zároveň jeho slabina: nič nevynucuje a odobrať sa nedá.

Kedy použiť

  • Skupina tried má spoločnú vlastnosť, nie spoločné správanie. Nedá sa vyjadriť metódou, lebo žiadna spoločná metóda neexistuje — len príslušnosť.
  • Rozhodnutie padá za behu podľa typu. Kto do skupiny patrí, ide jednou cestou, kto nie, druhou — a zoznam skupiny netreba udržiavať nikde inde.
  • Príslušnosť má kontrolovať prekladač, nie zoznam mien. Označenie je súčasťou typu, takže preklep v ňom neprejde tak ako preklep v reťazci.
  • Knižnica má vedieť o cudzích triedach niečo, čo jej nikto nepovie. Autor triedy pridá označenie a knižnica sa podľa neho zariadi bez ďalšej konfigurácie.

Pasce

  • Prázdne označenie nič nevynucuje. Trieda ho môže dediť a pritom nespĺňať to, čo označenie sľubuje — kontrola je na programátorovi a prekladač mlčí.
  • Označenie sa dedí aj tam, kam nemalo. Potomok ho zdedí automaticky a stane sa členom skupiny bez toho, aby o tom niekto rozhodol.
  • Odobrať sa nedá. Keď má potomok z označenej skupiny vypadnúť, dedenie mu to neumožní — a hierarchia sa musí prestavať kvôli vlastnosti, ktorá s ňou nesúvisí.
  • Rozhodovanie podľa typu sa rozlezie po celej aplikácii. Každé miesto s otázkou „patrí sem?" je vetva, ktorá by pri normálnom rozhraní bola obyčajným volaním metódy.
  • V jazyku bez viacnásobného dedenia stojí označenie jedno miesto v hierarchii. Trieda, ktorá potrebuje dve označenia a ešte rodiča, ich nemá kam dať.
  • Zamieňa sa s bežným rozhraním. Rozhranie hovorí, čo trieda vie; označenie hovorí, kam patrí. Keď sa doň časom pridá metóda, prestalo to byť označenie.
  • Modernejšie jazyky to riešia inak. Anotácie alebo atribúty unesú aj údaje a nemíňajú dedenie — prázdne označenie je v nich zvyčajne horšia voľba.