Tại sao mô hình tiêm phụ thuộc không được bao gồm trong Gang of bốn?


37

Tại sao mô hình tiêm phụ thuộc không được đưa vào nhóm bốn người ? GOF đã thử nghiệm tự động rộng rãi trước ngày? Là tiêm phụ thuộc bây giờ được coi là một mô hình cốt lõi?


18
.. bởi vì "tiêm phụ thuộc" không phải là một mô hình!
Dipan Mehta


14
Tất cả mọi thứ được lặp đi lặp lại tạo thành một mô hình của sự lặp lại. Tất cả các yếu tố thiết kế (không phải là ý tưởng độc đáo, điên rồ) là "mẫu".
S.Lott

3
Những câu trả lời dài này có thể gây hiểu nhầm, vì chúng xác nhận câu hỏi. Trong khi, như đã đề cập, tiêm phụ thuộc không phải là một mẫu thiết kế. Nó là một "cơ chế" để khởi tạo đối tượng, thường được xử lý bởi khung công tác.
Nazar Merza

1
Phụ thuộc tiêm là một mô hình . Nó phản đối mẫu Định vị dịch vụ. Đọc Fowler người đặt ra thuật ngữ. Tôi hoàn toàn không biết làm thế nào nhiều người ủng hộ những điều vô nghĩa như vậy.
James

Câu trả lời:


101

Tôi là biên tập viên của tạp chí Phát triển phần mềm khi cuốn sách Gang of Four ra mắt và tôi có thể nói với sự tự tin hoàn toàn rằng kiểm thử đơn vị không phải là một thực tiễn phổ biến vào năm 1994, khi Mẫu thiết kế ban đầu được xuất bản.

Vào năm 1994, C ++ là ngôn ngữ hướng đối tượng được sử dụng phổ biến nhất và hầu hết mọi người lập trình nó đều đến từ nền C. Một trong những điều "suy nghĩ trong đồ vật" mà mọi người đơn giản không có là ý tưởng về hàng trăm hoặc hàng ngàn điểm vào chương trình của bạn. Bạn nghĩ về main(). Nếu bạn đã làm việc trong một dự án lớn, bạn có thể có một tệp thực hiện (thường khá phức tạp) để tạo một chương trình dựa trên mô-đun. Nhưng "kiểm thử đơn vị"? Bắt đầu một quá trình, xây dựng bối cảnh bộ nhớ cần thiết, thực hiện nó và xé nó ra, trên cơ sở mỗi phương pháp ? Điều đó rất triệt để.

Java làm cho lập trình nhiều điểm nhập rõ ràng hơn. Vào thời điểm bùng nổ Dot-Com ban đầu, thử nghiệm đơn vị là một kỹ thuật nổi tiếng, nhưng nó thực sự là JUnit (khoảng năm 2001?) Khiến nó bắt lửa và trở thành một thông lệ.

Mặc dù Chiến lược và khái niệm chung về lập trình cho giao diện là một phần của GoF và chủ nghĩa tư tưởng giữa thập niên 90, ý tưởng tiêm chích đã đến khá muộn cho bữa tiệc (khoảng '03 -'05?). Thành thật mà nói, những sợi tóc màu xám của tôi vẫn còn khá mơ hồ về khía cạnh đó của DI ("Hãy rời khỏi bãi cỏ của tôi đi, các tập tin cấu hình chết tiệt!").


17
Tôi rất tiếc rằng tôi chỉ có một phiếu bầu để đưa ra một câu trả lời sâu sắc như vậy.

@Larry OBrien: quét các đăng ký dựa trên quy ước đơn giản hóa rất nhiều mã cấu hình và thực tế loại bỏ cấu hình xml trong các thùng chứa ioc.
quentin-starin

4
Tôi muốn thêm rằng tiêm phụ thuộc vào lõi của nó hoàn toàn không dựa vào các tệp cấu hình. Bạn có thể làm tất cả bằng tay, điều này làm cho nó rất dễ sử dụng và vẫn là một cách tiếp cận rất linh hoạt.
marco-fiset

31

Họ gọi đó là Chiến lược .

Chiến lược của họ dường như có tất cả các tính năng của tiêm phụ thuộc mà không có tên nghe có vẻ phức tạp.


16
-1. Lấy làm tiếc! Mô hình chiến lược không liên quan gì đến Dependency Injection.
Dipan Mehta


14
@Dipan: trước khi đi xuống, bạn nên suy nghĩ về câu trả lời năm phút.
Doc Brown

