Có ổn không khi có sự phụ thuộc trong một lớp có nghĩa là có thể trao đổi?


8

Giả sử tôi đang có một mô hình miền và tôi muốn đọc và lưu nó từ bất kỳ lớp kiên trì nào - ngay bây giờ nó có thể là một tệp json nhưng trong tương lai nó có thể là xml hoặc cơ sở dữ liệu (cũng có thể thay đổi theo loại ).

Để tạo mô hình miền từ lớp liên tục, tôi đã triển khai Giao diện đơn giản, giả sử, chứa một phương thức getAll()saveAll(). Nếu tôi muốn chuyển sang một loại kiên trì khác, tôi có thể thay đổi việc thực hiện giao diện. Tuy nhiên, bên trong triển khai tôi sẽ sử dụng các giải pháp hoàn toàn khác nhau để đọc và lưu trữ dữ liệu nên tôi sẽ phải sử dụng các đối tượng khác nhau từ các thư viện khác để xử lý dữ liệu.

Giả sử tôi sử dụng bộ nối tiếp Json trong lần triển khai đầu tiên, sau đó tôi sẽ khởi tạo trực tiếp phiên bản của trình tuần tự đó trong triển khai của mình. Điều này sau đó sẽ dẫn đến việc tôi thực hiện trực tiếp tùy thuộc vào serializer đó, tôi không bao giờ có thể cung cấp cho nó một cái khác. Nhưng dù sao thì điều này cũng không thể xảy ra, vì không có giao diện phổ biến cho các bộ nối tiếp (hoặc bất kỳ loại kiên trì nào). Vì vậy, nếu tôi muốn sử dụng một serializer khác, điều duy nhất tôi có thể làm là viết một triển khai hoàn toàn mới thay vì chỉ truyền vào một cái khác từ bên ngoài.

Vì vậy, nó có ổn để phụ thuộc mã cứng trong trường hợp này? Hoặc có một lựa chọn tốt hơn?

Câu trả lời:


4

Với tham chiếu câu trả lời của tôi cho một câu hỏi gần đây , chìa khóa ở đây là tách các giao diện lớp kiên trì của bạn khỏi bất kỳ việc thực hiện nào của lớp lưu giữ, sử dụng mẫu cầu thang.

Sự phụ thuộc vào bộ nối tiếp Json sau đó trở thành một chi tiết triển khai của gói kiên trì Json. Phần còn lại của ứng dụng không cần biết gì về nó, cũng không phải chịu gánh nặng của sự phụ thuộc đó vì nó chỉ truy cập gói kiên trì thông qua các giao diện nằm trong gói khác.

Nếu sau đó bạn thêm gói bảo trì cơ sở dữ liệu, nó chỉ đơn giản thực hiện các giao diện đó và các phụ thuộc ORM của nó cũng bị ẩn đi như một chi tiết triển khai.


2

Bạn không thể xóa tất cả các phụ thuộc khỏi mã của bạn; cuối cùng bạn phải phụ thuộc vào một cái gì đó , nếu không, bạn sẽ kết thúc với một vật thể thần khổng lồ tự làm mọi thứ.

Theo nguyên tắc chung, bạn muốn mỗi lớp phụ thuộc vào các đối tượng sẽ ổn định hơn chính chúng; và bạn muốn các mối quan hệ không ổn định sử dụng phép tiêm phụ thuộc để cho phép thử nghiệm dễ dàng hơn và linh hoạt hơn.

Khả năng trình tuần tự JSON sẽ thay đổi như thế nào? Nó ổn định hơn hay ít hơn mã bạn đang viết?

Nếu có khả năng bạn sẽ thay thế serializer nhiều lần bằng một triển khai khác, thì có lẽ bạn có thể tạo proxy hoặc đối tượng trình bao quanh chính serializer. Bằng cách đó, bạn có thể kiểm soát giao diện mà bạn có với serializer và chỉ phụ thuộc vào một thư viện bên ngoài ở một nơi.

Điều đó nói rằng, cá nhân tôi chưa tìm thấy lý do để thay thế trình tuần tự hóa JSON (bằng một trình tuần tự hóa khác), vì vậy tôi sẽ không lo lắng quá nhiều về việc có sự phụ thuộc trực tiếp vào nó. Một serializer gần như luôn luôn có giao diện ổn định hơn bất kỳ thứ gì trong các ứng dụng của riêng tôi và các phương thức tôi cần từ nó rất đơn giản và ít có lý do gì để chúng thực sự thay đổi.

Tuy nhiên, có vẻ như bạn không lo lắng về việc serializer tự thay đổi - từ những gì bạn mô tả, bạn lo lắng về các yêu cầu bên ngoài thay đổi thành một hệ thống kiên trì hoàn toàn khác - trong trường hợp đó, việc thực hiện lớp kiên trì của bạn sẽ được viết lại hoàn toàn dù sao, và sử dụng tiêm phụ thuộc hoặc proxy sẽ không giúp bạn.

Miễn là giao diện giữa lớp kiên trì và các mô hình miền của bạn giữ nguyên và bạn đang chế giễu lớp liên tục đó khi bạn kiểm tra các mô hình miền của mình, tôi không thấy có vấn đề gì tùy thuộc vào giao diện cụ thể của thư viện JSON. Sự phụ thuộc đó là rẻ để kiểm tra và thư viện JSON không có khả năng thay đổi.

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.