Tipo enumerado

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 19 de mayo de 2014; las comprobaciones requieren 12 ediciones .

Tipo enumerado ( enumeración abreviada , ing.  enumeración, tipo enumerado ) - en tipo de datos de programación , cuyo conjunto de valores es una lista limitada de identificadores.

Descripción y uso

Un tipo enumerado se define como un conjunto de identificadores que, desde el punto de vista del lenguaje, desempeñan el mismo papel que las constantes regulares con nombre, pero están asociadas con ese tipo. La descripción clásica de un tipo de enumeración en Pascal es la siguiente:

tipo Cardsuit = ( tréboles , diamantes , corazones , picas ) ;

Aquí, se declara el tipo de datos Cardsuit, cuyos valores pueden ser cualquiera de las cuatro constantes enumeradas. Una variable de tipo Cardsuitpuede tomar uno de los valores clubs, diamonds, hearts, spades, se permite comparar valores de tipo enumeración para igualdad o desigualdad, así como usarlos en declaraciones de selección (en Pascal - case) como valores que identifican opciones.

El uso de enumeraciones permite hacer más legibles los códigos fuente de los programas, ya que permiten reemplazar los "números mágicos" que codifican ciertos valores con nombres legibles.

Sobre la base de enumeraciones en algunos idiomas, se pueden crear juegos de tipos . En tales casos, un conjunto se entiende (y se describe) como una colección desordenada de valores únicos de un tipo de enumeración.

Un tipo enumerado se puede utilizar en declaraciones de variables y parámetros formales de funciones (procedimientos, métodos). Los valores de un tipo enumerado se pueden asignar a las variables correspondientes y pasar a través de parámetros de los tipos correspondientes en funciones. Además, siempre se admite la comparación de los valores enumerados para la igualdad y la desigualdad. Algunos idiomas también admiten otros operadores de comparación para valores de tipos enumerados. El resultado de comparar dos valores enumerados en tales casos está determinado, por regla general, por el orden de estos valores en la declaración de tipo: el valor que aparece antes en la declaración de tipo se considera "menor" que el valor que ocurre más tarde. A veces, un tipo enumerado o algún rango de valores de un tipo enumerado también se puede usar como un tipo de índice para una matriz. En este caso, hay un elemento en la matriz para cada valor del rango seleccionado, y el orden real de los elementos corresponde al orden de los valores en la declaración de tipo.

Implementación

