Где лучше всего найти типы перечислений? - PullRequest
39 голосов
/ 18 октября 2008

Я обнаружил, что, как правило, существует отдельный тип или пространство имен, которое принимает любое конкретное перечисление в качестве параметра, и в результате я всегда определял эти перечисления там. Однако недавно я попросил коллегу позаботиться о том, чтобы это было глупо, и у вас всегда должно быть пространство имен enum в корне вашего проекта, где вы определяете все типы enum.

Где лучше всего найти типы перечислений?

Ответы [ 10 ]

43 голосов
/ 18 октября 2008

Зачем относиться к перечислениям иначе, чем к другим типам? Держите их в том же пространстве имен, в котором они, вероятно, будут использоваться - и, предполагая, что они будут использоваться другими классами, сделайте их типами верхнего уровня в своих собственных файлах.

Единственный тип типа, который я делаю , обычно объединяем вместе, это делегаты - у меня иногда есть файл Delegates.cs с кучей делегатов. Менее так с .NET 3.5 и Func / Action, помните вы.

8 голосов
/ 18 октября 2008

Кроме того, пространства имен предназначены для разделения вещей, которые логически связаны друг с другом. Не все классы принадлежат одному и тому же пространству имен только потому, что они являются классами. Аналогично, не все перечисления принадлежат одному и тому же пространству имен только потому, что они являются перечислениями. Поместите их с кодом, которому они логически принадлежат.

4 голосов
/ 14 июля 2010

Я думаю, что вы помещаете Enums и Constants в класс, который их использует или использует их для наибольшего контроля над решениями кода, и вы используете завершение кода для их поиска. Таким образом, вы не должны помнить, где они находятся, они связаны с классом. Например, если у меня есть класс ColoredBox, мне не нужно думать о том, где он находится. Они будут частью ColoredBox. ColoredBox.Colors.Red, ColoredBox.Colors. Blue и т. Д. Я Я думаю о перечислении и константе как о свойстве или описании этого класса. Если он используется несколькими классами и ни один класс не является верховным, тогда целесообразно иметь класс enum или класс констант. Это следует правилам инкапсуляции. Изоляция свойств от разнородных классов. Что если вы решите изменить RGB Red в объектах Cirle, но Вы не хотите менять красный цвет для объектов ColoredBox? Инкапсуляция их свойств позволяет это.

4 голосов
/ 18 октября 2008

Я стараюсь поместить все, что связано с классом, в класс. Это включает в себя не только перечисления, но и константы. Я не хочу искать в другом месте файл или класс, содержащий перечисления. В большом приложении с большим количеством классов и папок не всегда будет очевидно, куда поместить файл enum, поэтому его будет легко найти.

Если перечисление используется в нескольких тесно связанных классах, вы можете создать базовый класс, чтобы общие типы, такие как перечисления, были там общими.

Конечно, если enum действительно универсальный и широко используется, вы можете создать отдельный класс для них вместе с другими универсальными утилитами.

4 голосов
/ 18 октября 2008

Я обычно стараюсь помещать все свои разные типы (классы, интерфейсы и перечисления) в свои собственные файлы, независимо от их размера. Это значительно упрощает поиск и управление файлом, в котором они находятся, особенно если вы не оказались в Visual Studio и не имеете доступной функции «перейти к определению». Я обнаружил, что почти каждый раз, когда я помещаю «простой» тип, подобный этому, в другой класс, я в конечном итоге либо добавляю его позже, либо использую его повторно таким образом, чтобы он больше не имел смысла иметь свой собственный файл.

Что касается пространства имен, оно действительно зависит от дизайна того, что вы разрабатываете. В общем, я пытаюсь имитировать соглашение .NET Framework.

2 голосов
/ 19 июля 2012

Я использую для этого вложенные пространства имен. Мне они нравятся больше, чем помещать перечисление в класс, потому что вне класса вы должны использовать полное использование MyClass :: MyEnum, даже если MyEnum не собирается конфликтовать с чем-либо еще в области видимости.

Используя вложенное пространство имен, вы можете использовать синтаксис «using». Также я помещу перечисления, которые относятся к данной подсистеме, в их собственный файл, чтобы у вас не возникало проблем с зависимостью от необходимости включать мир для их использования.

Итак, в заголовочном файле enum вы получите:

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

Или используйте столько заголовочных файлов enum, сколько имеет смысл. Мне нравится держать их отдельно от заголовков классов, чтобы перечисления могли быть параметрами в других частях системы без необходимости использования заголовков классов. Затем, если вы хотите использовать их где-то еще, вам не нужно иметь определения инкапсулирующего класса, как если бы перечисления были объявлены внутри классов.

И, как упоминалось ранее, во внешнем коде вы можете использовать следующее:

using namespace MyApp::MyEnums;
2 голосов
/ 18 октября 2008

Обычно я нахожу, что перечисление сосредоточено вокруг одного класса - как вещи типа MyClassOptions.

В этом случае я помещаю enum в тот же файл, что и MyClass, но внутри пространства имен, но вне класса.

namespace mynamespace
{
  public partial class MyClass
  {
  }
  enum MyClassOptions
  {
  }
}
2 голосов
/ 18 октября 2008

Если у моего перечисления есть шанс когда-либо использоваться вне класса, который я собираюсь использовать, я создаю отдельный исходный файл для перечисления. В противном случае я помещу его в класс, который собираюсь использовать.

2 голосов
/ 18 октября 2008

Какая среда?

В .NET я обычно создаю пустой файл класса, переименовываю его в MyEnum или что-то еще, чтобы указать, что он содержит мое перечисление, и просто объявляю его там.

1 голос
/ 18 октября 2008

Я склонен определять их, где их использование очевидно в очевидном. Если у меня есть typedef для структуры, которая использует его по какой-то причине ...

typedef enum {
  HI,
  GOODBYE
} msg_type;

typdef struct {
 msg_type type;
 union {
   int hivar;
   float goodbyevar;
  }
} msg;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...