2008-10-17 14 views
39

He encontrado que generalmente hay un tipo de singe o espacio de nombres que toma enum enum 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 localizar tipos de enum?

¿Dónde está el mejor lugar para localizar tipos de enum?

+2

cualquier cosa "mejores prácticas" en relación siempre será subjetiva, pero creo que su compañero de trabajo está mal. .NET Framework no incluye un espacio de nombres de Enums, y por buenas razones. Coloque las enumeraciones en el espacio de nombres al que lógicamente pertenecen. (Y si es apropiado, sí, anótelos en una clase.) –

+7

Hasta que su colega le haya explicado su problema, "estúpido" no es realmente una medida sobre la que usted pueda actuar. –

+0

Dicho así, el compañero de trabajo está equivocado. Si la solución tiene muchos proyectos y las enumeraciones se usan en proyectos múltiples, tiene sentido, tenerlos en un solo lugar. – Bakudan

Respuesta

43

¿Por qué tratar enums 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 yo hago comúnmente se agrupan es delegados - A veces tengo un archivo Delegates.cs con un grupo de delegados en por lo menos con .NET 3.5 y Func/Acción, que mente..

2

¿Qué entorno?

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í.

+0

.NET, pero creo que lo mismo sería válido en C++. – aceinthehole

2

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.

8

Además, los espacios de nombres son para la separación de elementos que pertenecen lógicamente. 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.

1

Tiendo a definirlos, donde su uso es evidente en el evidente. Si tengo un typedef para una estructura que hace uso de ella por alguna razón ...

typedef enum { 
    HI, 
    GOODBYE 
} msg_type; 

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

Por lo general, me parece que la enumeración se centra en torno a una sola clase - como un tipo MyClassOptions de cosas.

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 
    { 
    } 
} 
4

por lo general tratan de poner todas mis diferentes tipos (clases, interfaces y enumeraciones) en sus propios archivos, independientemente de lo pequeños que son. 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. He descubierto que casi cada vez que pongo un tipo "simple" de esa clase en otra clase, termino añadiéndolo o reutilizándolo de forma 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é desarrollando. En general, trato de imitar la convención del framework .NET.

4

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.

4

Creo que pones 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 usado 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é sucede si decide cambiar el RGB de rojo en los objetos Cirle pero no desea cambiar el rojo para los objetos de ColorBox? Encapsular sus propiedades permite esto.

2

Utilizo 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.

Así que en el archivo de cabecera de enumeración que se obtiene:

// MyEnumHeader.h 
// Consolidated enum header file for this dll,lib,subsystem whatever. 
namespace MyApp 
{ 
    namespace MyEnums 
    { 
    enum SomeEnum { EnumVal0, EnumVal1, EnumVal2 }; 
    }; 
}; 

Y a continuación, en el archivo de cabecera de la clase que se obtiene:

// 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 uso como muchos archivos de cabecera como enumeración tiene 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ó antes, en el código externo se puede utilizar lo siguiente:

using namespace MyApp::MyEnums; 
Cuestiones relacionadas