7

Tôi đã chuyển qua lại giữa C# và Java trong 8 năm qua.Bạn có sử dụng Mẫu Phương thức Mẫu bằng các ngôn ngữ lập trình có đóng cửa/đại biểu/con trỏ hàm không?

Một điều khiến tôi ngạc nhiên là tôi đã hoàn toàn dừng sử dụng mẫu thiết kế "Phương thức mẫu" trong C#. Trên thực tế, trong C# Tôi đã nghĩ đến mô hình này như là một mô hình chống.

http://en.wikipedia.org/wiki/Template_method_pattern

Coming back to Java, tôi thấy mô hình là sống và đá. Tôi vẫn nghĩ rằng nó trông cổ, nhưng nhận ra rằng không có cách nào khác để làm điều này trong java. Java trông cổ quá;)

Vì điều này sẽ được đưa ra anyway, Tại sao nó là một antipattern?

  • Rất nhiều lần sử dụng phân cấp thừa kế của bạn vì "lý do sai".
  • Các lớp cơ sở có xu hướng trở nên rải rác với tất cả các loại mã không liên quan.
  • Nó buộc bạn phải khóa thiết kế, thường khá sớm trong quá trình phát triển. (Khóa sớm trong nhiều trường hợp)
  • Thay đổi điều này ở giai đoạn sau trở nên khó hơn và khó hơn.

Vì vậy, với đóng cửa/đại biểu/con trỏ hàm, bạn thường chuyển một số chức năng thay vì phân lớp phụ.

Vì vậy, trở lại câu hỏi:

Nếu ngôn ngữ của bạn có đóng cửa/đại biểu/chức năng, bạn có sử dụng phương pháp Template, và khi nào?

Trả lời

4

Khi tôi sử dụng Java, có. Nhưng đối với các ngôn ngữ với "đóng cửa/đại biểu/chức năng", Lua trong trường hợp của tôi, không có tôi không nữa, thay vào đó tôi đã nghiêng nhiều hơn và nhiều hơn nữa hướng tới decoration pattern cho hầu hết các nhu cầu của tôi.

3

Có, tôi sử dụng phương pháp mẫu mọi lúc, bằng ngôn ngữ lập trình D. Đóng cửa, đại biểu và con trỏ chức năng là do bản chất của họ rất lỏng lẻo cùng với lớp cơ sở. Đây là một điều tốt khi bạn muốn khớp nối lỏng lẻo này. Mặt khác, đôi khi các hành vi mà bạn đang tùy biến là do bản chất của chúng rất chặt chẽ với lớp cơ sở. Những hành vi như vậy sẽ vô ích trong bất kỳ bối cảnh nào khác. Trong trường hợp khớp nối này là cần thiết, mẫu phương thức mẫu là cách đơn giản nhất, sạch nhất để thể hiện nó. Một thử nghiệm đơn giản là bạn nên luôn sử dụng chiến lược/đóng/đại biểu/con trỏ hàm nếu liên lạc giữa lớp cơ sở và hành vi tùy chỉnh là một chiều, tức là lớp cơ sở gọi hành vi có thể tùy chỉnh và chính xác. Nếu hành vi tùy chỉnh cần tham chiếu đến lớp cơ sở để nó có thể gọi các phương thức, vv, thì mẫu phương thức mẫu thường là cách đơn giản nhất để tiếp tục.

+0

Thật thú vị khi đọc câu trả lời của bạn. Bạn có thể đưa ra một ví dụ cho nơi mẫu phương pháp mẫu là 'tuyệt đối' là tốt nhất, đặc biệt là khi khớp nối tốt? Chỉ cần giả định khớp nối là xấu luôn! – rpattabi

+0

@ragu: Vấn đề không phải là việc ghép nối tốt hay xấu. Vấn đề là liệu nó là cần thiết hay không cần thiết. Nếu nó là cần thiết thì IMHO cách dễ nhất để thể hiện nó là phương thức mẫu. – dsimcha

+0

Tôi hiểu bạn chỉ để trả lời câu hỏi trong tay. Câu hỏi của tôi là chung chung. Để tôi ghép nối trong mẫu khuôn mẫu là một tác dụng phụ xấu. Bất kỳ ví dụ về khớp nối là tốt? – rpattabi

2

Tôi sẽ thêm câu trả lời thêm một trong khi tôi đang xem xét lại chủ đề này:

Các mô hình phương pháp mẫu là tốt hơn so với các mô hình chiến lược khi các chính sách bạn đang tùy chỉnh đối tượng cơ sở của bạn với nhu cầu biết về nhau và chỉ có thể có ý nghĩa trong một tập con rất hạn chế của tất cả các kết hợp có thể. Ví dụ, giả sử lớp cơ sở của bạn có hàm bê tông doIt() và móc beforeDoIt(), được thiết kế để cho phép các chính sách tự khởi tạo và afterDoIt(), được thiết kế để cho phép các chính sách tự dọn dẹp sau chính chúng.Bạn sẽ không muốn đặt những hành vi này một cách độc lập bởi vì chúng chỉ có ý nghĩa khi được ghép nối.