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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Какая среда?

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

Ответ 7

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

Ответ 8

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

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

namespace mynamespace
{
  public partial class MyClass
  {
  }
  enum MyClassOptions
  {
  }
}

Ответ 9

Я использую вложенные пространства имен для этого. Мне они нравятся лучше, чем помещать enum в класс, потому что вне класса вы должны использовать полное использование 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;
  };
};

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

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

using namespace MyApp::MyEnums;

Ответ 10

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

typedef enum {
  HI,
  GOODBYE
} msg_type;

typdef struct {
 msg_type type;
 union {
   int hivar;
   float goodbyevar;
  }
} msg;