Example 1 — Business Rule (After)
type Money = number;
type TaxPolicy = { rate: number };
type DiscountPolicy = (total: Money, context: { isLoyal: boolean }) => Money;
const vatDE: TaxPolicy = { rate: 0.19 };
const loyaltyDiscount: DiscountPolicy = (total, { isLoyal }) =>
isLoyal ? total * 0.1 : 0;
function priceWithPolicies(
total: Money,
context: { isLoyal: boolean },
discount: DiscountPolicy,
tax: TaxPolicy
): Money {
const discounted = total - discount(total, context);
const taxed = discounted * (1 + tax.rate);
return Math.round(taxed * 100) / 100;
}
export const finalPriceForCheckout = (total: Money, isLoyal: boolean) =>
priceWithPolicies(total, { isLoyal }, loyaltyDiscount, vatDE);
export const finalPriceForQuote = (total: Money, isLoyal: boolean) =>
priceWithPolicies(total, { isLoyal }, loyaltyDiscount, vatDE);
- Single place encodes business knowledge