Các thư mục trong một giải pháp có phù hợp với không gian tên?


129

Các thư mục trong một giải pháp có phù hợp với không gian tên?

Trong một trong các dự án nhóm của tôi, chúng tôi có một thư viện lớp có nhiều thư mục con trong dự án.

Tên dự án và không gian tên : MyCompany.Project.Section.

Trong dự án này, có một số thư mục khớp với phần không gian tên:

  • Thư mục Vehiclescó các lớp trong MyCompany.Project.Section.Vehicleskhông gian tên
  • Thư mục Clothingcó các lớp trong MyCompany.Project.Section.Clothingkhông gian tên
  • Vân vân.

Trong cùng dự án này, là một thư mục giả mạo khác

  • Thư mục BusinessObjectscó các lớp trong MyCompany.Project.Sectionkhông gian tên

Có một vài trường hợp như thế này trong đó các thư mục được tạo ra để "thuận tiện cho tổ chức".

Câu hỏi của tôi là: tiêu chuẩn là gì? Trong các thư viện lớp, các thư mục thường khớp với cấu trúc không gian tên hoặc nó là một túi hỗn hợp?


9
Lưu ý: ReSharper sẽ khiếu nại nếu không gian tên không khớp với phân cấp thư mục.
Fred

Câu trả lời:


76

Ngoài ra, lưu ý rằng nếu bạn sử dụng các mẫu dựng sẵn để thêm các lớp vào một thư mục, theo mặc định, nó sẽ được đặt trong một không gian tên phản ánh hệ thống phân cấp thư mục.

Các lớp sẽ dễ dàng tìm thấy hơn và đó là lý do đủ tốt.

Các quy tắc chúng tôi tuân theo là:

  • Tên dự án / lắp ráp giống như không gian tên gốc, ngoại trừ kết thúc.
  • Chỉ có ngoại lệ cho quy tắc trên là một dự án có kết thúc .Core, .Core bị loại bỏ
  • Thư mục bằng không gian tên
  • Một loại cho mỗi tệp (lớp, struct, enum, ủy nhiệm, v.v.) giúp bạn dễ dàng tìm đúng tệp

1
+1 cho "Chỉ ngoại lệ cho quy tắc trên là một dự án có kết thúc .Core, .Core bị loại bỏ" . Tôi có một MyProject.Core.dllhội đồng và tất cả các lớp bắt đầu với MyProject.Core. Tước .Corehậu tố có ý nghĩa hơn nhiều.
Luiz Damim

2
Một ngoại lệ khác tôi có thể thêm là Ngoại lệ. Các ngoại lệ đã được thêm vào với 'Ngoại lệ', do đó, một không gian tên bổ sung là không cần thiết. Nó cũng có thể trở nên lộn xộn khi có một phần của không gian tên với từ Exception (có thể dẫn đến System.Exception khó hiểu). Tuy nhiên, tổ chức chúng vào các thư mục khá hữu ích.
phillipwei

55

Không.

Tôi đã thử cả hai phương pháp cho các dự án nhỏ và lớn, cả với một (tôi) và một nhóm các nhà phát triển.

Tôi thấy con đường đơn giản và hiệu quả nhất là có một không gian tên cho mỗi dự án và tất cả các lớp đi vào không gian tên đó. Sau đó, bạn có thể tự do đặt các tệp lớp vào bất kỳ thư mục dự án nào bạn muốn. Không có gì lộn xộn về việc thêm bằng cách sử dụng các câu lệnh ở đầu tệp mọi lúc vì chỉ có một không gian tên duy nhất.

Điều quan trọng là tổ chức các tệp nguồn vào các thư mục và theo tôi đó là tất cả các thư mục nên được sử dụng cho. Yêu cầu các thư mục này cũng ánh xạ tới các không gian tên là không cần thiết, tạo ra nhiều công việc hơn và tôi thấy thực sự có hại cho tổ chức vì gánh nặng thêm khuyến khích sự vô tổ chức.

