解决scheme中的文件夹应该与名称空间匹配吗?

解决scheme中的文件夹应该与名称空间匹配吗?

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

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

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

  • 文件夹VehiclesMyCompany.Project.Section.Vehicles命名空间中有类
  • Folder ClothingMyCompany.Project.Section.Clothing命名空间中有类
  • 等等

在同一个项目里面,是另一个stream氓文件夹

  • 文件夹BusinessObjectsMyCompany.Project.Section命名空间中有类

有一些这样的文件夹是为了“组织的便利性”。

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

此外,请注意,如果使用内置模板向文件夹添加类,则默认情况下会将其放入反映文件夹层次结构的名称空间中。

这些课程将会更容易find,而这一点应该是足够好的理由。

我们遵循的规则是:

  • 项目/程序集名称与根名称空间相同,除了.dll结尾
  • 只有上述规则的例外是.Core结尾的项目,.Core被剥离
  • 文件夹等于命名空间
  • 每个文件(类,结构,枚举,委托等)的一个types可以很容易地find正确的文件

我认为.NET中的标准就是在可能的情况下尽量做到这一点,但不要创造出不必要的深层结构,只能坚持它作为一个硬性规则。 我的项目中,没有一个项目在100%的时间内遵循命名空间==结构规则,有时它只是更清晰/更好地从这样的规则中分离出来。

在Java中,你没有select。 我认为这是一个理论上比较实际的经典案例。

@lassevk:我同意这些规则,还有一个补充。

当我有嵌套类,我仍然分裂出来,每个文件一个。 喜欢这个:

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

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

没有。

我已经在小型和大型项目上尝试了这两种方法,包括单个(我)和一个开发团队。

我发现最简单和最有效率的方法就是为每个项目设置一个名称空间,并将所有类都放入该名称空间。 然后,您可以自由地将类文件放到任何您想要的项目文件夹中。 没有任何关于在文件顶部添加使用语句的麻烦,因为只有一个命名空间。

把源文件组织成文件夹是非常重要的,而且我认为所有的文件夹都应该被使用。 要求这些文件夹也映射到命名空间是不必要的,创造更多的工作,我发现实际上是有害于组织,因为增加的负担鼓励混乱。

以这个FxCop警告为例:

CA1020:避免less数types的命名空间
原因:全局名称空间以外的名称空间包含less于五个typeshttps://msdn.microsoft.com/zh-cn/library/ms182130.aspx

这个警告鼓励将新文件转储到通用的Project.General文件夹,甚至是项目根目录,直到有四个相似的类来certificate创build一个新的文件夹。 这会发生吗?

查找文件

被接受的答案是:“class级会比较容易find,而且这样做应该足够好。”

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

无论如何,当您无法从名称空间中确定类文件位于哪个文件夹时,可以使用“转到定义”或Visual Studio中的“search解决scheme资源pipe理器”框来find它。 这在我看来也不是什么大问题。 我不会花费我的开发时间的0.1%来查找文件来certificate优化它的问题。

姓名冲突

当然,创build多个名称空间允许项目有两个同名的类。 但这真的是一件好事吗? 也许容易,只是不允许从可能? 允许两个同名的class级创build一个更复杂的情况,其中90%的时间以某种方式工作,然后突然发现你有一个特殊的情况。 假设您在单独的名称空间中定义了两个Rectangle类:

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

有可能遇到源文件需要包含这两个名称空间的问题。 现在,您必须在该文件的每个地方写出完整的命名空间:

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

或用一些讨厌的使用声明:

 using Rectangle = Project1.Window.Rectangle; 

在你的项目中只有一个命名空间,你不得不提出不同的命名空间,我会提出更多描述性的名字:

  • 类Project1.ImageRectangle
  • 类Project1.WindowRectangle

而且使用情况在任何地方都是一样的,当一个文件同时使用这两种types时,您不必处理特殊情况。

使用语句

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

VS

 using Project1; 

编写代码时不必一直添加命名空间。 这不是真正需要的时间,而是不得不这样做的stream程中断,只是用很多使用语句来填充文件 – 为什么呢? 这值得么?

更改项目文件夹结构

如果文件夹映射到名称空间,那么项目文件夹path将被有效地硬编码到每个源文件中。 这意味着项目中任何重命名或移动文件或文件夹都需要更改实际的文件内容。 该文件夹中的文件的命名空间声明以及在引用该文件夹中的类的大量其他文件中使用语句。 虽然这些修改本身对于工具来说是微不足道的,但是通常会导致一个很大的提交,其中包含许多其类没有改变的文件。

通过项目中的单个命名空间,您可以更改项目文件夹结构,但是不需要修改任何源文件。

Visual Studio自动将新文件的名称空间映射到其创build的项目文件夹

不幸的是,我觉得纠正命名空间的麻烦不在于处理它们的麻烦。 此外,我养成了粘贴现有文件的习惯,而不是使用Add-> New。

智能感知和对象浏览器

在我看来,在大型项目中使用多个名称空间的最大好处是,在显示名称空间层次结构中的类的任何工具中查看类时,都有额外的组织机构。 甚至文件。 显然,在项目中只有一个名称空间会导致所有类都显示在一个列表中,而不是分为几个类别。 然而,我个人从来没有因为缺乏这个而陷入困境或延期,所以我没有发现certificate多个命名空间足够大的好处。

虽然如果我正在编写一个大的公共类库,那么我可能会在项目中使用多个名称空间,以使组件在工具和文档中看起来很整洁。

我会说是的。

首先,通过追踪命名空间(比如有人向你发送一个裸体exception调用堆栈),find实际的代码文件会更容易。 如果让文件夹与命名空间不同步,那么在大型代码库中查找文件会变得越来越累。

其次,VS将生成新的类,它们在父文件夹结构中具有相同名称空间的文件夹中创build。 如果你决定游泳,那么在添加新文件的时候,每天只能做一件事。

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

是的他们应该只会导致混淆,否则。