Tôi có một tập các lớp, mỗi lớp cần quyết định tại một số điểm nào đó trong hai hoặc ba phương pháp tiếp cận mà chúng nên sử dụng nội bộ để thực hiện cùng chức năng bên ngoài. Lý tưởng nhất, điều này nên bao gồm chức năng dự phòng, trong trường hợp nếu phương pháp tiếp cận không thành công, nó rơi qua để thử phương pháp ApproachB (và có lẽ là phương pháp tiếp cận C, D, v.v.). Cho đến bây giờ, tôi đã chỉ sử dụng mã hóa như if (!success) { ApproachB code }
. Vấn đề với điều này là một số phương pháp sau này cũng cần phải nhận thức được cách tiếp cận nào đã được chọn và tất cả chúng cũng phát triển các câu lệnh if (MethodChosen) { } else { }
của riêng chúng. Tôi thực sự muốn giải quyết vấn đề với một cái gì đó ít khó sử dụng hơn ... ngoại trừ không có các tùy chọn khác mà tôi đã xem xét có vẻ như tất cả những gì "wieldy". Dưới đây là ba cách tiếp cận mà tôi đã nghĩ đến:Thực hiện các lớp "Dự phòng"
- Thực hiện một phương pháp tĩnh. Tạo ra hai lớp có giao diện sao lưu chúng. Điểm bất lợi của điều này là bạn đang viết rất nhiều mã giống nhau hai lần, và nó không thực sự tạo ra một "dự phòng" vì nó buộc tất cả các quyết định phải được thực hiện phía trước trong phương thức .Create. Điều này sẽ làm việc 9/10 lần, nhưng sẽ có 1/10 lần khác mà tôi muốn dự phòng để đá chỉ khi chính đã cố gắng và thất bại.
- Giống như trên, nhưng với lớp cơ sở hoặc lớp trừu tượng có liên quan, hoặc là lớp ủng hộ cho cả hai hoặc với lớp chính làm lớp cơ sở cho dự phòng. Điều này có cùng một nhược điểm dự phòng, nhưng ít nhất có ít hoặc không có mã lặp lại.
Thực hiện một lớp trừu tượng bình thường-xây dựng với lớp trẻ mà có thể thay đổi thời gian chạy: ví dụ:
public void SomeMethodOrConstructor() { if (someConditions) MyChild = ChildClassA; else MyChild = ChildClassB; } public void Execute() { MyChild.Execute(); }
Vấn đề với lựa chọn 3 đang chuyển dữ liệu giữa hai khi cần thiết. Vì một số phương pháp này đang mô hình hóa các đối tượng bên ngoài, điều này sẽ khá thường xuyên. Các lớp lồng nhau có chia sẻ dữ liệu với lớp cha của chúng tự động không? Hoặc tôi sẽ phải vượt qua tất cả với mọi cuộc gọi?
Bất kỳ điều gì khác mà tôi nên cân nhắc?
Cập nhật: Lớp đầu tiên được thiết lập và hoạt động với Chuỗi trách nhiệm. Hiện tại, tôi đã chọn không sử dụng Mẫu chiến lược hoặc dự phòng trong khi thực thi phương pháp, vì tôi tin rằng cuối cùng có thể không cần thiết. Tôi nghĩ rằng hầu hết những thất bại thực hiện như vậy sẽ thực sự tốt hơn bằng cách ở trong các lớp học của riêng họ, vì sẽ không có thay đổi hoàn toàn về gameplan, chỉ cần một vài chỉnh sửa nhỏ để giải quyết. Nếu điều đó không đúng, tôi ít nhất biết tôi cần điều tra điều gì bây giờ.
Nhờ tất cả những người đã giúp giải pháp tối ưu!
Đối với người hiếu, giải pháp cuối cùng của tôi làm việc gần như thế này:
- Tạo Handler lớp trừu tượng, khá nhiều như được nêu trong bài viết Wikipedia, nhưng với một hàm
public abstract Handler GetHandler()
, và thêm các phương pháp trừu tượng khác như Load, Lưu, vv - Triển khai các lớp con xử lý riêng cho lớp cha (chúng cũng có thể là lớp con, vì chúng sẽ chỉ xử lý mọi thứ cho lớp cụ thể đó ... tránh các vấn đề đặt tên sau này). Các lớp con tất cả lấy một tham số kiểu của đối tượng cha mẹ trong hàm tạo của chúng, do đó chúng có thể truy cập dễ dàng vào dữ liệu của cha mẹ.
- Từ hàm khởi tạo của lớp cha, hãy thiết lập trình xử lý/người kế thừa chuỗi (một lần nữa, giống như ví dụ), sau đó gọi
FirstHandler.GetHandler(this)
và lưu kết quả để lớp đó biết trình xử lý nào sẽ sử dụng trong tương lai. - Các phương pháp được xử lý nhiều nhất sau đó chỉ cần giảm xuống
Handler.MethodName()
.
Bạn có thể đặt mã trong danh sách được đánh số bằng cách thụt lề bằng dấu cách _eight_. – SLaks
Cảm ơn bạn đã có mẹo định dạng, điều đó đã giúp tôi vượt tường! – RobinHood70