Lấy cảnh báo FxCop này làm ví dụ:

CA1020: Tránh các không gian tên với một vài loại
nguyên nhân: Một không gian tên khác với không gian tên toàn cầu chứa ít hơn năm loại https://msdn.microsoft.com/en-gb/l Library / ms182130.aspx

Cảnh báo này khuyến khích việc đổ các tệp mới vào thư mục Project.General chung hoặc thậm chí là gốc dự án cho đến khi bạn có bốn lớp tương tự để biện minh cho việc tạo thư mục mới. Điều đó sẽ bao giờ xảy ra?

Tìm tập tin

Câu trả lời được chấp nhận cho biết "Các lớp sẽ dễ tìm hơn và đó là lý do đủ tốt."

Tôi nghi ngờ câu trả lời đề cập đến việc có nhiều không gian tên trong một dự án không ánh xạ đến cấu trúc thư mục, hơn là những gì tôi đang đề xuất đó là một dự án có một không gian tên duy nhất.

Trong mọi trường hợp trong khi bạn không thể xác định thư mục nào chứa tệp từ không gian tên, bạn có thể tìm thấy nó bằng cách sử dụng Chuyển đến Định nghĩa hoặc hộp trình khám phá giải pháp tìm kiếm trong Visual Studio. Ngoài ra, đây không thực sự là một vấn đề lớn trong quan điểm của tôi. Tôi không dành thậm chí 0,1% thời gian phát triển của mình cho vấn đề tìm tệp để biện minh cho việc tối ưu hóa nó.

Tên đụng độ

Chắc chắn tạo nhiều không gian tên cho phép dự án có hai lớp có cùng tên. Nhưng đó có thực sự là một điều tốt? Có lẽ dễ dàng hơn là không cho phép điều đó là có thể? Việc cho phép hai lớp có cùng tên sẽ tạo ra một tình huống phức tạp hơn trong đó 90% thời gian mọi thứ hoạt động theo một cách nhất định và sau đó đột nhiên bạn thấy bạn có một trường hợp đặc biệt. Giả sử bạn có hai lớp Hình chữ nhật được định nghĩa trong các không gian tên riêng biệt:

  • lớp Project1.Image. Hình chữ nhật
  • lớp Project1.Window. Hình chữ nhật

Có thể gặp phải một vấn đề mà tệp nguồn cần bao gồm cả hai không gian tên. Bây giờ bạn phải viết ra không gian tên đầy đủ ở mọi nơi trong tệp đó:

var rectangle = new Project1.Window.Rectangle();

Hoặc gây rối với một số tuyên bố khó chịu bằng cách sử dụng:

using Rectangle = Project1.Window.Rectangle;

Với một không gian tên duy nhất trong dự án của bạn, bạn buộc phải đưa ra các tên khác nhau và tôi sẽ tranh luận nhiều hơn về các tên như thế này:

  • lớp Project1.ImageR chữ nhật
  • lớp Project1.WindowR chữ nhật

Và việc sử dụng là như nhau ở mọi nơi, bạn không phải đối phó với trường hợp đặc biệt khi một tệp sử dụng cả hai loại.

sử dụng báo cáo

using Project1.General;  
using Project1.Image;  
using Project1.Window;  
using Project1.Window.Controls;  
using Project1.Shapes;  
using Project1.Input;  
using Project1.Data;  

đấu với

using Project1;

Dễ dàng không phải thêm không gian tên mọi lúc trong khi viết mã. Đó không phải là thời gian thực sự, đó là sự gián đoạn của việc phải làm điều đó và chỉ cần lấp đầy các tệp với nhiều câu lệnh sử dụng - để làm gì? Nó có đáng không?

Thay đổi cấu trúc thư mục dự án

