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.
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Ę

