Đây là mùi code switch statements kinh điển: một hàm phân nhánh theo loại và phải sửa mỗi khi có loại mới.
Cách xử lý là tách mỗi nhánh thành một strategy cùng interface, rồi chọn strategy qua một bảng tra.
ts
interface ShippingRate {
calculate(order: Order): number
}
const rates: Record<string, ShippingRate> = {
ghtk: { calculate: (o) => 15000 + o.weightKg * 4000 },
ghn: { calculate: (o) => 18000 + o.weightKg * 3500 },
}
function shippingFee(carrier: string, order: Order) {
const rate = rates[carrier]
if (!rate) throw new Error(`unknown carrier: ${carrier}`)
return rate.calculate(order)
}Thêm hãng mới = thêm một entry, không đụng vào shippingFee. Mỗi công thức tách riêng nên test được độc lập.
Đừng làm quá: nếu chỉ có 2 nhánh và chúng gần như không đổi, if/else vẫn dễ đọc hơn. Chuyển sang Strategy khi nhánh đã bắt đầu lặp lại ở nhiều chỗ hoặc mỗi nhánh dài hơn vài dòng.