首先,让我们同意命名空间应该与文件夹结构相匹配,并且每个语言工件都应该在自己的文件中。
(请参阅解决方案中的文件夹是否应与命名空间匹配?)。
下一个问题是如何在磁盘上实际组织文件夹。
假设我在 ABC 命名空间中有 ClassC,在 ABCD 命名空间中有 ClassD。
我们还假设每个命名空间都内置在自己的程序集(项目)中,并且命名空间根据公认的最佳实践从右到左具有依赖关系(ABCD 可以依赖于 ABC,而 ABC 可以依赖于 AB,而 AB 又可以依赖于 A)。我很欣赏每个命名空间不必位于单独的程序集中,但在一般情况下,我们将在单独的程序集中有一些命名空间,我的示例说明了这一点。
我可以看到(至少)两种创建文件夹树的方法——我称之为“嵌套文件夹”和“平面文件夹”:
1 - 嵌套文件夹:
A
--A.csproj --B
----ABcsproj
----
C
------ABCcsproj
------classC.cs
------D
-------- ABCDcsproj
--------classD.cs
或者
2 – 平面文件夹:
A
--A.csproj
AB
--ABcsproj
ABC
--ABCcsproj
--classC.cs
ABCD
--ABCDcsproj
--classD.cs
你会看到我已经做了一些假设:
- 每个项目文件都有一个基于命名空间的完全限定名称 (FQN)。
- 每个类文件使用一个非 FQN
嵌套文件夹看起来更自然(我们都喜欢层次结构),但在大型解决方案中可能更难导航:
当您在 VS 中查看解决方案时,它会显示项目的平面列表,而不是嵌套视图。这看起来更像是“平面文件夹”,因此组织磁盘上的文件夹以匹配 VS 中的视图可能会有好处。
如果您查看磁盘上的每个文件夹,您将看到该项目的文件夹 artefacts 以及命名空间的子文件夹:以 C 为例:
C
--bin
--D
--obj
--Properties
--ABCcsproj
--classC.cs
根据 D 的真实名称,D 是名称空间文件夹而不是 C 名称空间中的组织文件夹可能并不明显。
我知道我们从 .NET(8 或 9 年前)和 Java 的第一天起就有文件夹和命名空间,但是,就个人而言,我们似乎还没有就大型项目的最佳实践组织达成共识解决方案。我真的很想知道你们的想法。
谢谢
迈克尔