Nếu các thư mục được ánh xạ tới các không gian tên thì đường dẫn thư mục dự án được mã hóa cứng vào mỗi tệp nguồn. Điều này có nghĩa là bất kỳ việc đổi tên hoặc di chuyển tệp hoặc thư mục trong dự án đều yêu cầu nội dung tệp thực tế phải thay đổi. Cả khai báo không gian tên của các tệp trong thư mục đó và sử dụng các câu lệnh trong toàn bộ các tệp khác tham chiếu các lớp trong thư mục đó. Mặc dù các thay đổi là không đáng kể với công cụ, nhưng nó thường dẫn đến một cam kết lớn bao gồm nhiều tệp mà các lớp thậm chí không thay đổi.

Với một không gian tên duy nhất trong dự án, bạn có thể thay đổi cấu trúc thư mục dự án theo cách bạn muốn mà không cần bất kỳ tệp nguồn nào được sửa đổi.

Visual Studio tự động ánh xạ không gian tên của một tệp mới vào thư mục dự án mà nó được tạo trong

Thật không may, nhưng tôi thấy rắc rối của việc sửa không gian tên ít hơn rắc rối khi xử lý chúng. Ngoài ra, tôi có thói quen sao chép một tập tin hiện có thay vì sử dụng Thêm-> Mới.

Trình duyệt đối tượng và Intellisense

Theo tôi, lợi ích lớn nhất của việc sử dụng nhiều không gian tên trong các dự án lớn là có thêm tổ chức khi xem các lớp trong bất kỳ công cụ nào hiển thị các lớp trong hệ thống phân cấp không gian tên. Ngay cả tài liệu. Rõ ràng chỉ có một không gian tên trong dự án sẽ dẫn đến tất cả các lớp được hiển thị trong một danh sách thay vì được chia thành các danh mục. Tuy nhiên, cá nhân tôi chưa bao giờ bị bối rối hoặc trì hoãn vì thiếu điều này vì vậy tôi không thấy đó là một lợi ích đủ lớn để biện minh cho nhiều không gian tên.

Mặc dù nếu tôi đang viết một thư viện lớp công cộng lớn thì có lẽ tôi sẽ sử dụng nhiều không gian tên trong dự án để tập hợp trông gọn gàng trong công cụ và tài liệu.


30
Đây thực sự là một trong những giải pháp ác mộng nhất mà tôi từng đề xuất. Nếu bạn làm việc trên các dự án hello world nhỏ thì lời khuyên này có hiệu quả, nhưng hãy tưởng tượng bạn có hơn 1000 tệp .cs. Nó sẽ gây ra rất nhiều vấn đề tôi không biết bắt đầu từ đâu.
BentOnCoding

10
"nhưng hãy tưởng tượng bạn có hơn 1000 tệp .cs". Tôi đã làm việc trong các dự án có kích thước đó với một không gian tên duy nhất. Tốt rồi. Thảm họa nào bạn nghĩ sẽ xảy ra?
Weyland Yutani

14
+1 để suy nghĩ. Tôi không nghĩ rằng tôi đã sẵn sàng giảm các không gian tên của mình xuống còn một dự án nhưng sau khi làm việc trên một khung lớn, tôi đang khám phá việc giảm số lượng không gian tên để giảm số lượng sử dụng câu lệnh và hỗ trợ khả năng khám phá các phương thức mở rộng. Tôi nghĩ rằng câu trả lời này cung cấp một số thực phẩm tốt cho suy nghĩ. Cảm ơn.
Lee Gunn

3
@WeylandYutani tôi biết tôi đến muộn nhưng tôi cần đề cập rằng câu này: you can find it by using Go To Definition or the search solution explorer box in Visual Studiokhông phải lúc nào cũng đúng. Hãy thử nó với rất nhiều sự kế thừa và Giao diện ... chúc may mắn tìm được tập tin phù hợp.
Emmanuel M.

