2015-02-22 64 views
2

当我将一个类文件放到一个文件夹中时,Resharper建议我更新命名空间。所以如果我有文件Classes/Game.cs(Class),它会提示命名空间MyApplication.Classes组织目录中的命名空间和类

问题是我也有一个名为Game的子文件夹,它有Game类的组件。它与命名空间混淆。例如:

/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} 

因此请注意,我的“主”类重命名为Class避免冲突,但我在文件名保持一个更准确的名字。但它很丑,不是吗?

+1

真正的问题是*为什么*您有这些子文件夹中的所有? – 2015-02-22 09:56:58

回答

5

首先,一个名为“Classes”的文件夹似乎并不特别有用 - 在al之后,一切都是一个类,而这似乎并没有给你任何有用的信息。

如果你想保留这个命名方案,但有两种选择。首先是禁用Resharper的建议 - 或者至少告诉R#将它们视为提示,而不是警告。

其次是给你的文件夹一个不是有效的命名空间声明的名称。这将使R#不再建议它作为有效的命名空间。我最常见到和使用的格式是在名称周围使用方括号。所以,你有一个文件夹层次结构是这样的:

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

等。在这种情况下,R#会提示“MyApplication.Classes”作为命名空间同时为游戏和版本的类。

2

开始与这个答案NET: Best Practices/guidelines for dividing namespaces between files?

虽然每个项目,甚至每一场比赛,是要改变尽可能去结构有一些事情,帮助。

你应该问的第一件事是这将是多大的一个项目。如果你不知道,从你的项目的根名称空间开始,直到找出它,然后才重构。当你可以学习时,不要浪费时间进行组织,因为你有可能不需要它,或者一旦你明白了就需要从根本上改变它。

一旦你知道你的项目将会大到需要大量的命名空间,你也应该知道它需要什么样的结构。如果是entity-component oriented,因为大多数大型游戏现在,你可能会想使用一个文件夹/命名空间结构像

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

这也有助于在别人的代码工作。通过尝试在不熟悉的代码中查找功能,您将学到很多有关组织的知识。

1

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

下面是一个例子:

MyProject 
    Properties 
    References 
    _Impl 
    App.config 
    package.config 

首先,我把整个实施_Impl文件夹内,因为我不喜欢那些散落各地的项目文件。

接下来在_Impl文件夹中我可能会使用更多强调_文件夹,如果我看不出有任何理由来创建一个新的命名空间,但它会是有意义的把文件在一起,就像_Exceptions_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