enums - que - ¿Dónde está el mejor lugar para ubicar tipos de enum?
que es un enum en java (10)
¿Por qué tratar las enumeraciones de manera diferente a otros tipos? Manténgalas en el mismo espacio de nombres que puedan usarse, y suponiendo que vayan a ser utilizadas por otras clases, conviértelos en tipos de primer nivel en sus propios archivos.
El único tipo de tipo que normalmente agrupo es el de los delegados. A veces tengo un archivo Delegates.cs con un grupo de delegados. Menos con .NET 3.5 y Func / Action, eso sí.
He descubierto que generalmente hay un tipo de singe o espacio de nombres que toma cualquier enumeración particular como parámetro y como resultado siempre he definido esas enumeraciones allí. Sin embargo, recientemente hice que un compañero de trabajo hiciera una gran oferta acerca de cómo era una cosa estúpida, y siempre debería tener un espacio de nombres enum en la raíz de su proyecto donde definiera todos sus tipos enum.
¿Dónde está el mejor lugar para ubicar tipos de enum?
¿Qué ambiente?
En .NET normalmente creo un archivo de clase vacío, lo cambio de nombre a MyEnum o lo que sea para indicar que contiene mi enumeración y simplemente lo declaro allí.
Además, los espacios de nombres son para la separación de las cosas que pertenecen lógicamente juntas. No todas las clases pertenecen al mismo espacio de nombres solo porque son clases. Del mismo modo, no todas las enumeraciones pertenecen al mismo espacio de nombres solo porque son enumeraciones. Póngalos con el código al que pertenecen lógicamente.
Generalmente intento poner todos mis diferentes tipos (clases, interfaces y enumeraciones) en sus propios archivos, sin importar cuán pequeños sean. Simplemente hace que sea mucho más fácil encontrar y administrar el archivo en el que se encuentran, especialmente si no está en Visual Studio y tiene la función "ir a definición" disponible. Descubrí que casi cada vez que pongo un tipo "simple" de esa clase en otra clase, termino añadiéndolo más adelante o reutilizándolo de manera que ya no tiene sentido que no lo haga tener su propio archivo
En cuanto a qué espacio de nombres, realmente depende del diseño de lo que sea que estés desarrollando. En general, trato de imitar la convención del framework .NET.
Intento poner todo lo relacionado con una clase en la clase. Eso incluye no solo enumeraciones, sino también constantes. No quiero ir a buscar en otro lado el archivo o la clase que contiene las enumeraciones. En una aplicación grande con muchas clases y carpetas, no siempre sería obvio dónde colocar el archivo enum para que sea fácil de encontrar.
Si la enumeración se usa en varias clases estrechamente relacionadas, puede crear una clase base para que los tipos comunes como las enumeraciones se compartan allí.
Por supuesto, si una enumeración es realmente genérica y ampliamente utilizada, es posible que desee crear una clase separada para ellos, junto con otras utilidades genéricas.
Si mi enumeración tiene alguna posibilidad de ser utilizada fuera de la clase que tengo la intención de usar, creo un archivo fuente separado para la enumeración. De lo contrario, lo ubicaré dentro de la clase que pretendo usarlo.
Tiendo a definirlos, donde su uso es evidente en lo evidente. Si tengo un typedef para una estructura que hace uso de él por alguna razón ...
typedef enum {
HI,
GOODBYE
} msg_type;
typdef struct {
msg_type type;
union {
int hivar;
float goodbyevar;
}
} msg;
Usualmente encuentro que la enumeración se centra alrededor de una sola clase, como un tipo de cosas de MyClassOptions.
En ese caso, coloco la enumeración en el mismo archivo que MyClass, pero dentro del espacio de nombres pero fuera de la clase.
namespace mynamespace
{
public partial class MyClass
{
}
enum MyClassOptions
{
}
}
Creo que colocas Enums y Constants en la clase que los consume o que los usa para controlar las decisiones de código más y usas la finalización del código para encontrarlos. De esa manera no tienes que recordar dónde están, están asociados con la clase. Entonces, por ejemplo, si tengo una clase de ColoredBox, entonces no tengo que pensar en dónde están. Serían parte de ColoredBox. ColoredBox.Colors.Red, ColoredBox.Colors.Blue, etc. I Pienso en la enumeración y constante como una propiedad o descripción de esa clase. Si es utilizado por múltiples clases y ninguna clase reina suprema, entonces es apropiado tener una clase enum o una clase de constantes. Esto sigue las reglas de encapsulación. Aislar propiedades de clases diferentes. ¿Qué ocurre si decide cambiar el RGB de rojo en objetos Cirle pero no desea cambiar el rojo para los objetos de ColorBox? Encapsular sus propiedades permite esto.
Yo uso espacios de nombres anidados para esto. Me gusta más que poner la enumeración dentro de una clase porque fuera de la clase tienes que usar el uso completo de MyClass :: MyEnum incluso si MyEnum no va a chocar con otra cosa en el alcance.
Al usar un espacio de nombres anidado, puede usar la sintaxis "using". También pondré enums que se relacionan con un subsistema dado en su propio archivo para que no tengas problemas de dependencia al tener que incluir el mundo para usarlos.
Entonces, en el archivo de encabezado enum obtienes:
// MyEnumHeader.h
// Consolidated enum header file for this dll,lib,subsystem whatever.
namespace MyApp
{
namespace MyEnums
{
enum SomeEnum { EnumVal0, EnumVal1, EnumVal2 };
};
};
Y luego en el archivo de encabezado de clase obtienes:
// 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;
};
};
O use tantos archivos de encabezado enum como tenga sentido. Me gusta mantenerlos separados de los encabezados de clase para que las enumeraciones puedan ser params en cualquier parte del sistema sin necesidad de los encabezados de clase. Entonces, si desea usarlos en otro lugar, no tiene que tener la clase de encapsulamiento definida como lo haría si las enumeraciones se declararan dentro de las clases.
Y como se mencionó anteriormente, en el código externo puede usar lo siguiente:
using namespace MyApp::MyEnums;