哪里是查找枚举types的最佳位置?
我发现通常有一个单一的types或命名空间,将任何特定的枚举作为参数,因此我总是在那里定义那些枚举。 但是最近我有一个同事做了一件大事,那就是一个愚蠢的事情,你应该总是在项目的根目录有一个枚举命名空间,在这个命名空间中定义你所有的枚举types。
哪里是查找枚举types的最佳位置?
为什么把枚举对待其他types呢? 保持它们在可能被使用的同一个命名空间中,并假设它们将被其他类使用,使它们在它们自己的文件中成为顶级types。
我常常聚集在一起的唯一types是委托 – 我有时会有一个委托的Delegates.cs文件。与.NET 3.5和Func / Action一样,请注意。
另外,命名空间是为了逻辑上把属于一个事物分离开来的。 并不是所有的类都属于同一个名字空间,只是因为它们是类。 同样,并不是所有的枚举都属于同一个命名空间,只是因为它们是枚举。 把他们在逻辑上属于他们的代码。
我通常会尝试将所有不同的types(类,接口和枚举)放在自己的文件中,而不pipe它们多小。 它只是使查找和pipe理它们所在的文件变得更加容易,特别是如果您不在Visual Studio中,并且具有可用的“定义”function。 我发现,几乎每次我在其他类中放入一个“简单”types的types时,我最终都会在之后添加它,或者以不再有意义的方式重用它有它自己的文件。
至于哪个命名空间,这取决于你正在开发的任何devise。 一般来说,我试图模仿.NET框架的惯例。
我试着把所有与课堂相关的东西都放在课堂上。 这不仅包括枚举,而且包括常量。 我不想在别处search包含枚举的文件或类。 在有很多类和文件夹的大型应用程序中,放置枚举文件的位置并不总是很明显,因此很容易find。
如果枚举如果在几个紧密相关的类中使用,那么可以创build一个基类,以便在那里共享像枚举这样的常见types。
当然,如果一个枚举实际上是通用的并被广泛使用,那么您可能需要为它们创build一个单独的类以及其他通用实用程序。
我想你会把Enums和Constants放在类中去消耗它们,或者使用它们来控制代码的决定,并且使用代码完成来find它们。 这样,你不必记得他们在哪里,他们与class级相关联。 所以例如,如果我有一个ColoredBox类,那么我不必考虑他们在哪里。 他们将是ColoredBox的一部分。 ColoredBox.Colors.Red,ColoredBox.Colors.Blue等。我认为枚举和常量作为该类的属性或描述。 如果它被多个类使用,并且没有一个类占上风,那么有一个枚举类或常量类是合适的。 这遵循封装的规则。 从不同的类中分离属性。 如果您决定更改Cirle对象中的红色RGB,但不想更改ColoredBox对象的红色,该怎么办? 封装他们的属性使这个。
什么环境?
在.NET中,我通常会创build一个空的类文件,将其重命名为MyEnum或任何表示它持有我的枚举,只是在那里声明。
如果我的枚举有任何机会在课堂外使用,我打算使用它,我创build一个单独的源文件的枚举。 否则,我会把它放在我打算使用它的课程里面。
通常我会发现枚举以一个类为中心 – 作为MyClassOptionstypes的东西。
在这种情况下,我将枚举放置在与MyClass相同的文件中,但在命名空间中,但在类之外。
namespace mynamespace { public partial class MyClass { } enum MyClassOptions { } }
我为此使用嵌套命名空间。 我比他们更喜欢他们比放在一个类中的枚举,因为在课堂之外,你必须使用完整的MyClass :: MyEnum用法,即使MyEnum不会与范围内的其他任何东西冲突。
通过使用嵌套名称空间,可以使用“using”语法。 此外,我会把关系到一个给定的子系统的枚举在他们自己的文件中,所以你不会得到依赖问题,不得不包括世界使用它们。
所以在枚举头文件中你得到:
// MyEnumHeader.h // Consolidated enum header file for this dll,lib,subsystem whatever. namespace MyApp { namespace MyEnums { enum SomeEnum { EnumVal0, EnumVal1, EnumVal2 }; }; };
然后在类头文件中得到:
// MyInterfaceHeader.h // Class interfaces for the subsystem with all the expected dependencies. #include "MyEnumHeader.h" namespace MyApp { class MyInterface { public: virtual void DoSomethingWithEnumParam (MyEnums::SomeEnum enumParam) = 0; }; };
或者使用尽可能多的枚举头文件。 我喜欢让它们与类标题分开,因此枚举可以是系统中其他地方的参数,而不需要类标题。 那么如果你想在其他地方使用它们,你不必像封装类一样在封装类中声明。
如前所述,在外部代码中,您可以使用以下内容:
using namespace MyApp::MyEnums;
我倾向于定义它们,在明显的地方它们的使用是显而易见的。 如果我有一个由于某种原因使用它的结构typedef …
typedef enum { HI, GOODBYE } msg_type; typdef struct { msg_type type; union { int hivar; float goodbyevar; } } msg;