Đa số xây dựng một thực hiện. DI vô vọng? Sử dụng dịch vụ định vị?


14

Giả sử chúng tôi có 1001 khách hàng xây dựng các phụ thuộc của họ trực tiếp thay vì chấp nhận tiêm. Tái cấu trúc 1001 không phải là một lựa chọn theo ông chủ của chúng tôi. Chúng tôi thực sự thậm chí không cho phép truy cập vào nguồn của họ, chỉ các tệp lớp.

Những gì chúng tôi phải làm là "hiện đại hóa" hệ thống mà 1001 khách hàng này trải qua. Chúng tôi có thể tái cấu trúc rằng tất cả những gì chúng tôi thích. Các phụ thuộc là một phần của hệ thống đó. Và một số trong những phụ thuộc mà chúng tôi phải thay đổi để có một triển khai mới.

Những gì chúng tôi muốn làm là có khả năng cấu hình các triển khai phụ thuộc khác nhau để đáp ứng vô số khách hàng này. Đáng buồn thay, DI dường như không phải là một lựa chọn vì khách hàng không chấp nhận tiêm với các nhà xây dựng hoặc setters.

Các tùy chọn:

1) Tái cấu trúc việc thực hiện dịch vụ mà khách hàng sử dụng để nó thực hiện những gì khách hàng cần bây giờ. Bang chúng ta đã xong. Không linh hoạt. Không phức tạp.

2) Tái cấu trúc việc triển khai để nó ủy thác công việc cho một phụ thuộc khác mà nó có được thông qua một nhà máy. Bây giờ chúng ta có thể kiểm soát việc thực hiện tất cả chúng sử dụng bằng cách tái cấu trúc nhà máy.

3) Tái cấu trúc việc triển khai để nó ủy thác công việc cho một phụ thuộc khác mà nó có được thông qua một bộ định vị dịch vụ. Bây giờ chúng ta có thể kiểm soát việc thực hiện tất cả chúng sử dụng bằng cách định cấu hình bộ định vị dịch vụ có thể đơn giản là một hashmapchuỗi cho các đối tượng với một quá trình truyền nhỏ đang diễn ra.

4) Một cái gì đó tôi thậm chí chưa nghĩ đến.

Mục tiêu:

Giảm thiểu thiệt hại thiết kế gây ra bằng cách kéo mã máy khách cũ được thiết kế kém vào tương lai mà không thêm sự phức tạp vô nghĩa.

Khách hàng không nên biết hoặc kiểm soát việc thực hiện các phụ thuộc của mình nhưng họ khăng khăng xây dựng chúng với new. Chúng tôi không thể kiểm soát newnhưng chúng tôi kiểm soát lớp họ đang xây dựng.

Câu hỏi của tôi:

Những gì tôi đã không xem xét?


Câu hỏi từ Doc Brown

Bạn có thực sự cần một khả năng để cấu hình giữa các triển khai khác nhau? Cho mục đích gì?

Nhanh nhẹn. Nhiều điều chưa biết. Quản lý muốn tiềm năng thay đổi. Chỉ mất sự phụ thuộc vào thế giới bên ngoài. Cũng đang thử nghiệm.

Bạn có cần một cơ chế thời gian chạy, hay chỉ là một cơ chế thời gian biên dịch để chuyển đổi giữa các triển khai khác nhau? Tại sao?

Biên dịch cơ học thời gian có khả năng là đủ. Ngoại trừ thử nghiệm.

mức độ chi tiết nào bạn cần chuyển đổi giữa các lần thực hiện? Tất cả trong một? Mỗi mô-đun (mỗi mô-đun chứa một nhóm các lớp)? Mỗi lớp?

Trong số 1001 chỉ có một lần được chạy qua hệ thống bất kỳ lúc nào. Thay đổi những gì tất cả khách hàng sử dụng cùng một lúc có khả năng tốt. Kiểm soát cá nhân của các phụ thuộc có khả năng quan trọng mặc dù.

