C# 我是否应该停止与Visual Studio';默认名称空间命名约定?
我正在处理一个MVVM项目,因此我的项目中有一些文件夹,如模型、视图模型、窗口等。每当我创建一个新类时,Visual Studio都会自动将文件夹名称添加到名称空间指定中,而不只是保留项目级名称空间。因此,向ViewModels文件夹中添加一个新类将产生名称空间,C# 我是否应该停止与Visual Studio';默认名称空间命名约定?,c#,visual-studio,naming-conventions,namespaces,C#,Visual Studio,Naming Conventions,Namespaces,我正在处理一个MVVM项目,因此我的项目中有一些文件夹,如模型、视图模型、窗口等。每当我创建一个新类时,Visual Studio都会自动将文件夹名称添加到名称空间指定中,而不只是保留项目级名称空间。因此,向ViewModels文件夹中添加一个新类将产生名称空间,MyProject.ViewModels,而不仅仅是MyProject 当我第一次遇到这个问题时,我很恼火。我的类名非常清晰,有时甚至包含文件夹的名称(例如,ContactViewModel)。我很快发现自己手动删除了名称空间中的文件夹
MyProject.ViewModels
,而不仅仅是MyProject
当我第一次遇到这个问题时,我很恼火。我的类名非常清晰,有时甚至包含文件夹的名称(例如,ContactViewModel
)。我很快发现自己手动删除了名称空间中的文件夹名称。我甚至一度尝试创建一个自定义类模板(请参见),但无法实现,所以继续手动创建
不过,我开始怀疑,这种习俗的存在是否有一个我看不到的好理由。如果出于某种原因,将许多相同的类名集合组织到文件夹中,我会认为这很有用,但这似乎不是一个特别常见的场景
问题:
- 为什么命名空间名称通常反映文件夹结构
- 你遵守这个公约吗?为什么?
- 和你一样——我为此奋斗了很长时间。然后我开始考虑为什么要创建文件夹。我发现自己开始创建文件夹来表示名称空间和包,而不是任意的bucket
例如,在MVVM项目中,将视图和视图模型放在单独的名称空间中可能会有所帮助。MVC将为模型、控制器和视图提供单独的名称空间。根据类的特征对类进行分组也是有益的
突然,项目感觉更有条理了。其他开发人员更容易找到功能的实现位置
如果您将名称空间实践标准化,那么您的所有项目都将具有相同的可预测结构,这将是维护的一大胜利。我也对Visual Studio中的这种“默认”行为感到痛苦 当您将LinqToSql
.dbml
文件放在它们自己的目录中时,VisualStudio还会尝试设置名称空间/目录匹配。每当我编辑.dbml
时,我必须记住:
- 打开
文件.dbml.designer.cs
- 从
声明中删除目录/文件夹名称命名空间
不过,还是有办法的。它涉及到创建自定义类模板。不遵循约定的一种方法是在项目根文件夹中创建文件,然后将其移动到最终子文件夹
无论如何,这是一个我喜欢的惯例。如果我将类型拆分为文件夹,那么这些类型可能具有某种与文件夹相关的概念分组。因此,在某种意义上,它们的名称空间也是相似的。Java采用这种方法,并用它的包系统来实施它。最大的区别在于VS只是向您“建议”它,因为该语言或CLR都不强制执行它。文件系统文件夹和名称空间都代表一个层次结构。在我看来,我很自然地能与这两种人相配。我甚至更进一步,在文件和类之间使用1:1的关系。当我用其他语言编程时,我甚至会这样做,比如C++。
既然您对这两个层次结构之间的关系提出了疑问,我真的很想知道您希望用文件系统层次结构来表示什么。我也对此感到恼火,但使用大型代码库处理和重构项目很快就教会了我其他方面的知识。接受了这个概念后,我认为这是一种非常好的方法,可以“物理”和逻辑地构造代码。当您有一个大型项目,并且名称空间与文件夹不匹配时,很难快速找到文件。记住东西在哪里也要困难得多
此外,如果ReSharper推荐,那么这可能是个好主意。例如,如果您的类的名称空间与其文件夹名称不匹配,R#会投诉。如果您需要一些可靠的建议,我建议您购买这些建议,这些建议可以让您从实际的框架设计团队那里获得所需的所有信息 …命名名称空间的目标是为使用框架的程序员创建足够的清晰性,以便他们立即知道名称空间的内容可能是什么
(|)[.]
重要的是
不要对命名空间和该命名空间中的类型使用相同的名称
将每1/2个类型分割成名称空间并不能满足第一个要求,因为如果您遵循VisualStudio的方式,将有大量的名称空间必须经过鉴定或使用。比如说
核心
-领域
-使用者
-权限
-帐目
你会创造吗
- MyCompany.Core.Domain.Users
- MyCompany.Core.Domain.Permissions
- MyCompany.Core.Domain.Accounts
- MyCompany.Core.Domain
大部分都是常识,实际上是指如果您是自己的API或框架的消费者,您希望如何组织名称空间。虽然我同意其他人的观点,物理结构与逻辑结构匹配是有帮助的,但我不得不说,我也反对Visual Studio的自动命名。我必须重命名类的原因有六个:
- 我使用根“src”文件夹将代码与嵌入的资源直观地分开
- 我想要不同的大写字母
- 我将把代码组织到子文件夹中,以便在命名空间中进行组织
- 我喜欢分居
<Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]