2009-12-15 38 views
11

Thực hành không tốt để viết một thư viện định nghĩa một giao diện phụ thuộc vào một thư viện khác?Các phương pháp hay nhất để tạo thư viện sử dụng các không gian tên .NET

Tôi biết khớp nối chặt chẽ là xấu, nhưng điều này vẫn áp dụng khi sử dụng các lớp .NET?

Ví dụ: trong .NET, nếu tôi có thư viện trả về đối tượng Màu, nó sẽ buộc phụ thuộc vào System.Drawing trên bất kỳ thứ gì sử dụng thư viện của tôi. Tôi có nên tạo ra lớp màu của riêng mình trong thư viện của mình không?

+0

Câu hỏi hay. . –

Trả lời

10

Tôi phân biệt giữa VolatilePhụ thuộc ổn định. Nói chung, màu trông giống như một phụ thuộc ổn định bởi vì nó đã có trong BCL, nó mang tính quyết định trong tự nhiên và không liên quan đến bất kỳ quá trình truyền thông ngoài quy trình nào, và cũng không phụ thuộc vào một thiết lập cụ thể của môi trường thời gian chạy của nó.

Chỉ xem xét ở đây là khi nói đến Màu, có nhiều hơn một lớp trong BCL, vì vậy hãy đảm bảo rằng bạn thực sự muốn nhắm mục tiêu chỉ các ứng dụng Windows Forms bằng API của mình, vì WPF có định nghĩa riêng của nó Màu sắc.

Nếu bạn chỉ cần màu để vẽ các phần của giao diện người dùng trong một màu nhất định, thì lớp Màu được tích hợp có thể tốt, nhưng nếu Màu là một khái niệm chính trong Mô hình miền của bạn và bạn cần nhắm mục tiêu khác Giao diện người dùng (WPF, Windows Forms, Web) bạn có lẽ sẽ tốt hơn bằng cách xác định trừu tượng của riêng bạn.

Trong trường hợp cao cấp hơn như vậy, bạn có thể tạo ra các Adapters và Mappers xung quanh sự trừu tượng của bạn để thu hẹp khoảng cách giữa lớp trừu tượng và các lớp Màu cụ thể.

+1

Liên kết tuyệt vời với các phụ thuộc dễ bay hơi và nói chung là một câu trả lời tuyệt vời. +1! – Randolpho

+0

Cảm ơn bạn đã cung cấp thông tin này, đầy đủ các lời khuyên về các vấn đề tôi chưa từng cân nhắc. Tôi chắc chắn tôi muốn thoát khỏi WinForms tại một số điểm. – DanDan

+0

Tôi thích lời khuyên này, nó nhắc tôi giữ sự phụ thuộc trong các lớp học của tôi, và kết hợp với bài đăng từ Gus (Nguyên tắc Gus) lời khuyên chung dường như là "Roll my own". Quá trình hành động này có hiệu quả nhất do lớp Màu là tầm thường. Trong những tình huống phức tạp hơn với sự phụ thuộc của bên thứ 3, như Randolpho đề cập, nguyên tắc này có thể bị uốn cong, hoặc thiết kế được suy nghĩ lại bằng cách nào đó. Cảm ơn bài viết của bạn! – DanDan

5

Nếu đó là thư viện .NET chuẩn, tôi sẽ không lo lắng về điều đó. Không có lý do gì để ánh xạ từ lớp này sang lớp khác ... nếu System.Color thay đổi trong bản phát hành .NET tiếp theo thì sao? Bạn cũng sẽ phải thay đổi mã bản đồ của mình và có thể phải phát hiện phiên bản và bản đồ tương ứng. Đó là một nỗi đau thực sự.

+2

Mã BCL có xu hướng không thay đổi giữa các phiên bản, nhưng mặt khác, các loại Màu mới có thể xuất hiện - và chúng có: nếu bạn phụ thuộc vào System.Drawing.Color, bạn sẽ tự tắt nguồn bằng cách sử dụng API trong WPF. –

+0

Cảm ơn lời khuyên. – DanDan

2

Với tất cả thư viện của tôi, tôi trả về các đối tượng chỉ phụ thuộc vào mọi thứ trong thư viện.

Tôi tự hỏi tại sao tôi viết một thư viện phụ thuộc vào một không gian tên khác không được ngầm định. Nó dường như đi ngược lại toàn bộ khái niệm "đóng gói".

