Sử dụng các gói (đá quý, trứng, v.v.) để tạo ra các kiến ​​trúc tách rời


10

Vấn đề chính

Thấy sự hỗ trợ tốt nhất các nền tảng lập trình hiện đại có cho quản lý gói (nghĩ gem, npm, pip, vv), nó có ý nghĩa để thiết kế một ứng dụng hoặc hệ thống gồm các gói phát triển nội bộ, để thúc đẩy và tạo ra một kiến trúc lỏng lẻo?

Thí dụ

Một ví dụ về điều này sẽ là tạo các gói để truy cập cơ sở dữ liệu, cũng như để xác thực và các thành phần khác của hệ thống. Những, tất nhiên, sử dụng các gói bên ngoài là tốt. Sau đó, hệ thống của bạn nhập và sử dụng các gói này - thay vì bao gồm mã của chúng trong cơ sở mã riêng.

Cân nhắc

Đối với tôi, dường như điều này sẽ thúc đẩy việc tách mã và giúp duy trì, gần như theo cách ứng dụng dựa trên web so với máy tính để bàn (các bản cập nhật được áp dụng gần như tự động, cơ sở mã đơn cho chức năng đơn, v.v.).

Điều này có vẻ như là một khái niệm thiết kế hợp lý và lành mạnh? Đây có thực sự được sử dụng như một cách tiêu chuẩn để cấu trúc các ứng dụng ngày nay?

Câu trả lời:


12

Bây giờ tôi đã tham gia vào các dự án như thế này hai lần (cả hai đều sử dụng nuget với .NET) và tôi sẽ nói rằng trên sự cân bằng, đó là một ý tưởng tốt. Nhưng số dặm của bạn có thể thay đổi.

Đừng suy nghĩ trong một phút rằng đó là thuốc chữa bách bệnh, rằng nó sẽ giải quyết tất cả các vấn đề của bạn mà không gây ra vấn đề mới. Quản lý phát hành sẽ đạt được một lớp phức tạp hoàn toàn mới, bạn sẽ cần xử lý các vấn đề phụ thuộc phiên bản mà bạn chưa từng biết đến và bạn sẽ có lúc bạn nguyền rủa quyết định vì bạn phải nâng cấp bốn gói khác nhau vì một lỗi nhỏ mà bạn cần sửa chữa và phát hành nhanh chóng.

Mặt khác, bạn đúng rằng nó tách rời mọi thứ độc đáo. Trừ khi bạn làm quá sức, có lẽ bạn sẽ tìm thấy nhiều dịp hơn khi bạn nghĩ rằng "ồ, điều đó đã diễn ra tốt đẹp", hơn là "điều đó đã thêm rất nhiều nỗ lực." Nếu bạn có mã được chia sẻ giữa nhiều ứng dụng, điều đó đặc biệt hiệu quả vì bạn có thể dễ dàng nâng cấp ứng dụng của mình một cách độc lập.

Và, nếu bạn giống như tôi, bạn sẽ nhanh chóng bắt đầu viết các ứng dụng thử nghiệm sử dụng các gói của bạn, để xóa toàn bộ các lớp ứng dụng khỏi quy trình tìm lỗi của bạn. Và điều đó, bản thân nó, có thể nhiều hơn giá trị chi phí.


Đầu vào tuyệt vời. Nói chung, tất cả mọi thứ nên được cân bằng, và tôi thích cách bình luận của bạn ở trên những dòng đó. Thật tuyệt khi nghe rằng bạn nghĩ rằng nó có xu hướng hoạt động tốt trong nhiều trường hợp hơn là không ... và dù sao thì sự xuất hiện của các vấn đề là một hằng số. Tôi thích mẹo của bạn về các ứng dụng thử nghiệm :). +1.
Juan Carlos Coto

1
Tôi muốn thêm có rất nhiều dự án cũng làm điều này trong thế giới * nix. Bạn thường có các thư viện được tách biệt từ các giao diện người dùng từ tài nguyên phát triển, v.v.
David Cowden

Hấp dẫn. Nghe có vẻ như là một cách hay để tổ chức một hệ thống phức tạp, nhưng tôi sợ nó là một trường hợp quá kỹ thuật. Có vẻ như nếu áp dụng một cách thận trọng, nó không nên. Cảm ơn!
Juan Carlos Coto

3

Đây là một ý tưởng tốt, tất cả trong tất cả. Bạn sẽ cần suy nghĩ về việc thiết lập kho lưu trữ gói nội bộ (thường được gọi là "kho lưu trữ nhân tạo" trong thế giới Java hoặc "máy chủ pypi" trong thế giới Python), để bạn giữ những gói đó bạn không muốn hoặc có thể ' t phát hành dưới dạng nguồn mở.

Như @pdr đã lưu ý, hãy chuẩn bị để có địa ngục phụ thuộc của riêng bạn , trong đó một thay đổi đối với gói nào đó yêu cầu thay đổi khác trước trong gói khác và điều này có nghĩa là không chỉ thay đổi một dòng mã, mà còn kiểm tra nó, có thể được chấp nhận thay đổi, xây dựng một bản phát hành và tải lên bản phát hành lên kho lưu trữ gói nói trên. Và sau đó thay đổi những gì bạn dự định thay đổi.

Công thức duy nhất tôi có thể cung cấp cho bạn từ kinh nghiệm của mình để thử và giảm thiểu điều này: không chỉ dựa vào việc trừu tượng hóa các khái niệm phổ biến từ các gói của bạn thành gói "chung" hoặc "khung" . Điều này có vẻ như là một điều rất khách quan để làm, nhưng nó sẽ dẫn đến một gói quái vật cần thay đổi và phát hành thường xuyên, có thể mâu thuẫn. Tốt hơn nhiều, hãy suy nghĩ về các chức năng trong hệ thống của bạn và tạo gói trợ giúp cho từng người trong số họ, như bạn đã nêu trong câu hỏi của mình.

Bên cạnh đó, lợi ích chính bạn sẽ nhận được là các ứng dụng của bạn được cách ly khỏi (nhiều) phụ thuộc, do đó bạn có thể trao đổi chúng mà không bị đau.


Mẹo tuyệt vời. Tôi đã không coi một commongói là một lựa chọn, nhưng, như bạn nói, tôi có thể thấy nó trở thành một quyết định "hợp lý" trong tương lai. Ý định của tôi là tập trung nhiều hơn vào các dòng thành phần thay vì mã - vì vậy lý tưởng nhất là bạn không nên có quá nhiều đoạn mã làm cùng một thứ trong các gói khác nhau vì chúng có nghĩa là làm những việc khác nhau. Tôi đoán rằng nếu có sự tương đồng giữa các gói, thì sự lặp lại đó sẽ không vi phạm các nguyên tắc lập trình tốt, vì các dự án theo định nghĩa riêng biệt.
Juan Carlos Coto
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.