Các khuyến nghị về việc tích hợp container DI / IoC vào một ứng dụng hiện có


10

Bây giờ tôi phải đối mặt với việc tích hợp bộ điều khiển đảo ngược (IoC) vào một ứng dụng hiện có và tôi đang tìm kiếm một số khuyến nghị về cách có thể dễ dàng thực hiện nhất với mục tiêu cuối cùng là giảm khả năng ghép nối, từ đó tăng khả năng kiểm tra. Mặc dù tôi thường không phân loại hầu hết các lớp là đối tượng của thần , mỗi lớp có quá nhiều trách nhiệm và sự phụ thuộc ẩn thông qua các thống kê, singletons và thiếu giao diện.

Dưới đây là một số thông tin cơ bản về một số thách thức cần phải đối mặt:

  • Phụ thuộc tiêm thường xuyên được sử dụng
  • Có rất nhiều phương thức tĩnh - cả phương thức nhà máy và phương tiện
  • Singletons khá phổ biến
  • Các giao diện, khi được sử dụng, không quá chi tiết
  • Các đối tượng thường kéo theo các phụ thuộc không cần thiết thông qua các lớp cơ sở

Mục đích của chúng tôi là lần sau chúng tôi cần thực hiện các thay đổi trong một lĩnh vực cụ thể, chúng tôi cố gắng trêu chọc những người phụ thuộc, trong thực tế, tồn tại nhưng bị ẩn đằng sau các quả cầu như singletons và statics.

Tôi cho rằng điều đó làm cho container IoC trở thành thứ yếu trong việc giới thiệu tiêm phụ thuộc, nhưng tôi hy vọng rằng có một tập hợp và khuyến nghị có thể được theo dõi hoặc xem xét sẽ giúp chúng tôi thoát khỏi những phụ thuộc này.


3
Tôi phải hỏi về lý do để làm điều này bây giờ ... điều gì đang thúc đẩy sự thay đổi này? Bảo trì? Khả năng mở rộng vì nó sẽ tăng theo cấp số nhân? Nhà phát triển có chán không?
Aaron McIver

1
Tôi mới gia nhập công ty và đang cố gắng giới thiệu một số "thực tiễn tốt nhất". Mục tiêu chính của tôi là tăng khả năng kiểm tra và giảm khớp nối. Chúng tôi có thể dễ dàng sử dụng DI / IoC cho mã mới và không có ý định thay đổi tất cả mã hiện tại cùng một lúc, nhưng tôi muốn các đề xuất về cách chúng tôi có thể thay đổi mã hiện tại tốt hơn để tốt hơn vào lần tới khi chúng tôi thực hiện thay đổi trong khu vực đó. Cho đến nay, điều duy nhất tôi tìm thấy trực tuyến là như sau: code.google.com/p/autofac/wiki/Ex hiệnApplecting
Kaleb Pederson

3
Trừ khi có số lượng lớn các bài kiểm tra đơn vị / tích hợp tự động tại chỗ; Sửa đổi cơ sở hạ tầng hiện tại trừ khi có vấn đề tồn tại vì thực tiễn tốt nhất là yêu cầu sự cố. Ngay cả khi bộ kiểm thử đơn vị / tích hợp của bạn là vững chắc, tôi vẫn có do dự.
Aaron McIver

1
@Aaron Tôi hy vọng nó không giống như chúng ta đang làm điều đó vì lợi ích của các hoạt động tốt nhất. Chúng tôi đang thực hiện các thay đổi bởi vì thật khó khăn và chậm để làm việc với mã hiện có và thực hiện từng phần một khi chúng tôi đang làm việc trong khu vực cụ thể đó. Rất vui, chúng tôi có một bộ các thử nghiệm tích hợp hợp lý và một vài thử nghiệm đơn vị để hỗ trợ thực hiện các thay đổi.
Kaleb Pederson

Câu trả lời:


8

