在目录中组织命名空间和 类

Organizing namespaces and classes in directories

当我将 class 文件放入文件夹时,Resharper 建议我更新命名空间。因此,如果我有文件 Classes/Game.cs (Class),它将建议命名空间 MyApplication.Classes.

问题是我也有一个名为 Game 的子文件夹,其中包含 Game class 的组件。它与名称空间相冲突。例如:

/Classes/Game.cs                   MyApplication.Classes.{Game}
/Classes/Game/Version.cs           MyApplication.Classes.Game.{Version}

扭转这一局面的最佳方法是什么?

目前我是这样组织的:

/Classes/Game/Game.cs              MyApplication.Classes.Game.{Class}
/Classes/Game/Player.cs            MyApplication.Classes.Game.{Player}
/Classes/Game/Version/Version.cs   MyApplication.Classes.Game.Version.{Class}
/Classes/Game/Version/History.cs   MyApplication.Classes.Game.Version.{History}

所以请注意,我将 "main" class 重命名为 Class 以避免冲突,但我在文件名中保留了更准确的名称。但是很丑不是吗?

首先,名为 "Classes" 的文件夹似乎没有什么特别的用处 - 毕竟一切都是 class,这似乎没有给您任何有用的信息。

如果您希望保留此命名方案,则有两种选择。第一个是禁用 Resharper 的建议 - 或者至少告诉 R# 将它们视为提示,而不是警告。

第二个是为您的文件夹指定一个不是有效命名空间声明的名称。这将使 R# 停止将其建议为有效的命名空间。我最常看到和使用的格式是在名称周围使用方括号。所以你有一个像这样的文件夹层次结构:

/Classes/Game.cs
/Classes/[Game]/Version.cs

等在这种情况下,R# 将建议 "MyApplication.Classes" 作为游戏和版本 classes.

的命名空间

NET: Best Practices/guidelines for dividing namespaces between files?

的这个答案开始

虽然每个项目,甚至每个游戏,就结构而言都会有所不同,但有一些事情会有所帮助。

您应该问的第一件事是这将是一个多大的项目。如果您不知道,请从项目的根命名空间中的所有内容开始,直到弄清楚,然后再进行重构。不要在可以学习的时候浪费时间组织,因为很可能你不需要它,或者一旦你弄明白了就需要彻底改变它。

一旦您知道您的项目将大到需要大量命名空间,您还应该知道它需要什么样的结构。如果是 entity-component oriented,就像现在大多数大型游戏一样,您可能希望使用 folder/namespace 结构,例如

MyProjectName                          # System classes, like Game1
             .Components               # Base component definitions
                        .Controllers
                        .Physics
                        .Renderers
             .Entities                 # Base entity definition and player entity
                      .Enemies
                      .Powerups
    ...

它也有助于处理其他人的代码。通过尝试在不熟悉的代码中查找功能,您将学到很多关于组织的知识。

我组织文件的策略是不仅将它们放在命名空间内,而且通常将它们放在不充当命名空间但有助于组织文件的子文件夹中。我在这些文件夹前加上下划线 _。如果您使用 R#,则应将文件夹 属性 Namespace Provider 设置为 false。如果添加新文件,请记住从命名空间中删除 _Folder,因为 Visual Studio 会自动添加它。

这是一个例子:

MyProject
    Properties
    References
    _Impl
    App.config
    package.config

首先,我将整个实现放在 _Impl 文件夹中,因为我不喜欢散落在项目各处的文件。

接下来在 _Impl 文件夹中,如果我认为没有理由创建新的命名空间,我可能会使用更多下划线 _ 文件夹,但是像 [=22= 这样将文件放在一起是有意义的] 或 _Enums_Attributes:

MyProject
    Properties
    References
    _Impl
        _Attributes
           MyAttribute.cs
        _Exceptions
            MyExtpion.cs
            MyAnotherException.cs
        _Extensions
            MyExtensions1.cs
            MyExtensions2.cs
        SomeClass.cs
        SomeOtherClass.cs
    App.config
    package.config

作为命名空间,下划线 _ 文件夹没有多大意义,但它们允许将文件放在一起以用于组织目的。

否则我会看起来像这样:

MyProject
    Properties
    References
    MyAttribute.cs
    MyExtpion.cs
    MyAnotherException.cs
    App.config
    package.config
    SomeClass.cs
    SomeOtherClass.cs

MyProject.Test单元测试中我也使用这个系统:

MyProject.Tests
    Properties
    References
    _Impl // only tests
        _Attributes
           MyAttributeTests.cs
        _Exceptions
            MyExtpionTests.cs
            MyAnotherExceptionTests.cs
        SomeClassTests.cs
        SomeOtherClassTests.cs
    _TestHelpers // here I'll put any supporting classes
        SomeTestHelper.        
    App.config
    package.config