Ai cần điều khiển công tắc? Chỉ nhóm của bạn / nhà phát triển của bạn? Một quản trị viên? Mỗi khách hàng tự mình? Hoặc các nhà phát triển bảo trì cho mã của khách hàng? Vì vậy, các cơ học cần phải dễ dàng / mạnh mẽ / dễ dàng như thế nào?

Dev để thử nghiệm. Quản trị viên như phụ thuộc phần cứng bên ngoài thay đổi. Nó cần phải dễ dàng để kiểm tra và cấu hình.


Mục tiêu của chúng tôi là chỉ ra rằng hệ thống có thể được làm lại nhanh chóng và hiện đại hóa.


trường hợp sử dụng thực tế cho việc chuyển đổi thực hiện?

Một là, một số dữ liệu sẽ được cung cấp bởi phần mềm cho đến khi giải pháp phần cứng sẵn sàng.


1
Tôi không cảm thấy bạn sẽ đạt được nhiều bằng cách lưu trữ các nhà máy hoặc máy định vị ở trạng thái toàn cầu. Quan tâm làm gì? Bạn sẽ kiểm tra khách hàng thay thế sự phụ thuộc?
Basilevs

Xem xét sử dụng trình nạp lớp tùy chỉnh.
Basilevs

Vì tò mò, hệ thống này làm gì?
Thủ tướng

Câu trả lời:


7

Chà, tôi không chắc là tôi hiểu hoàn toàn các chi tiết kỹ thuật và sự khác biệt chính xác của các giải pháp được hỗ trợ của bạn, nhưng IMHO trước tiên bạn cần tìm ra loại linh hoạt nào bạn thực sự cần.

Các câu hỏi bạn phải tự hỏi mình là:

  • Bạn có thực sự cần một khả năng để cấu hình giữa các triển khai khác nhau? Cho mục đích gì?

  • Bạn có cần một cơ chế thời gian chạy, hay chỉ là một cơ chế thời gian biên dịch để chuyển đổi giữa các triển khai khác nhau? Tại sao?

  • mức độ chi tiết nào bạn cần chuyển đổi giữa các lần thực hiện? Tất cả trong một? Mỗi mô-đun (mỗi mô-đun chứa một nhóm các lớp)? Mỗi lớp?

  • Ai cần điều khiển công tắc? Chỉ nhóm của bạn / nhà phát triển của bạn? Một quản trị viên? Mỗi khách hàng tự mình? Hoặc các nhà phát triển bảo trì cho mã của khách hàng? Vì vậy, các cơ học cần phải dễ dàng / mạnh mẽ / dễ dàng như thế nào?

Có câu trả lời cho những câu hỏi này trong đầu, chọn giải pháp đơn giản nhất bạn có thể nghĩ đến, cung cấp cho bạn sự linh hoạt cần thiết. Đừng thực hiện bất kỳ sự linh hoạt nào mà bạn không chắc chắn về "chỉ trong trường hợp" nếu điều đó có nghĩa là nỗ lực bổ sung.

Như một câu trả lời cho câu trả lời của bạn: nếu bạn có ít nhất một trường hợp sử dụng thực tế , hãy sử dụng nó để xác nhận các quyết định thiết kế của bạn. Sử dụng trường hợp sử dụng đó để tìm ra loại giải pháp nào phù hợp nhất với bạn. Chỉ cần thử nếu một "nhà máy" hoặc "công cụ định vị dịch vụ" cung cấp cho bạn những gì bạn cần, hoặc nếu bạn cần một cái gì đó khác. Nếu bạn nghĩ rằng cả hai giải pháp đều tốt cho trường hợp của bạn, hãy ném xúc xắc.


Những câu hỏi hay! Xin vui lòng xem cập nhật.
candied_orange

Cập nhật với trường hợp sử dụng thực tế.
candied_orange

@CandiedOrange: Tôi không thể cho bạn một ít cá, tôi chỉ có thể cố gắng giúp bạn câu cá một mình :-)
Doc Brown

Hiểu. Tôi chỉ nhìn chằm chằm vào mặt nước tự hỏi liệu tôi cần mồi tốt hơn hay một lỗ câu khác. Tôi rất thích làm DI đúng cách nhưng tình huống này dường như không cho phép.
candied_orange