6
đúng là Dependency Injection có thể được coi là rất giống với Mô hình chiến lược, nhưng khi mọi người nói tiêm phụ thuộc, họ thường có nghĩa là Inversion of Control, mà tôi nghĩ khác biệt hơn nhiều so với Chiến lược (đặc biệt là container IoC).
MattDavey

8
DI là một mô hình sáng tạo hơn. Nó tạo ra và tiêm chiến lược. Nói rằng đó là một chiến lược chỉ là một nửa sự thật. DI là một mô hình vi hạt nhân hơn! Tôi không thể tin mọi người ủng hộ điều này. Chiến lược giống như một đặc điểm của DI tốt, không cần thiết.
Falcon

0

Tôi nghĩ Dependency Injection có liên quan hơn khi tách việc thực hiện theo các bậc. Một lĩnh vực khác mà chúng tôi nghĩ về tiêm phụ thuộc là thử nghiệm đơn vị. Và đề nghị trước ngày của bạn dường như là chính xác. Nếu các băng đảng thu thập và tách biệt các mô hình vào năm 2012, chắc chắn tiêm phụ thuộc sẽ ở đó.

Chiến lược có thể được đưa ra trong các cuộc thảo luận nhưng Chiến lược không nói về tiêm phụ thuộc. Nhưng khi sử dụng mẫu chiến lược trong một dự án hoặc dll (tất cả các lớp và giao diện vẫn còn trong một dự án), có vẻ như chúng ta đang thực hiện tiêm phụ thuộc. Trong thực tế, chúng tôi không.

Bây giờ, nếu các lớp và giao diện được đề cập trong mẫu chiến lược được phân tách trong các dự án hoặc tầng khác nhau thì WE sẽ phải sử dụng các kỹ thuật tiêm phụ thuộc. Chúng tôi có thể sử dụng các tệp cấu hình thống nhất (mặc dù không thể thay đổi thời gian chạy). Nhưng mô hình Chiến lược không nói làm thế nào để tiêm một phụ thuộc.

Nếu có một mẫu tương tự gần với phép tiêm Dependency thì đó là mẫu Phương thức nhà máy trừu tượng. Mẫu này có thể được sử dụng trong mẫu chiến lược để tăng sự phụ thuộc.


2
Điều này không trả lời câu hỏi. Vui lòng đọc câu hỏi ban đầu thay vì trả lời các câu trả lời khác :)
Andres F.

-4

Chiến lược trả lời đúng 100%. Tôi đã bình chọn nó nhưng có thể bình luận.

"Chiến lược cho phép thuật toán thay đổi độc lập với các khách hàng sử dụng nó. [1] Chiến lược là một trong những mẫu được bao gồm trong cuốn sách Các mẫu thiết kế có ảnh hưởng của Gamma và cộng sự đã phổ biến khái niệm sử dụng các mẫu để mô tả thiết kế phần mềm."

Một mẫu thiết kế không phụ thuộc vào việc sử dụng nó. Dependency Injection được thực hiện bằng cách sử dụng mẫu Chiến lược. Nếu chúng ta đặt tên cho mỗi mẫu dựa trên trường hợp sử dụng, chúng ta sẽ phải đổi tên rất nhiều mẫu.

Mẫu kho lưu trữ không phải là một mẫu mới, nó là Mẫu Mẫu.

"Trong phương thức mẫu của mẫu thiết kế này, một hoặc nhiều bước thuật toán có thể được ghi đè bởi các lớp con để cho phép các hành vi khác nhau trong khi vẫn đảm bảo rằng thuật toán bao trùm vẫn được tuân theo."

Thông thường các mẫu là nhiều mẫu được kết hợp và đặt tên như mẫu MVC.

GOF không có giao diện cho các lớp Pure Trừu tượng đã sử dụng và cũng tận dụng khả năng kế thừa của C ++ từ nhiều hơn một lớp.


1
Mục đích của một mô hình hoàn toàn quan trọng trong việc phân biệt. Trong số các mẫu GoF, Adaptor và Proxy là những ví dụ điển hình - chúng có cùng hình thức, nhưng mục đích khác nhau. Tôi cũng không đồng ý với khẳng định của bạn rằng DI được triển khai bằng Chiến lược; Chiến lược cụ thể hơn trong mục đích của nó và cách sử dụng đối tượng được cấu hình, vì vậy sẽ hợp lý hơn khi nói rằng Chiến lược được triển khai với DI.
Jules
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.