← Artykuły

Strategy w TypeScript: dwa sposoby liczenia, jeden klient

Zrozum Strategy na krótkiej funkcji. Zobacz, kiedy przekazanie algorytmu pomaga, a kiedy dodatkowy wzorzec jest zbędny.

Podkreślone pojęcia mają objaśnienia. Kod możesz skopiować i uruchomić u siebie.

Spis treści i pojęcia

Pojęcia pod ręką

Kliknij termin, aby zobaczyć definicję.

Cały słownik →

Problem: zmienia się sposób liczenia

Masz klienta, który pokazuje za liczbę miejsc. Dla zwykłej oferty każde miejsce kosztuje 100 jednostek; inna oferta ma limit całej ceny wynoszący 300. Klient ma działać z obiema regułami.

oznacza wymienny sposób wykonania operacji przy zachowaniu wspólnego . W często wystarczy przekazana .

Mały przykład

Zapisz jako strategy.ts i uruchom node strategy.ts w obsługującym tę składnię TypeScript. Uruchomienie nie sprawdza typów — w projekcie wykonaj również jego komendę typecheck.

typescript
type Price = (seats: number) => number;
function preview(price: Price, seats: number): number {
  if (!Number.isSafeInteger(seats) || seats < 0 || seats > 1000) {
    throw new RangeError("Invalid seat count");
  }
  return price(seats);
}
const regular: Price = seats => seats * 100;
const capped: Price = seats => Math.min(seats * 100, 300);
console.log(preview(regular, 4));
console.log(preview(capped, 4));

Wyniki to kolejno 400 i 300. W tym przykładzie cena jest liczbą całkowitych jednostek drobnych, a waluta jest ustalona poza funkcją. To mały model jednej reguły, nie kompletny system wyceny.

Co się zmienia, a co pozostaje wspólne?

preview sprawdza liczbę miejsc i wywołuje przekazaną funkcję. regular i capped realizują dwa algorytmy. Klient nie sprawdza nazwy oferty, żeby samemu wybierać kolejne gałęzie obliczenia.

Przepływ: 4 miejsca → wspólne sprawdzenie → wybrana reguła → 400 albo 300.

Dla -1 wejście zostaje odrzucone przed obliczeniem. Sam typ number nie gwarantuje liczby całkowitej ani poprawnego zakresu.

Kiedy nie dodawać wzorca?

Jeżeli masz jedną stabilną regułę i nie potrzebujesz jej wymieniać, zwykła funkcja jest wystarczająca. Strategy ma ułatwiać rzeczywistą zmianę. Dodawanie klas wyłącznie dla nazwy wzorca zwiększa liczbę miejsc do prześledzenia.

Twoja mała próba

Przewidź obie ceny dla 2 miejsc. Potem dodaj regułę, która obniża całkowitą cenę o 50 jednostek, ale nie dopuszcza wyniku ujemnego. Sprawdź zero miejsc i dodaj test, który wykrywa wynik poniżej zera.

Źródła

SPRAWDŹ SWOJĄ INTUICJĘ

Czy Strategy musi być hierarchią klas?

TERAZ TWÓJ KOD

Zrozumienie sprawdź w praktyce.

Kontynuuj w rozdziale TypeScript o wyborze wzorców i ich kompromisach.

Otwórz materiał i ćwiczenia →