11
Đây là một trong những lời khuyên tốt nhất tôi từng thấy. Không gian tên chỉ dành cho giải quyết xung đột, không tổ chức các lớp. Chỉ sử dụng các không gian tên khi sử dụng chúng hợp lý, chẳng hạn như nơi bạn dự kiến ​​sẽ có xung đột đặt tên với các dự án khác có thể đang sử dụng dự án của bạn, cho phép bao gồm các không gian tên nhất định hoặc loại trừ sử dụng các câu lệnh. Thật khủng khiếp khi có một dự án với 3 hoặc 4 hoặc nhiều không gian tên thường xuyên được sử dụng, bởi vì nó luôn dẫn đến một số lượng lớn các câu lệnh sử dụng mà bạn cần thêm và thêm và thêm và thêm. Phá vỡ các dự án của bạn ngoài.
Triynko

31

Tôi nghĩ rằng tiêu chuẩn, trong .NET, là cố gắng thực hiện nó khi có thể, nhưng không tạo ra các cấu trúc sâu không cần thiết chỉ để tuân thủ nó như một quy tắc cứng. Không có dự án nào của tôi tuân theo không gian tên == quy tắc cấu trúc 100% thời gian, đôi khi chỉ cần sạch hơn / tốt hơn để thoát ra khỏi các quy tắc đó.

Trong Java, bạn không có lựa chọn nào khác. Tôi gọi đó là một trường hợp kinh điển về những gì hoạt động trong lý thuyết so với những gì hoạt động trong thực tế.


1
Tôi sẽ nói "làm điều đó khi bạn thực sự muốn một cái gì đó nằm trong không gian tên của chính nó". Nó nên là một quyết định có ý thức. Nếu các dự án của bạn được cách ly đúng, nó sẽ là một không gian tên cho mỗi dự án. Nếu lớp của bạn nằm trong một không gian tên, thì nó sẽ nằm trong một thư mục có không gian tên đó HOẶC một vị trí thư mục con ít nhất là cụ thể như không gian tên. Một lớp như Car.Ford.Fusion (nếu Car.Ford là không gian tên duy nhất của bạn) phải nằm trong một thư mục như Car / Ford HOẶC sâu hơn như Car / Ford / Sedans, sao cho thư mục ít nhất là cụ thể như không gian tên. Chỉ cần không đặt nó trong Xe / Không liên quan / Ford; thật khó hiểu
Triynko

25

@lassevk: Tôi đồng ý với các quy tắc này và có thêm một quy tắc nữa.

Khi tôi có các lớp lồng nhau, tôi vẫn tách chúng ra, mỗi lớp một tệp. Như thế này:

// ----- Foo.cs
partial class Foo
{
    // Foo implementation here
}

// ----- Foo.Bar.cs
partial class Foo
{
    class Bar
    {
        // Foo.Bar implementation here
    }
}

5

Tôi muốn nói có.

Đầu tiên, sẽ dễ dàng hơn để tìm các tệp mã thực tế bằng cách theo dõi các không gian tên (giả sử, khi ai đó gửi email cho bạn một ngăn xếp cuộc gọi ngoại lệ trần trụi). Nếu bạn để các thư mục của mình không đồng bộ với các không gian tên, việc tìm kiếm các tệp trong các cơ sở mã lớn sẽ trở nên mệt mỏi.

Thứ hai, VS sẽ tạo các lớp mới mà bạn tạo trong các thư mục có cùng không gian tên của cấu trúc thư mục mẹ của nó. Nếu bạn quyết định bơi chống lại điều này, nó sẽ chỉ là một công việc hệ thống ống nước khác phải làm hàng ngày khi thêm các tệp mới.

Tất nhiên, điều này không cần phải nói rằng người ta nên thận trọng về việc phân cấp thư mục / không gian tên xis sâu đến mức nào.


4

Có, họ nên, chỉ dẫn đến nhầm lẫn khác.


2

Tiêu chuẩn là gì?

Không có tiêu chuẩn chính thức nhưng thông thường, mẫu ánh xạ không gian tên được sử dụng rộng rãi nhất.

Trong các thư viện lớp, các thư mục thường khớp với cấu trúc không gian tên hoặc nó là một túi hỗn hợp?

Có, trong hầu hết các thư viện lớp, các thư mục khớp với không gian tên để dễ tổ chức.

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.