Vì vậy, chỉ cần đi ra khỏi lý luận của riêng tôi và kiến ​​thức về OOP, tôi sẽ nói rằng bạn đang đi đúng hướng với trả lại đối tượng không phụ thuộc của riêng bạn.

+0

Tôi nghĩ rằng nó có thể chấp nhận được để làm việc với các không gian tên trong mscorlib; bên ngoài đó, nguyên tắc là âm thanh. –

+0

Tôi cũng thích nguyên tắc của bạn, tôi sẽ theo nó. – DanDan

1

Bạn đặt ra một câu hỏi hay. Câu trả lơi con phụ thuộc vao nhiêu thư. Trong trường hợp của các thư viện chuẩn sẽ luôn sẵn sàng, thì tốt thôi; các thư viện lõi tham chiếu khác nhau. DLL tất cả các thời gian.

Trong trường hợp thư viện của bên thứ ba bạn gặp sự cố. Nó không phải luôn luôn là một ý tưởng tốt để cuộn của riêng bạn nếu cái gì khác làm những gì bạn muốn, nhưng sau đó bạn có một sự phụ thuộc vào thư viện khác, đó là một vấn đề hậu cần cho người dùng.

Không có câu trả lời đúng ở đây, bạn chỉ cần đi với những gì làm cho ý nghĩa nhất cho dự án của bạn. Cố gắng phân tách càng nhiều càng tốt, có, nhưng đôi khi bạn chỉ cần ôm ấp và hoàn thành công việc.

+0

Hehe, tôi thích cụm từ "Bạn chỉ cần ôm ấp và hoàn thành công việc". Tôi nghĩ trong trường hợp này, vì sự tầm thường tương đối của lớp Màu tôi sẽ tốt hơn khi tự mình lăn. Tôi thấy những trường hợp phức tạp hơn sẽ mang lại đau đầu. – DanDan

1

Tùy thuộc vào việc sử dụng lớp học của bạn.

Nếu bạn cần lấy một thể hiện của hệ thống Lớp màu từ một thể hiện của lớp Màu của bạn (ví dụ nếu bạn vẽ một biểu mẫu cửa sổ) thì tốt hơn nên sử dụng lớp Hệ thống - nó giúp bạn tiết kiệm nỗ lực chuyển đổi giữa hai loại và cung cấp cho bạn lợi thế là có thể sử dụng tất cả "Tính năng" của lớp Màu miễn phí (chẳng hạn như được xây dựng trong các hằng số cho "Đỏ", "Đen", "Xanh lục", v.v. ..

Nếu mặt khác bạn chỉ đơn giản là làm việc với các giá trị RGB tùy ý (có lẽ để tính toán khoa học) và không bao giờ cần chuyển đổi thành thể hiện của System.Color, thì có thể tạo ra lớp của riêng bạn .

Trong tất cả các khả năng bạn nên sử dụng lớp System.Color - có đóng gói và tất cả đó là một ý tưởng tốt, tuy nhiên không phải lúc tiết kiệm chi phí cho bạn một lượng lớn thời gian!

+0

Tôi chắc chắn 99% tôi sẽ không cần các hằng số tích hợp, vì vậy trong trường hợp này, tôi nghĩ rằng tôi nên làm việc tốt hơn. Cảm ơn vì lời khuyên của bạn. – DanDan

1

Bạn không nên lo lắng về việc sử dụng bất kỳ thứ gì trong thư viện lõi .NET. Bạn sẽ không nhận được rất nhiều bằng văn bản một DLL mà không có nó. Nơi duy nhất có thể cẩn thận xung quanh nó là không gian tên System.Web như tôi tin .NET 4 có một trình cài đặt hồ sơ khách hàng, về cơ bản có nghĩa là nếu bạn sử dụng trình cài đặt này, nó sẽ chỉ cài đặt những thứ được mong đợi sẽ được sử dụng trên máy khách. Cá nhân tôi nghĩ rằng đó là một ý tưởng tồi về Phần của Microsoft vì nó chỉ thêm các biến chứng không cần thiết để tiết kiệm một lượng thời gian tải xuống nhỏ.

+0

Cảm ơn bạn đã cảnh báo. – DanDan

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