2009-03-26 58 views
6

Tôi đã có một cuộc chiến geek với một ai đó trên những gì mô hình chiến lược thực sự là và tôi cần một chuyên gia để giải quyết vấn đề.Định nghĩa chính xác về mẫu thiết kế chiến lược là gì?

Cả hai chúng tôi đều đồng ý rằng mẫu chiến lược cho phép ruột của một lớp (ví dụ: hành vi) được hoán đổi trong thời gian chạy trong khi vẫn duy trì cùng một giao diện. Tuy nhiên, tranh luận của cô ấy là "Đối với [thuật toán] là một chiến lược, Bạn sẽ phải có được kết quả tương tự". Sự tranh cãi của tôi là việc trao đổi "thuật toán" hoặc logic của một lớp có thể có nghĩa là kết quả của hoạt động bị ghi đè khác nhau, nhưng vẫn đáp ứng mục đích, ý định (và phân loại) của mẫu chiến lược.

mã ví dụ của cô với ý kiến:


Theo định nghĩa của bạn, bất kỳ lớp con của một lớp sẽ là một chiến lược. Chúng có cùng định nghĩa phương thức (chữ ký), và do đó có thể hoán đổi cho nhau.

Interface Strategy 
{ 
    DoArithmatic(int[] a) 
} 

Class A : Strategy 
public int DoArithmatic(int[]a) 
{ 
    int temp = 0; 
    for(int i =0; i< a.length; i++) 
      temp += a[i] 
} 

Class B : Strategy 
public int DoArithmaticB(int[]a) 
{ 
    int temp = 0; 
    for(int i =a.length -1; i>-1; i--) 
      temp += a[i] 
} 

Class C : Strategy 
public int DoArithmatic(int[]a) 
{ 
    int temp = 0; 
    for(int i =0; i< a.length; i++) 
      temp -= a; 
} 

int[] a = { 1,2,3 } 
ClassA.DoArithmatic(a) = 6 
ClassB.DoArithmatic(a) = 6 
ClassC.DoArithmatic(a) = -6//This one is not interchangeable 

Hai chiến lược đầu tiên là chiến lược. Bởi vì đối với bất kỳ đầu vào họ sẽ cung cấp cho bạn câu trả lời chính xác giống nhau. người cuối cùng thì không. Chỉ vì nó cung cấp cho bạn một int không làm cho nó một chiến lược. Họ phải "làm" điều tương tự.

Bạn không thể sử dụng cụm từ trừu tượng "cao hơn" chỉ để làm cho chúng trở thành chiến lược.

Tất cả đều làm "MATH" nhưng chúng không phải là tất cả làm điều "giống nhau" theo một cách khác. Đó là bản chất của một chiến lược.

Vì vậy, ai là đúng?

Trả lời

11

Bạn thưa bạn và đồng nghiệp của bạn cần đọc GoF.

"Mẫu chiến lược cho phép các thuật toán thay đổi độc lập với khách hàng sử dụng chúng."

Xem:

http://www.dofactory.com/Patterns/PatternStrategy.aspx

+1

nó cho phép các thuật toán thay đổi, nhưng nó có cho phép kết quả của chúng khác nhau không? tức là nó cho phép thực hiện khác nhau, nhưng còn giao diện thì sao? đó là những gì câu hỏi là về. –

+0

?? câu hỏi cụ thể cho biết "Chúng tôi đều đồng ý rằng mô hình chiến lược cho phép ruột của một lớp (ví dụ, hành vi) được hoán đổi trong thời gian chạy trong khi duy trì cùng một giao diện" –

+0

"khác nhau độc lập với khách hàng", nhưng làm cách nào thay đổi giữa nhau (chiến lược so với chiến lược)? Đó là câu hỏi. – eljenso

4

Tôi ủng hộ ý kiến ​​của bạn. Các chiến lược khác nhau có thể làm những việc rất khác nhau miễn là chúng có thể được sử dụng trong cùng một ngữ cảnh.

Ví dụ, nếu bạn muốn ghé thăm mỗi nút trong một cây, chiến lược có giá trị có thể là:

  • Depths-đầu tiên tìm kiếm đặt hàng trước
  • DFS sau để
  • BFS
  • ngẫu nhiên
  • ...

Tất cả chiến lược sẽ truy cập nút s theo thứ tự khác nhau, nhưng mục tiêu (ghé thăm mỗi nút) sẽ giống nhau. Vì vậy, nếu thứ tự không quan trọng, một trong hai chiến lược phù hợp với nhu cầu của bạn.

