2009-06-11 58 views
23

Tôi tự hỏi những ưu điểm/khuyết điểm của việc sử dụng delegate vs OOP khi thực hiện mẫu thiết kế chiến lược là gì?C# Mẫu thiết kế chiến lược của Delegate vs OOP

Bạn đề xuất sử dụng loại nào? hoặc giải quyết vấn đề gì? và tại sao chúng ta nên sử dụng OOP nếu OOP tốt hơn?

Cảm ơn!

-tep

Trả lời

36

Cả hai kỹ thuật đều có thể mạnh mẽ và có giá trị - dưới đây là một số ý kiến ​​của tôi về thời điểm sử dụng.

Sử dụng một giao diện/phương pháp thực hiện khi chiến lược:

  1. duy trì trạng thái cấu hình
  2. nhu cầu
  3. sử dụng dependency injection
  4. cần phải được cấu hình bởi IoC container (nghĩ ConnectionProvider)
  5. kết hợp nhiều trách nhiệm (nghĩ DataAdapter từ ADO.NET)
  6. là quá phức tạp hay dài như một phương pháp đơn
  7. có khả năng được subclassed để tạo ra các chiến lược mới
  8. nhu cầu quay trở lại trạng thái thông tin cho người gọi
  9. nhu cầu để truy cập vào bên trong của đối tượng là áp dụng cho
  10. có đòi hỏi quá nhiều thông số trực tiếp

nếu không, có xu hướng sử dụng các đại biểu dựa trên Func <> hoặc hành động <>, đặc biệt là nếu

  1. Có khả năng là một loại rất lớn của chiến lược (suy nghĩ sắp xếp biểu thức)
  2. Chiến lược tốt nhất là thể hiện dưới dạng như lambda
  3. Có một phương pháp hiện tại bạn muốn tận dụng
2

Tôi thích sử dụng giao diện để trừu tượng hóa chiến lược của mình. Triển khai cụ thể của tôi sau đó có một tập tin có thể nhìn thấy cho mỗi chiến lược. Khi làm việc với một Class thay vì một phương thức, nó sẽ mang đến cho bạn sự linh hoạt hơn. Tôi có thể sử dụng xác ướp Rhino để vạch ra chiến lược để kiểm tra nó. Tôi cũng có thể dễ dàng sử dụng DI framework chẳng hạn như Ninject để ràng buộc ứng dụng chiến lược rộng rất dễ dàng. Tôi sử dụng Delegates để trích xuất thực hiện chủ yếu trong WinForm Dialogs.

15

Trong ủng hộ các đại biểu:

  • Các đại biểu dễ thực hiện theo cách nhẹ hơn bằng cách sử dụng biểu thức lambda và phương pháp động
  • Các đại biểu có thể được tạo ra từ phương pháp "bình thường" với chữ ký đúng
  • Các đại biểu là đa đúc thể có ích vào những thời điểm (mặc dù tương đối hiếm khi bên ngoài eventing)

Ủng hộ các giao diện:

  • một đối tượng có thể thực hiện một giao diện và vẫn làm những việc khác: một đại biểu là chỉ một đại biểu
  • một interfac e có thể có nhiều phương thức; một đại biểu chỉ có một

thể đi một trong hai cách:

  • Với giao diện bạn kết thúc với hai tên: giao diện và phương pháp. Với các đại biểu bạn chỉ có một. Thông thường, tôi thấy rằng các giao diện phương thức đơn lặp lại cùng một tên hai lần (với các biến thể) hoặc tên phương thức là rất nhạt nhẽo

Cá nhân tôi là một fan hâm mộ lớn về tính linh hoạt, nhưng nó thực sự phụ thuộc vào tình hình.

6

Theo ý kiến ​​của tôi, nếu bạn sử dụng đại biểu thì bạn không thực sự triển khai Strategy pattern. Bạn đang thực sự triển khai một cái gì đó giống như Observer pattern. Toàn bộ điểm của các mẫu thiết kế là khi bạn nói "Tôi đã sử dụng mẫu Chiến lược ở đây", mọi người đều có nhiều bối cảnh về những gì bạn đã làm. Khi bạn bắt đầu nói những thứ như "Tôi đã sử dụng mẫu Chiến lược ngoại trừ các sửa đổi cá nhân của riêng mình", thì mọi thứ trở nên khó chịu.

Nhưng, nếu tôi hiểu những gì bạn đang cố gắng nói, một trong những điều tốt đẹp về mẫu Chiến lược không rõ ràng với các đại biểu là bạn có thể có một hệ thống phân cấp các đối tượng thực hiện chiến lược.

Giả sử tôi đang thử nghiệm một số phần mềm. Tôi muốn thử nghiệm nó bằng cách sử dụng chuột và sử dụng bàn phím. Vì vậy, tôi sẽ thực hiện một mô hình Chiến lược để cắm vào phương thức giao diện để sử dụng cho từng trường hợp thử nghiệm ... vì vậy tôi có thể viết trường hợp thử nghiệm một lần và chạy hoàn toàn bằng cách sử dụng MouseStrategy và KeyboardStrategy. Từ đó tôi có thể thực hiện các chuyên ngành như MouseExceptForDialogsStrategy, một chuyên ngành của MouseStrategy. Loại phân cấp này, cách mở rộng và ghi đè nó có thể dễ dàng được hiểu bởi bất kỳ ai quen thuộc với khái niệm OOP ... trong khi cách để đạt được và mở rộng tương tự với các đại biểu thì phức tạp hơn và rất mơ hồ hơn nhiều.

Như với nhiều thứ ... nó không phải là một câu hỏi "bạn có thể làm điều đó?", Nhưng "bạn nên làm điều đó?".

Các vấn đề liên quan