1
@CandiedOrange Đừng gác máy với mong muốn làm DI vì nó "tốt" hoặc "tốt hơn" bất cứ điều gì khác. DI là một giải pháp cụ thể cho một vấn đề (hoặc đôi khi là một vài). Nhưng, nó không phải luôn luôn là giải pháp "phù hợp" nhất. Đừng yêu nó ... hãy đối xử với nó như thế. Đó là một công cụ.
Svidgen

2

Chỉ để chắc chắn rằng tôi đang làm đúng. Bạn có một số dịch vụ được tạo ra từ một số lớp, nói C1,...,Cnvà một nhóm khách hàng gọi trực tiếp new Ci(...). Vì vậy, tôi nghĩ rằng tôi đồng ý với cấu trúc chung của giải pháp của bạn là tạo ra một dịch vụ nội bộ mới với một số lớp mới D1,...,Dntốt và hiện đại và đưa các phụ thuộc của chúng (cho phép các phụ thuộc đó qua ngăn xếp) và sau đó viết lại Ciđể không làm gì ngoài việc khởi tạo và delgate tới Di. Câu hỏi là làm thế nào để làm điều đó và bạn đề xuất một vài cách trong 23.

Để đưa ra một gợi ý tương tự 2. Bạn có thể sử dụng phép nội xạ phụ thuộc xuyên suốt Divà bên trong và sau đó tạo một gốc thành phần bình thường R(sử dụng khung nếu bạn thấy phù hợp) chịu trách nhiệm lắp ráp biểu đồ đối tượng. Đẩy Rphía sau một nhà máy tĩnh và để mỗi Cingười Divượt qua nó. Vì vậy, ví dụ bạn có thể có

public class OldClassI {
    private final NewClassI newImplementation;

    public OldClassI(Object parameter) {
        this.newImplementation = CompositionRoot.getInstance().getNewClassI(parameter);
    }
}

Về cơ bản đây là giải pháp 2 của bạn, nhưng nó tập hợp tất cả các nhà máy của bạn vào một địa điểm cùng với phần còn lại của việc tiêm phụ thuộc.


Tôi đồng ý với điều này. Chỉ không chắc chắn làm thế nào điều này không giống với trình định vị dịch vụ từ tùy chọn 3. Bạn có muốn xây dựng một phiên bản mới với mỗi cuộc gọi đến getInstance()không?
candied_orange

@CandiedOrange Đây có lẽ chỉ là một sự xung đột trong cách sử dụng, đối với tôi, một công cụ định vị dịch vụ rất cụ thể chỉ là một hashmap từ các loại đến các đối tượng, trong khi đó, thành phần gốc chỉ là một đối tượng với một loạt các phương thức xây dựng các đối tượng khác.
walpen

1

Bắt đầu với các triển khai đơn giản, không có gì lạ mắt.

Nếu sau này bạn cần tạo các triển khai bổ sung, đó là câu hỏi khi nào quyết định thực hiện xảy ra.

Nếu bạn cần linh hoạt "thời gian cài đặt" (mỗi cài đặt máy khách sử dụng một triển khai tĩnh, duy nhất), bạn vẫn không cần phải làm bất cứ điều gì lạ mắt. Bạn chỉ cung cấp các DLL hoặc SO khác nhau (hoặc bất kỳ định dạng lib nào của bạn). Máy khách chỉ cần đặt đúng cái trong libthư mục ...

Nếu bạn cần linh hoạt thời gian chạy, bạn sẽ chỉ cần một bộ điều hợp mỏng và cơ chế chọn trình thực hiện. Cho dù bạn sử dụng nhà máy, công cụ định vị hay bộ chứa IoC chủ yếu là xe mô tô. Sự khác biệt đáng kể duy nhất giữa bộ điều hợp và bộ định vị là A) Đặt tên và B) Cho dù đối tượng được trả về là một cá thể đơn lẻ hay một cá thể chuyên dụng. Và sự khác biệt lớn giữa một container IoC, một nhà máy / công cụ định vị là ai gọi ai . (Thường là vấn đề sở thích cá nhân.)

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.