0

Tôi cũng phải đồng ý. Một ví dụ tốt sẽ là một chiến lược tính giá. Bạn có thể có các chiến lược khác nhau để tính toán số tiền cuối cùng của hóa đơn tùy thuộc vào một số biến số như số lượng mặt hàng, loại khách hàng, điểm đến giao hàng, v.v. một mẫu Chiến lược.

2

Theo "Head First Design Patterns" (see here) trang 24

"The Pattern Chiến lược định nghĩa một gia đình của các thuật toán,
gói gọn mỗi người, và làm cho họ hoán đổi cho nhau.
Chiến lược cho phép các thuật toán khác nhau một cách độc lập từ
khách hàng sử dụng nó. "

nên thưa bạn là chính xác, ít nhất là theo những người được xác định mô hình, nhưng những gì làm họ biết.

3

FWIW, số Wikipedia article đồng ý với bạn và chưa bao giờ nghe nói về vị trí của cô ấy.

6

Về mặt kỹ thuật, các chiến lược có thể làm bất cứ điều gì họ muốn. Chỉ là khi "bối cảnh bên ngoài" ra lệnh cho một số hành vi cố định và lặp lại mà không thể bị bắt trong giao diện chương trình (gọi chúng là "các thuộc tính mong muốn"), bạn cần phải cẩn thận rằng chiến lược của bạn thực sự có thể thay thế được Liskov liên quan đến những đặc tính mong muốn này.

2

Bạn đang sử dụng. Điểm của chiến lược là thay thế thuật toán. Cho dù họ cung cấp cùng một kết quả là một sản phẩm phụ của hành vi mong muốn.

3

Hai chiến lược đầu tiên là chiến lược. Đối với bất kỳ đầu vào nào, họ sẽ cung cấp cho bạn câu trả lời giống hệt nhau. người cuối cùng thì không. Chỉ vì nó cung cấp cho bạn một int không làm cho nó một chiến lược. Họ phải "làm" điều tương tự.

Họ phải làm điều tương tự, nhưng điều đó không có nghĩa là họ đưa ra kết quả tương tự. Ví dụ động lực từ GoF là một trong các thuật toán bố cục khác nhau, hoặc các thuật toán phân bổ đăng ký khác nhau. Các chiến lược có cùng một khối bố trí mục tiêu của văn bản và hình ảnh trên một trang hoặc gán sổ đăng ký ảo cho thanh ghi phần cứng - nhưng chúng không phải tạo chính xác cùng một kết quả.

Vì vậy, nếu mục tiêu của Strategy trong ví dụ của bạn là làm bất kỳ số học nào với đầu vào, thì mỗi ví dụ là một chiến lược cho mục tiêu đó. Nếu mục tiêu là để tổng hợp mảng nó được thông qua, DoArithmatic sẽ được gọi là CalculateSum và ví dụ cuối cùng sẽ không tuân theo hợp đồng chiến lược và vi phạm LSP.

2

Tôi nghĩ sẽ chính xác hơn khi nói rằng câu hỏi liệu các chiến lược phải giống hệt nhau về mặt xác định nằm ngoài phạm vi của định nghĩa về mẫu chiến lược hay không.

Nếu một hàm luôn trả về cùng một kết quả cho các đầu vào đã cho, thì đó là xác định. Nếu hai hàm là xác định và chúng luôn trả về cùng một giá trị cho cùng các đầu vào thì chúng tương đương về mặt xác định. Họ có thể hoặc có thể không có tác dụng phụ tương tự; nếu họ làm thì họ chỉ đơn giản là tương đương.

Thông thường đây không phải là trường hợp. Chúng ta hãy xem xét một ví dụ mà dường như yêu cầu xác định tương đương: phân loại. Bạn có thể nghĩ rằng nếu hai triển khai so sánh không trả về cùng một kết quả cho cùng một đầu vào thì ít nhất một trong số chúng phải bị lỗi, nhưng điều này không nhất thiết phải là trường hợp.

Sắp xếp các đơn đặt hàng khác nhau giữa các quốc gia. Một số nơi sắp xếp không có dấu trọng âm. Một số đặt McDuck với MacDuck, và vv.Đây là những chiến lược, đây là một ứng dụng hoàn hảo của mô hình chiến lược, và các chiến lược chắc chắn nhất là không phải là tương đương về mặt xác định.

Bạn thắng.

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