Để thực hiện một cái gì đó như thế này, bạn sẽ phải làm việc theo các bước, mỗi một trong số này không tầm thường nhưng chúng có thể được thực hiện. Trước khi bạn bắt đầu, bạn phải hiểu rằng bạn không thể vội vàng quá trình này.

  1. Xác định các hệ thống con chính của ứng dụng và một interfacecho mỗi hệ thống . Giao diện này chỉ nên xác định các phương thức mà các phần khác của hệ thống sẽ sử dụng để nói chuyện với nó. LƯU Ý: bạn có thể phải mất nhiều hơn một lần tại đây.
  2. Cung cấp một triển khai trình bao bọc của giao diện đó ủy nhiệm cho mã hiện có. Mục đích của bài tập này là để tránh viết lại hàng loạt , nhưng để cấu trúc lại mã để sử dụng các giao diện mới - tức là giảm sự ghép nối trong hệ thống của bạn.
  3. Thiết lập bộ chứa IoC để xây dựng hệ thống bằng các giao diện và triển khai bạn đã tạo. Ở giai đoạn này, bạn muốn quan tâm đến việc khởi tạo bộ chứa IoC để nó có thể đưa ứng dụng lên. Tức là nếu bạn đang ở trong môi trường servlet, hãy chắc chắn rằng bạn có thể nhận / tạo vùng chứa trong init()phương thức servlet .
  4. Làm lại điều tương tự trong mỗi hệ thống con một lần nữa, lần này khi bạn tái cấu trúc, bạn đang biến việc triển khai sơ khai của mình thành điều thực sự lần lượt sử dụng các giao diện để nói chuyện với các thành phần của nó.
  5. Lặp lại khi cần thiết cho đến khi bạn có sự cân bằng tốt về kích thước thành phần với chức năng.

Khi bạn đã hoàn tất, các phương thức tĩnh duy nhất bạn nên có trong hệ thống của mình là các phương thức thực sự có chức năng - ví dụ: nhìn vào Collectionslớp hoặc Mathlớp. Không có phương pháp tĩnh nên cố gắng truy cập trực tiếp các thành phần khác.

Đây là điều sẽ mất rất nhiều thời gian, kế hoạch phù hợp. Hãy chắc chắn rằng khi bạn thực hiện tái cấu trúc, bạn sẽ trở nên RẮN hơn trong phương pháp thiết kế của mình. Ban đầu sẽ đau lắm. Bạn đang thay đổi mạnh mẽ thiết kế ứng dụng của bạn lặp đi lặp lại.


Gợi ý tốt. Tôi cũng giới thiệu cho những người khác về các đề xuất ở đây khi thực hiện các thay đổi như vậy: code.google.com/p/autofac/wiki/Ex hiệnApplecting
Kaleb Pederson

7

Chọn làm việc hiệu quả với Legacy Code và làm theo lời khuyên của anh ấy. Bắt đầu bằng cách xây dựng các đảo mã được bảo hiểm và dần dần tiến tới một ứng dụng có cấu trúc tốt hơn. Cố gắng thực hiện thay đổi en masse là một công thức cho thảm họa.


Yêu cuốn sách đó !!
Martijn Verburg

Đề nghị tốt. Mặc dù tôi đã đọc được một nửa số năm trước, tôi tưởng tượng rằng tôi sẽ nhận được nhiều hơn từ bây giờ khi tôi đang chìm sâu trong tình huống.
Kaleb Pederson

Thật buồn cười, câu trả lời được lựa chọn về cơ bản tóm tắt cuốn sách;) Tất nhiên Feathers đi sâu vào chi tiết hơn nhiều.
Michael Brown

5

Lý do chính để giới thiệu IoC là tách rời các mô-đun. Vấn đề với đặc biệt là Java là ràng buộc mạnh mẽ phi thường mà newnhà khai thác đưa ra, kết hợp với điều đó có nghĩa là mã gọi biết chính xác mô-đun nào sẽ sử dụng.

Các nhà máy đã được giới thiệu để chuyển kiến ​​thức này đến vị trí trung tâm nhưng cuối cùng bạn vẫn cứng cáp các mô-đun trong việc sử dụng new/ singleton giữ liên kết cứng hoặc bạn đọc trong tệp cấu hình và sử dụng Reflection / Class.forName dễ vỡ khi tái cấu trúc .

Nếu bạn không có mục tiêu được mô đun hóa thì IoC sẽ không cung cấp cho bạn bất cứ thứ gì.

Giới thiệu các thử nghiệm Đơn vị rất có thể sẽ thay đổi điều này, vì bạn sẽ cần phải mô phỏng các mô-đun không được thử nghiệm và cách dễ nhất để xử lý việc này cũng như các mô-đun sản xuất thực tế có cùng mã là sử dụng khung IoC để tiêm mã thích hợp mô-đun.

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.