解决方案中的文件夹是否应该与命名空间匹配?

在我的一个团队项目中,我们有一个类库,该项目中有许多子文件夹。

项目名称和命名空间: MyCompany.Project.Section.

在此项目中,有几个与命名空间部分匹配的文件夹:

  • 文件夹 Vehicles 有课程在 MyCompany.Project.Section.Vehicles 名称空间
  • 文件夹 Clothing 有课程在MyCompany.Project.Section.Clothing 名称空间
  • ETC。

在同一个项目中,还有另一个恶意文件夹

  • 文件夹 BusinessObjects 有课程在 MyCompany.Project.Section 名称空间

在某些情况下,文件夹是为了“组织方便”而创建的。

我的问题是:标准是什么?在类库中,文件夹通常与命名空间结构匹配还是混合包?

有帮助吗?

解决方案

另请注意,如果您使用内置模板将类添加到文件夹中,则默认情况下它将放置在反映文件夹层次结构的命名空间中。

课程会更容易找到,仅此一点就足够了。

我们遵循的规则是:

  • 项目/程序集名称与根命名空间相同,但 .dll 结尾除外
  • 上述规则的唯一例外是以 .Core 结尾的项目,.Core 被剥离
  • 文件夹等于命名空间
  • 每个文件一种类型(类、结构、枚举、委托等)可以轻松找到正确的文件

其他提示

不。

我已经在小型和大型项目中尝试过这两种方法,无论是单个(我)还是一个开发团队。

我发现最简单、最高效的方法是每个项目都有一个命名空间,并且所有类都进入该命名空间。然后,您可以随意将类文件放入您想要的任何项目文件夹中。始终在文件顶部添加 using 语句不会造成混乱,因为只有一个命名空间。

将源文件组织到文件夹中非常重要,在我看来,所有文件夹都应该用于此目的。要求这些文件夹也映射到命名空间是不必要的,会产生更多工作,而且我发现这实际上对组织有害,因为增加的负担会导致组织混乱。

以这个 FxCop 警告为例:

CA1020:避免使用少数类型的命名空间
原因:全局命名空间以外的命名空间包含的类型少于五种 https://msdn.microsoft.com/en-gb/library/ms182130.aspx

此警告鼓励将新文件转储到通用 Project.General 文件夹中,甚至项目根目录中,直到您有四个类似的类来证明创建新文件夹的合理性。这种事会发生吗?

查找文件

公认的答案是“课程会更容易找到,仅此一点就足够了。”

我怀疑答案是指项目中有多个名称空间,这些名称空间不映射到文件夹结构,而不是我建议的具有单个名称空间的项目。

在任何情况下,当您无法从命名空间确定类文件位于哪个文件夹时,您可以使用“转到定义”或 Visual Studio 中的搜索解决方案资源管理器框来找到它。而且在我看来这并不是一个大问题。我不会将 0.1% 的开发时间花在寻找文件来证明优化的合理性上。

名称冲突

当然,创建多个命名空间允许项目具有两个同名的类。但这真的是一件好事吗?不让这种情况发生可能更容易吗?允许两个类具有相同的名称会产生更复杂的情况,其中 90% 的情况都以某种方式工作,然后突然您发现有一个特殊情况。假设您在不同的命名空间中定义了两个 Rectangle 类:

  • 类 Project1.Image.Rectangle
  • 类 Project1.Window.Rectangle

可能会遇到源文件需要包含两个命名空间的问题。现在您必须在该文件中的所有位置写出完整的命名空间:

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

或者搞乱一些令人讨厌的 using 语句:

using Rectangle = Project1.Window.Rectangle;

由于项目中只有一个命名空间,您被迫想出不同的、我认为更具描述性的名称,如下所示:

  • 类 Project1.ImageRectangle
  • 类 Project1.WindowRectangle

而且用法在任何地方都是相同的,当文件使用这两种类型时,您不必处理特殊情况。

使用语句

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

using Project1;

编写代码时不必一直添加名称空间,非常方便。这并不是真正花费的时间,而是必须执行此操作并且只是用大量 using 语句填充文件的流程中断 - 为了什么?这值得么?

更改项目文件夹结构

如果文件夹映射到命名空间,则项目文件夹路径将有效地硬编码到每个源文件中。这意味着项目中文件或文件夹的任何重命名或移动都需要更改实际文件内容。该文件夹中文件的命名空间声明以及引用该文件夹中的类的一大堆其他文件中的 using 语句。虽然更改本身对于工具来说是微不足道的,但它通常会导致由许多类甚至没有更改的文件组成的大型提交。

通过项目中的单个命名空间,您可以根据需要更改项目文件夹结构,而无需修改任何源文件本身。

Visual Studio 自动将新文件的命名空间映射到它在其中创建的项目文件夹

不幸的是,但我发现纠正名称空间的麻烦比处理它们的麻烦要少。另外,我养成了复制粘贴现有文件而不是使用“添加”->“新建”的习惯。

智能感知和对象浏览器

我认为在大型项目中使用多个命名空间的最大好处是,在任何在命名空间层次结构中显示类的工具中查看类时,可以进行额外的组织。甚至文档。显然,项目中只有一个名称空间会导致所有类显示在单个列表中,而不是分成几类。然而,就我个人而言,我从未因为缺乏这一点而感到困惑或延迟,所以我认为它没有足够大的好处来证明多个命名空间的合理性。

虽然如果我正在编写一个大型公共类库那么我 可能在项目中使用多个命名空间,以便程序集在工具和文档中看起来很整洁。

我认为 .NET 中的标准是尽可能做到这一点,但不要创建不必要的深层结构只是为了将其作为硬性规则来遵守。我的项目都没有 100% 遵循命名空间 == 结构规则,有时摆脱这些规则只是更干净/更好。

在 Java 中你没有选择。我将其称为理论上有效与实践中有效的经典案例。

@拉塞夫克:我同意这些规则,但还有一条要补充。

当我有嵌套类时,我仍然将它们分开,每个文件一个。像这样:

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

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

我会说是的。

首先,通过跟踪命名空间(例如,当有人通过电子邮件向您发送裸异常调用堆栈时)可以更轻松地找到实际的代码文件。如果您让文件夹与命名空间不同步,那么在大型代码库中查找文件就会变得很累。

其次,VS 将生成您在与其父文件夹结构具有相同命名空间的文件夹中创建的新类。如果您决定反对这一点,那么每天添加新文件时,这将只是一项额外的管道工作。

当然,不言而喻,人们应该对文件夹/命名空间层次结构的深度持保守态度。

是的,他们应该这样做,否则只会导致混乱。

标准是什么?

没有官方标准,但按照惯例,文件夹到命名空间的映射模式使用最广泛。

In class libraries do the folders usually match the namespace structure or is it a mixed bag?

是的,在大多数类库中,文件夹与命名空间相匹配,以便于组织。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top