Đối với một điều, các khối lớn của if/else
khối không dễ kiểm tra . Mỗi "nhánh" mới thêm một đường dẫn thực thi khác và do đó làm tăng độ phức tạp chu kỳ . Nếu bạn muốn kiểm tra mã của mình kỹ lưỡng, bạn phải bao gồm tất cả các đường dẫn thực thi và mỗi điều kiện sẽ yêu cầu bạn viết ít nhất một bài kiểm tra nữa (giả sử bạn viết các bài kiểm tra nhỏ, tập trung). Mặt khác, các lớp thực hiện chiến lược thường chỉ hiển thị 1 phương thức công khai, rất dễ kiểm tra.
Vì vậy, với lồng nhau, if/else
bạn sẽ kết thúc với nhiều thử nghiệm cho một phần mã của mình, trong khi với Chiến lược, bạn sẽ có một vài thử nghiệm cho từng chiến lược đơn giản hơn. Với cái sau, thật dễ dàng để có phạm vi bảo hiểm tốt hơn, bởi vì khó bỏ lỡ các đường dẫn thực thi.
Về khả năng mở rộng , hãy tưởng tượng bạn đang viết một khung, trong đó người dùng được cho là có thể thực hiện hành vi của chính họ. Ví dụ: bạn muốn tạo một số loại khung tính thuế và muốn hỗ trợ các hệ thống thuế của các quốc gia khác nhau. Thay vì triển khai tất cả chúng, bạn chỉ muốn cho người dùng khung cơ hội cung cấp cách triển khai cách tính một số loại thuế cụ thể.
Đây là mô hình chiến lược:
- Bạn xác định một giao diện, ví dụ
TaxCalculation
, và khung của bạn chấp nhận các thể hiện của loại này để tính thuế
- Người dùng của khung công tác tạo ra một lớp thực hiện giao diện này và chuyển nó đến khung của bạn, do đó cung cấp một cách để thực hiện một số tính toán
Bạn không thể làm tương tự với if/else
, bởi vì điều đó sẽ yêu cầu thay đổi mã của khung, trong trường hợp đó, nó sẽ không còn là khung nữa. Vì các khung thường được phân phối ở dạng biên dịch, đây có thể là lựa chọn duy nhất.
Tuy nhiên, ngay cả khi bạn chỉ viết một số mã thông thường, Chiến lược vẫn có lợi vì nó làm cho ý định của bạn rõ ràng hơn. Nó nói "logic này có thể cắm và có điều kiện", nghĩa là có thể có nhiều triển khai có thể thay đổi tùy thuộc vào hành động của người dùng, cấu hình hoặc thậm chí nền tảng.
Sử dụng mô hình chiến lược có thể cải thiện khả năng đọc bởi vì, trong khi một lớp mà thực hiện một số chiến lược đặc biệt thường nên có một tên mô tả, ví dụ USAIncomeTaxCalculator
, if/else
khối là "vô danh", trong trường hợp tốt nhất chỉ nhận xét và ý kiến có thể nói dối. Ngoài ra, theo sở thích cá nhân của tôi, chỉ có nhiều hơn 3 if/else
khối liên tiếp là không thể đọc được và nó trở nên khá tệ với các khối lồng nhau.
Các nguyên tắc mở / đóng cũng rất phù hợp, bởi vì, như tôi đã mô tả trong ví dụ trên, Chiến lược cho phép bạn mở rộng một logic trong một số phần của mã của bạn ( "mở cho phần mở rộng") mà không cần viết lại những bộ phận ( "đóng cửa sửa đổi" ).