2012-07-04 32 views
6

Tôi đang đọc Dependency Injection trong .NET Mark SEEMANN và tôi có thể không cho cuộc sống của tôi được đầu tôi quấn quanh này:DI Control-Freak chống mẫu: Có vấn đề hiểu

Mặc dù mới từ khoá là mã có mùi khi nói đến VOLATILE PHỤ LỤC, bạn không cần phải lo lắng về việc sử dụng nó cho STABLE PHỤ LỤC. mới từ khóa không đột nhiên "bất hợp pháp" nói chung, nhưng bạn nên hạn chế sử dụng từ khóa đó để nhận các phiên bản VOLATILE PHỤ LỤC.

Có lẽ vì tôi vẫn không thể lấy đầu quấn quanh bối cảnh môi trường xung quanh là tiêm thay vì chỉ là biến toàn cục, nhưng tôi không hiểu ý kiến ​​của tác giả.

Tôi thực sự muốn hiểu DI từ trên xuống dưới nhưng hiện tại tôi đang bị kẹt và đây chỉ là 1/3 cách thức thông qua sách ... Mẫu chống Control-Freak dường như là mọi lập trình viên đã từng sống ...

Bất kỳ ai có bất kỳ thông tin chi tiết nào?

+1

Xem http://jamesshore.com/Blog/Dependency-Injection-Demystified.html. Có rất nhiều bài viết quá phức tạp về DI xung quanh, mặc dù có thực sự không phải là rất nhiều cho nó. Tôi tìm thấy bài viết khá khai sáng :-). – helpermethod

Trả lời

7

Biến động (đối với tôi) là thước đo mức độ phù hợp mà một lớp học sẽ cần phải được thay đổi.

Lý tưởng nhất là bạn thiết kế các lớp mở để mở rộng nhưng đóng để sửa đổi (Mở nguyên tắc đóng). Điều này không phải lúc nào cũng có thể. Những lớp bạn gần thay đổi ít biến động hơn những lớp khác.

NDepend (công cụ số liệu phân tích tĩnh Net) có số liệu gọi là Instability mà trong tâm trí của tôi là đồng nghĩa. Chúng xác định điều này là:

Tính không ổn định (I): Tỷ lệ khớp nối efferent (Ce) với khớp nối tổng. I = Ce/(Ce + Ca). Số liệu này là một chỉ số về khả năng phục hồi của hội đồng để thay đổi. Phạm vi cho số liệu này là 0 đến 1, với I = 0 cho thấy một cụm hoàn toàn ổn định và I = 1 cho thấy một hội đồng hoàn toàn không ổn định.

Bạn không muốn lớp học ổn định dựa vào ít người ổn định hơn.

Theo như quyết định tiêm hay không, âm thanh đó giống như vấn đề về vai trò của lớp học. Từ Domain Driven Design, (DDD) Các lớp thường là các thực thể (chúng có bản sắc), dịch vụ (chúng phối hợp các thứ) hoặc các giá trị (chúng không thay đổi và có thể so sánh, như RED hoặc 100ml).

Bạn sẽ tiêm Dịch vụ, bạn sẽ gọi mới trên Giá trị. Các thực thể thường đến từ một kho lưu trữ (mà bạn tiêm), nhưng bên trong Repository sẽ gọi mới trên chúng. cái đó có giúp ích không?

1

Thường thì vùng chứa DI giải quyết tất cả các phụ thuộc để triển khai cụ thể và xử lý lâu dài cho bạn. Nhưng DI Control-Freak ngược lại: tạo đối tượng cụ thể bằng cách sử dụng từ khóa new, chỉ tiêm chúng và xử lý thời gian sống một mình. Vì vậy, không ai khác có khả năng cấu hình và xử lý các phụ thuộc bên ngoài từ mã của bạn. Và do đó, sử dụng lại hoặc kiểm tra nó bằng cách cung cấp các triển khai hoặc hàng giả khác.

Dưới đây là trích dẫn từ cuốn sách @ đánh dấu SEEMANN, đó trả lời câu hỏi của bạn:

tôi đặt tên nó là Control Freak để mô tả một lớp học mà sẽ không kiểm soát từ bỏ các phụ thuộc của nó.

Điều này xảy ra mỗi lần tạo kiểu mới bằng cách sử dụng phím mới . Khi chúng tôi làm điều đó, chúng tôi tuyên bố rõ ràng rằng chúng tôi sẽ kiểm soát tuổi thọ của trường hợp và không ai khác sẽ có cơ hội đánh chặn đối tượng cụ thể đó.

1

Tôi chưa từng nghe những điều khoản này trước đây, nhưng chuyển những gì tôi biết về tiêm phụ thuộc, tôi sẽ xác định chúng như sau.

Phụ thuộc ổn định là phụ thuộc có triển khai cụ thể sẽ không thay đổi, trong lớp hoặc cấu hình, theo thời gian hoặc trong các tình huống khác nhau.

Phụ thuộc dễ bay hơi là một phụ thuộc có triển khai cụ thể có thể khác nhau, trong lớp hoặc cấu hình, theo thời gian hoặc trong các tình huống khác nhau.

Nếu bạn có thể tha thứ cho một ví dụ trong Java, phụ thuộc ổn định sẽ là StringBuilder. Nếu bạn đang viết một phương pháp để xây dựng một chuỗi, bạn không cần phải có một tiêm StringBuilder, bạn chỉ có thể tạo ra nó. Ditto cho ArrayList, HashMap, vv Ngoài các lớp thư viện chuẩn, nếu bạn đang viết một ứng dụng ngân hàng, có thể bạn sẽ không tiêm RunningTotaliser, bởi vì đó là một đối tượng chỉ thêm số cho bạn.

Ví dụ về các phụ thuộc dễ bay hơi trong thư viện chuẩn khó hơn. Một ví dụ cổ điển sẽ là một DataSource - đó là một đối tượng đóng gói chi tiết kết nối cho một cơ sở dữ liệu và hầu như chắc chắn không được cung cấp bởi mã thực sự tạo ra các kết nối.

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