2011-01-20 29 views
5

Tôi đã đọc rất nhiều về Dependency Injection, Inversion of Control và IoC containers. Tôi cũng chủ yếu lập trình bằng ngôn ngữ động (PHP tại nơi làm việc, Python ở nhà). Dưới đây là những điều tôi đang tìm kiếm, nhưng điều này để lại một khoảng trống rất nhiều cho tôi để điền vào như tôi mảnh nó tất cả cùng nhau:IOC Vùng chứa và ngôn ngữ động (mất 2)

Vì vậy, những gì tôi đang đọc là: IoC container là một thỏa thuận lớn hơn nhiều trong các ngôn ngữ tĩnh, bởi vì nó dễ dàng hơn nhiều để thực hiện DI trong ngôn ngữ động. Nhưng họ cũng cung cấp lợi ích vượt xa DI, như quản lý phụ thuộc cho bạn và giúp bạn tiết kiệm từ việc phải chuỗi với nhau một tá các đối tượng bằng tay. Và, một cách ngẫu nhiên, chúng phức tạp, vì vậy đừng cố gắng tự làm chúng (nhưng không có cái nào tốt cho PHP).

Tôi cảm thấy thông tin này khiến tôi bị loại ... bị kẹt. Tôi phải làm gì với nó? Tôi làm việc trong một codebase rất lớn, với các phụ thuộc rất phức tạp (và có thể là một nhu cầu mạnh mẽ để tái cấu trúc, nhưng đó là một vấn đề song song khác). Chúng tôi đã làm rất kém tại triển khai DI cho đến bây giờ, và tôi thực sự cố gắng biến chúng ta đi đúng hướng. Có vẻ như không có gì liên quan đến các ngôn ngữ động và IoC (hoặc ít nhất là các thùng chứa IoC).

Tôi có nên tắt các phụ thuộc "tay chuỗi" một cách tốt hơn trong thời gian này không, và lo lắng về việc tự động hóa nó trong một thùng chứa sau, sau khi tôi xử lý tốt hơn các nguyên tắc? Là nó có giá trị thực hiện container IoC đơn giản của riêng tôi? Hoặc là lợi ích chỉ không cuối cùng đáng giá trong PHP?

+1

Bạn đã thử http://components.symfony-project.org/dependency-injection/ container chưa? – Mchl

+0

@mchl: Cái đó thực sự trông rất đẹp. Cảm ơn! (Chưa kể, tài liệu là một trong những mô tả tốt hơn về một container IoC mà tôi đã nhìn thấy ... sẽ hữu ích khi tôi tìm ra tất cả những thứ này) – keithjgrant

+0

@mchl: Liên kết của bạn là điều hữu ích nhất tôi đã nhìn thấy chưa. Di chuyển nó vào một câu trả lời, và tiền thưởng là của bạn nếu không có gì tốt hơn bề mặt. – keithjgrant

Trả lời

0

Martin Fowler đã viết bài viết này là khá nhiều kinh thánh cho đảo ngược kiểm soát và tiêm phụ thuộc. Ông giải thích làm thế nào để thực hiện một container IoC và thảo luận về giá trị của các cơ chế tiêm khác nhau. http://martinfowler.com/articles/injection.html

Bất kể ngôn ngữ nào bạn đang sử dụng "phụ thuộc chuỗi tay" không thể mở rộng được. Nó sẽ rất khó để duy trì, bởi vì các nhà phát triển khác có lẽ không biết tất cả các chuỗi tay diễn ra, vì vậy khi họ thay đổi một cái gì đó họ có thể không thay đổi điều đúng. Ngược lại, việc đặt tất cả điều này ở một nơi sẽ làm cho các thay đổi trong tương lai dễ thực hiện hơn nhiều. IoC giúp giảm thiểu mã lặp đi lặp lại, và đảm bảo tách mối quan tâm và kiến ​​trúc ứng dụng nhất quán. Mặt khác, có vẻ như bạn có một ứng dụng hoạt động khá lớn trên tay - và trừ khi bạn cũng có nhiều thời gian, nếu nó không bị hỏng, có thể không cần phải sửa chữa.

3

Để thử PHP Symfony Dependency Injection. Đó là (được cho là - tôi đã quá ít kinh nghiệm để xác nhận điều đó) dựa trên cách Java Spring hoạt động, nhưng cũng sử dụng rất nhiều "phép thuật PHP". Kết quả là nó khá nhẹ và dễ sử dụng, trong khi có thể làm khá nhiều.

0

