Cả hai switch
tuyên bố và đa hình đều có công dụng của chúng. Lưu ý rằng mặc dù cũng có một tùy chọn thứ ba (trong các ngôn ngữ hỗ trợ các con trỏ hàm / lambdas và các hàm bậc cao hơn): ánh xạ các định danh được đề cập đến các hàm xử lý. Điều này có sẵn trong ví dụ C không phải là ngôn ngữ OO và C # là *, nhưng không phải (chưa) trong Java cũng là OO *.
Trong một số ngôn ngữ thủ tục (không có hàm đa hình hay hàm bậc cao hơn) switch
/ if-else
câu lệnh là cách duy nhất để giải quyết một lớp các vấn đề. Vì vậy, nhiều nhà phát triển, đã quen với lối suy nghĩ này, tiếp tục sử dụng switch
ngay cả trong các ngôn ngữ OO, trong đó đa hình thường là một giải pháp tốt hơn. Đây là lý do tại sao nên tránh / tái cấu trúc các switch
câu lệnh có lợi cho đa hình.
Ở bất kỳ giá nào, giải pháp tốt nhất luôn phụ thuộc vào từng trường hợp. Câu hỏi là: tùy chọn nào cung cấp cho bạn mã sạch hơn, ngắn gọn hơn, dễ bảo trì hơn trong thời gian dài?
Báo cáo chuyển đổi thường có thể phát triển khó sử dụng, có hàng tá trường hợp, làm cho bảo trì của họ khó khăn. Vì bạn phải giữ chúng trong một chức năng duy nhất, chức năng đó có thể phát triển rất lớn. Nếu đây là trường hợp, bạn nên xem xét tái cấu trúc theo hướng giải pháp dựa trên bản đồ và / hoặc đa hình.
Nếu cùng switch
bắt đầu bật lên ở nhiều nơi, đa hình có lẽ là lựa chọn tốt nhất để thống nhất tất cả các trường hợp này và đơn giản hóa mã. Đặc biệt là nếu nhiều trường hợp dự kiến sẽ được thêm vào trong tương lai; bạn càng cần cập nhật nhiều nơi hơn, càng có nhiều khả năng xảy ra lỗi. Tuy nhiên, thường thì các trình xử lý trường hợp riêng lẻ rất đơn giản hoặc có rất nhiều trong số chúng hoặc có liên quan đến nhau, việc tái cấu trúc chúng thành một hệ thống phân cấp lớp đa hình đầy đủ là quá mức, hoặc dẫn đến rất nhiều mã trùng lặp và / hoặc bị rối, khó duy trì thứ bậc lớp. Trong trường hợp này, có thể đơn giản hơn khi sử dụng các hàm / lambdas (nếu ngôn ngữ của bạn cho phép bạn).
Tuy nhiên, nếu bạn có một switch
nơi duy nhất, chỉ với một vài trường hợp làm điều gì đó đơn giản, đó có thể là giải pháp tốt nhất để rời khỏi nó như nó là.
* Tôi sử dụng thuật ngữ "OO" lỏng lẻo ở đây; Tôi không quan tâm đến các cuộc tranh luận về khái niệm về OO "thực" hay "thuần túy".