všetky vzory

Null Object

Dodá neutrálneho zástupcu namiesto prázdnej hodnoty, takže volanie nepadne.

class Discount {  apply(amount) { throw new Error('abstraktná metóda'); }} class WinterDiscount extends Discount {  apply(amount) {    return amount * 0.8;  }} // A neutral stand-in: it meets the interface, but does nothing.class NoDiscount extends Discount {  apply(amount) {    return amount;  }} class Cart {  constructor(discount) {    this.discount = discount;  }   total(amount) {    // No check for an empty value — there is nothing to check.    return this.discount.apply(amount);  }} const withDiscount = new Cart(new WinterDiscount());const withoutDiscount = new Cart(new NoDiscount()); withDiscount.total(100);      // 80withoutDiscount.total(100);   // 100

Celý priebeh v texte (9 krokov)
  1. Discount je abstraktný a vie jediné: zmeniť sumu. Obe implementácie ho dedia — aj tá, ktorá nerobí nič.
  2. Prvý košík má zimnú zľavu. Drží si ju ako ktorúkoľvek inú.
  3. Košík počíta cenu a zľavu použije. Nepýta sa, či nejakú má — volá ju rovno.
  4. Naspäť príde zmenená suma. Sto eur sa zmenilo na osemdesiat.
  5. Druhý zákazník nemá na zľavu nárok. Bez vzoru by tu bola prázdna hodnota — a košík by sa musel pred každým použitím pýtať, či vôbec nejakú zľavu má.
  6. So vzorom dostane NoDiscount. Nie je to prázdno — je to plnohodnotný objekt, ktorý dedí to isté rozhranie ako zimná zľava.
  7. Košík počíta cenu presne tak isto ako predtým. Ani jedna podmienka navyše, ani jeden riadok rozdiel.
  8. A naspäť príde suma nezmenená. Volanie prebehlo, nič nespadlo a nič sa nestalo — presne to znamená „neutrálny".
  9. Prázdna hodnota by si vynútila kontrolu na každom mieste, kde sa zľava volá. Neutrálny objekt ju nahradí raz — a cena je v tom, že keď spolupracovník chýba omylom, vzor to zakryje rovnako ticho, ako keby to bol zámer.

Kedy použiť

  • Kontrola na prázdnu hodnotu zmizne z dvadsiatich miest na jedno.
  • „Nič" má rozumnú odpoveď: nulová zľava, prázdny zoznam, záznamník bez zápisu.
  • Volajúci dostane objekt ako každý iný a nerieši výnimku z pravidla.
  • Keď väčšina objednávok nemá zľavu, neprítomnosť nie je výnimočný prípad.

Pasce

  • Ticho zakryje chybu. Chýbajúci spolupracovník omylom vyzerá rovnako ako zámerné „nič".
  • Neutrálna odpoveď nie je vždy zrejmá — pri návratovej hodnote sa musí uhádnuť.
  • Každé rozhranie potrebuje vlastnú neutrálnu triedu plnú prázdnych metód.
  • Kto potrebuje vedieť, či zľava naozaj existuje, pýta sa na typ — a kontrola je späť.
  • Null safety hovorí „tu nič nie je", neutrálny objekt „tu je niečo, čo nič nerobí".
  • Neutrálny objekt, ktorý si niečo pamätá, je obyčajná implementácia s mätúcim menom.