Normalmente, durante la compilación, los valores de enumeración se representan mediante números enteros. Dependiendo del lenguaje de programación específico, dicha representación puede estar completamente oculta para el programador, o estar disponible para él usando ciertas "soluciones alternativas" (por ejemplo, conversión forzada de un valor de tipo enumeración a un valor de tipo "entero"), o incluso controlado por el programador (en tales casos, el programador tiene la oportunidad de especificar explícitamente con qué números se codificarán todos o algunos valores del tipo enum. Todas las opciones tienen sus aspectos positivos y negativos. Por un lado, la posibilidad de utilizar los valores numéricos de las constantes que componen el tipo de enumeración, especialmente cuando se abusa, priva del uso de estos tipos y crea el peligro de errores (al utilizar valores numéricos para que no hay constantes correspondientes en el tipo). Por otro lado, la gestión de valor explícito proporciona algunas características adicionales. Por ejemplo, permite usar tipos enum al organizar una interfaz con módulos escritos en otros lenguajes, si usan o devuelven valores codificados en enteros de algún conjunto predefinido.

Otra posibilidad que brindan los tipos enumerados en el nivel de implementación del lenguaje es el ahorro de memoria. Con una pequeña cantidad de tipo de enumeración, unos pocos bits son suficientes para almacenar un valor de este tipo (el tipo anterior Cardsuitrequiere solo dos bits por valor, mientras que un número entero estándar en la mayoría de las arquitecturas utilizadas requiere 32 bits, 16 veces más), y el El compilador puede usar este hecho para compactar el almacenamiento de datos en la memoria. Esto puede ser especialmente importante si se almacenan múltiples valores de tipos de enumeración en un solo registro: compactar registros cuando se procesan grandes cantidades de ellos puede liberar mucha memoria. Los compiladores no suelen implementar esta característica, al menos no en los últimos tiempos, cuando la memoria de la computadora se ha vuelto mucho más barata.

Crítica

El tipo de enumeración es tradicional para los lenguajes de programación desarrollados, se usa bastante y, a menudo, se da por sentado. Sin embargo, este tipo tampoco está exento de críticas por parte de teóricos y practicantes de la programación. Entonces, al desarrollar el lenguaje de programación Oberon , los tipos enumerados se incluyeron en la lista de funciones que se eliminaron del lenguaje. Niklaus Wirth , el diseñador del lenguaje, citó las siguientes razones:

  • “en un número cada vez mayor de programas, el uso mal concebido de las enumeraciones... conduce a una explosión demográfica entre los tipos, lo que, a su vez, conduce no a la claridad de los programas, sino a la verbosidad” [1] ;
  • cuando un módulo exporta un tipo de enumeración (es decir, se convierte en parte de una interfaz ), se viola la regla general: el comando type export exporta simultáneamente todos sus elementos, mientras que para todos los demás tipos, type export oculta su estructura interna;
  • Desde el punto de vista de la legibilidad del programa, no hay nada que le impida usar solo un grupo de constantes nombradas codefinidas en lugar de un tipo enumerado, especialmente en presencia de mecanismos de lenguaje como módulos o clases.

Por otro lado, por ejemplo, en Java , que inicialmente no contenía un tipo enumerado, este tipo se introdujo posteriormente por razones no solo de conveniencia, sino también de confiabilidad: el problema de usar grupos de constantes nombradas en lugar de enumeraciones es que no No hay control por parte del compilador en cuanto a la unicidad de los valores de las constantes, así como la posibilidad de asignar aleatoriamente valores a variables que no correspondan a ninguna de estas constantes.

Descripción de las enumeraciones en varios idiomas

Adá

En el lenguaje Ada, las enumeraciones se especifican mediante una palabra clave isseguida de una lista de valores separados por comas:

el tipo Cardsuit es ( tréboles , diamantes , corazones , picas );

C y lenguajes con sintaxis tipo C

El dialecto K&R original de C no tenía tipos enumerados, sin embargo, se agregaron en el estándar ANSI C.

juego de cartas enum { CLUBES , DIAMANTES , CORAZONES , ESPADAS };

Los lenguajes dinámicos, débilmente tipificados con sintaxis similar a C (como Perl o JavaScript ) generalmente no tienen enumeraciones.

C++

Las enumeraciones de C++ heredan directamente el comportamiento de las enumeraciones de C, excepto que el tipo enumerado en C++ es un tipo real y la palabra clave enumsolo se usa cuando se declara dicho tipo. Si, al procesar un parámetro que es una enumeración, no se procesa ningún valor de la enumeración (por ejemplo, se olvidó procesar uno de los elementos de la enumeración en la construcción switch), entonces el compilador puede emitir una advertencia sobre el valor olvidado. [2]

C++11 proporciona un segundo tipo de enumeración de tipo seguro que no se puede convertir implícitamente en un tipo integral. Esto se define por la frase "clase de enumeración". Por ejemplo:

enum clase Color { Rojo , Verde , Azul };

Un tipo base es una implementación de cierto tipo integral que es lo suficientemente grande como para contener todos los valores enumerados (¡no tiene que ser el tipo más pequeño posible!). En C++, puede especificar el tipo base directamente. Esto permite "declaraciones hacia adelante" de enumeraciones:

clase de enumeración Color : largo { Rojo , Verde , Azul }; // debe coincidir con el tamaño y el diseño de la clase de enumeración de tipo de memoria "largo" Formas : char ; // declaración preliminar. Si luego se definen valores que no caben en 'char', esto es un error. C# enum Cardsuit { Tréboles , Diamantes , Picas , Corazones } Java

En el Java original, no había enumeraciones; en su lugar, se proponía utilizar clases con constantes estáticas. Dado que las enumeraciones de la versión 5 (1.5) se han introducido en el lenguaje, son una clase completa en la que puede agregar una cantidad arbitraria de campos y métodos. Se introdujeron enumeraciones para mejorar el control de seguridad de tipos. [3]

enum Cardsuit { Tréboles , Diamantes , Picas , Corazones } Kotlin enum class Dirección { NORTE , SUR , OESTE , ESTE }

Haskell

En algunos lenguajes de programación (por ejemplo, Haskell), las enumeraciones se pueden emular usando tipos algebraicos . Por ejemplo, un tipo booleano que contiene dos identificadores para representar valores de verdad se codifica así:

datos Bool = Falso | Verdadero

Nim

escriba enumType = enum uno , dos , tres var a : enumType = tres var b = dos echo a > b

Vale

//Enumeración regular enum Colores { VERDE = 1 , AZUL , ROJO } // Enumeración de banderas [ Banderas ] enum Bordes { IZQUIERDA , DERECHA , ARRIBA , ABAJO } void dibujar_bordes ( Bordes bordes_seleccionados ) { // equivalente a: if ((Borders.LEFT & selected_borders) > 0) if ( Borders . LEFT in selected_borders ) { } }

solidez

solidez pragmática ^ 0.4.4 ; contrato SimpleEnum { enum SomeData { DEFAULT , ONE , TWO } SomeData someData ; función SimpleEnum (){ someData = SomeData . DEFECTO ; } función setValues ​​​​( uint _value ){ require ( uint ( SomeData . TWO ) >= _value ); algunosDatos = AlgunosDatos ( _value ); } función getValue () constante devuelve ( uint ) { return uint ( someData ); } }


Notas

  1. N. With. De Modula a Oberón . Consultado el 17 de abril de 2008. Archivado desde el original el 19 de septiembre de 2011.
  2. Enumeraciones en C++ (tipos de enumeración de c++) . Consultado el 20 de abril de 2009. Archivado desde el original el 16 de abril de 2009.
  3. Enumeraciones . Consultado el 13 de febrero de 2008. Archivado desde el original el 27 de febrero de 2008.