C# 名称空间-多深是太深

C# 名称空间-多深是太深,c#,.net,namespaces,C#,.net,Namespaces,我们目前正在重新组织一些服务项目,以便它们的命名更符合逻辑。我们的结构如下: Djp.Services.Type。服务名 作为一个逻辑分组,这似乎是有意义的,但是我想知道的是,基于项目中的文件夹,在这个分组下有更多的级别是否可以接受。例如,一个项目被称为 Djp.Services.Management.Data 在这个项目下,我们有一个“POCO”文件夹和一个“Repositories”文件夹,这意味着,原则上,这些文件夹下的对象将有一个5层深的名称空间 名称空间的这种深度是应该避免的,还是完全

我们目前正在重新组织一些服务项目,以便它们的命名更符合逻辑。我们的结构如下:

Djp.Services.Type。服务名

作为一个逻辑分组,这似乎是有意义的,但是我想知道的是,基于项目中的文件夹,在这个分组下有更多的级别是否可以接受。例如,一个项目被称为

Djp.Services.Management.Data

在这个项目下,我们有一个“POCO”文件夹和一个“Repositories”文件夹,这意味着,原则上,这些文件夹下的对象将有一个5层深的名称空间


名称空间的这种深度是应该避免的,还是完全合理的?

任何遵循应用程序结构逻辑的名称空间都是好的,不管长度如何。

如果某个名称空间闻起来太长,请后退一步并对其进行分析。如果它通过了测试,那么我完全同意@Bozho


软件开发是非常客观的,并且充满了硬性规则的例外。(忍不住)

让文件夹结构与名称空间结构匹配很方便,但让名称空间结构与文件夹结构匹配是没有意义的

名称空间的类型和成员就是您正在创建的对象。这是你手艺的成果,也是你应该关注的事情。文件夹中的文件是帮助您执行此操作的一种方式。您可能已经对文件夹进行了结构化,使其与合理的名称空间相匹配(实际上是您在这样做时“编写”了名称空间结构),在这种情况下,一切都很好,但您可能还没有这样做。名称空间对程序集的创建者和用户都很重要,文件夹结构只对创建者重要


忽略深度,忽略文件夹,查看由名称创建的空间。

我们有一个七层深的名称空间,在类的末尾有一个第八个符号。Visual Studio 2010左上角的下拉列表允许您选择此文件中的类,但该下拉列表不符合我们的完全限定类名,当您将鼠标悬停在该类名上时,没有工具提示,因此找到该类名的唯一方法是取消锁定源代码视图并将其跨两个监视器拉伸


我知道这取决于名称的总长度,而不一定取决于嵌套名称空间的数量,但我将继续将其定义为“太深”:)

很难客观地回答,但过去有几件事让我停顿了一下

  • 序列化。序列化类时,完全限定的类名通常会进入序列化中包含的某个标识符中<例如,json文件中的code>$type。或者在消息总线(例如NServiceBus)上,它们与各种API一起使用。例如,我有一个需要作为偶数类型的类的FQN,azure服务总线API拒绝了它,因为它太长了
  • 文件。很容易解释这个一次运行的docfx或其他文档生成器,然后查看目录。祝你玩得开心。即使使用Swashback自动生成您的Swagger/OAS规范文件,您也有一些胖对象ID
  • 在代码中,当您有两个来自两个不同名称空间的同名类时,必须在代码中对它们进行限定。例如,您可以有一束如下所示:
Dictionary\u someLookup=newdictionary();
^这都是一个领域,甚至还没有接近我见过的最糟糕的领域。您可以在指令部分对它们进行别名,以在实际代码中缩短它们,但无论如何,您都会有一些fat声明

我不知道在命名约定中是否有“错误”的级别数,但肯定有影响。我开始远离这个方法和其他东西。例如,我有一个以它的名称命名的解决方案,并且有一个简短的项目

  • 我的解决方案
    • 项目1
    • 项目2
我很少以这种方式遇到命名冲突,十次中有九次,当我遇到这种情况时,它表明了一个不同的问题;代码真的很臭。那就是我。我还试图停止将目录嵌套得如此之深,因为这些目录通常会成为隐式名称空间。您可以让名称空间与目录结构不匹配,但这通常被认为是不好的做法,并且会让人感到非常困惑。每一个新项目我都在使我的结构越来越扁平


从哲学上讲,我想说的不是将名称空间用作组织设备,而是用作范围界定设备。主要区别在于我们是工程师,我们可以在阳光下组织和重新组织一切,并整天为之争论,但范围界定更为客观。也就是说,在我知道我需要一个范围之前,我不会引入一个新的范围;当我知道发生冲突时,重命名有争议的类比应用范围更糟糕。在这种情况下,“提前解决问题”会变得非常混乱。在工程方面?

Btw,尝试使用
namespace foo{using bar;使用fizz;class buzz{}
而不是
using bar;使用泡沫;名称空间foo{class buzz{}}
。如果一个新开发人员的眼睛开始呆呆地盯着你的类名,那就太深了:)否则,用赞美
@shambulator你称之为理性。这并不能使名称空间的深度嵌套成为一个好的实践,但它有一点帮助。一点帮助,但一点帮助。我没有意识到在范围分辨率上的差异;我认为前者只是意味着你不必在
foo
@shambulator中完全限定名称,但是如果一个新开发人员的眼睛开始对单个名称空间中的类数感到迷茫,同样的原因可能也太浅了。谢谢,这就是我的感受。这只是我想澄清我的想法的其中一次。我实际上是按照同样的思路思考的