Nếu bạn không muốn có DIC được thiết kế quá mức nhưng DIC cung cấp tất cả những gì bạn cần theo cách rất nhỏ gọn, hãy thử cái này: Thùng (https://github.com/troelskn/bucket). Một thùng chứa DI không cần nhiều hơn nữa. Bên cạnh giao diện của Symfony thường được sử dụng theo cách rất nguy hiểm, như một định vị dịch vụ (trạng thái toàn cầu bí danh đẹp hơn).

0

Nếu bạn nghĩ rằng IoC của bạn là/có thể nhẹ hơn thì các khung công tác khác đã có và nếu bạn có đủ thời gian để phát triển nó thì hãy xây dựng của riêng bạn. Cá nhân tôi sử dụng IoC trong framework MVC của tôi chỉ để liên kết View với Controller. Tôi quản lý khung nhìn và các tham số của nó từ một cơ quan đăng ký (một mảng kết hợp cấu trúc tiêu chuẩn hóa).Các mô hình được xử lý như các dịch vụ bên ngoài. Tôi cũng tìm thấy IoC và DI lần đầu tiên trên Java vì vậy tôi đã cố gắng để có những gì tốt nhất từ ​​cả hai ngôn ngữ (Java và PHP) khi tôi xây dựng mine.Of tất nhiên nó không liên kết bất cứ điều gì để bất cứ điều gì, nhưng tôi không cần cho trường hợp của tôi, vì vậy bạn có thể không.

IoC là yếu tố quan trọng để cung cấp sự linh hoạt theo thời gian nhưng mức độ linh hoạt bao nhiêu? Bạn có làm việc với nhiều thành phần bên ngoài không? Bạn có làm việc với các plugin và đối tượng tiêu chuẩn không? PHP không phải là java, bạn không có sack các lọ và các thư viện được phát triển tốt để sẵn sàng thực hiện bất cứ lúc nào bằng cách tải nó và thay thế một chỉ thị trong một XML để chỉ vào nó, suy nghĩ về điều đó.

Tôi đã phát hiện ra việc triển khai IoC xuất sắc trên một phần mềm nguồn mở đặc biệt được gọi là Alfresco (Hệ thống quản lý tài liệu). Nó là một sản phẩm tập hợp các mẫu JSF, Spring, Hibernate và freemarker, nhưng như tôi đã nói nó là một sản phẩm có nghĩa là phù hợp với hàng ngàn mô hình kinh doanh, nó giống như một nền tảng nâng cao có ý nghĩa bị thay đổi không ngừng. cần phải rất linh hoạt.

Nếu bạn đang phát triển một ứng dụng được nhắm mục tiêu, có nghĩa là để phục vụ một mô hình kinh doanh và chỉ một vài khách hàng, sau đó lao vào hoa IoC sẽ làm cho mọi việc trở nên khó khăn hơn là đơn giản hơn.

Einstein nói rằng mọi thứ phải đơn giản, nhưng không đơn giản hơn chúng.

1

Trước hết hãy khắc phục sự cố phụ thuộc của bạn. Nếu bạn sử dụng một container IoC như là một túi mà đề với phụ thuộc của bạn cho bạn nó sẽ cắn bạn thực sự khó khăn không quá xa xuống dòng.

Thùng chứa IoC sẽ cung cấp cho bạn API/Từ vựng để nói về kiến ​​trúc hệ thống.

Đưa vào phụ thuộc sẽ dẫn bạn sử dụng các lớp được tách riêng nhỏ hơn hoạt động như các khối xây dựng cho các hệ thống phụ. Điều này là tốt vì nó cho phép bạn kiểm tra khối xây dựng của bạn trong sự cô lập và lý do về chúng nó dễ dàng hơn. (Bạn có thể nghĩ chúng giống như các linh kiện điện tử trong một mạch)

IoC Thùng chứa phải cung cấp cho bạn một cách để thể hiện rõ ràng thành phần của các khối xây dựng này. (sơ đồ nối dây liên kết các thành phần với nhau)

Việc chia tách này cũng cho phép bạn bắt đầu suy nghĩ về thời gian tồn tại của hệ thống con của bạn .. khi sử dụng nhà máy, đăng ký, cách chuyển các tin nhắn xung quanh hệ thống mà không giới thiệu khớp nối.

Điểm của IOC để cung cấp cho bạn một nơi để nêu rõ tất cả logic này, không phải để giải quyết nó một cách kỳ diệu cho bạn.

Tôi hy vọng điều này sẽ hữu ích.

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