He visto muchas veces declaraciones como: "Por favor, convierta esta característica en un ciudadano de primera clase en un lenguaje / plataforma". Por ejemplo, se dice acerca de las enumeraciones en C # /. Net. Entonces, ¿cuándo una característica se considera un "ciudadano de primera clase" en un lenguaje / plataforma de programación?
language-features
Gulshan
fuente
fuente
La noción de "ciudadano de primera clase" o "elemento de primera clase" en un lenguaje de programación fue introducida por el científico informático británico Christopher Strachey en la década de 1960 en el contexto de funciones de primera clase. La formulación más famosa de este principio se encuentra probablemente en Estructura e interpretación de programas de computadora por Gerald Jay Sussman y Harry Abelson:
Básicamente, significa que puede hacer con este elemento del lenguaje de programación todo lo que puede hacer con todos los demás elementos del lenguaje de programación.
Se trata de "igualdad de derechos": puede hacer todo lo anterior con, digamos, números enteros, entonces, ¿por qué debería ser diferente cualquier otra cosa?
La definición anterior es un poco restrictiva en el sentido de que solo habla realmente sobre el aspecto de primera clase en relación con ser objetos del programa. Una definición más general sería que una cosa es de primera clase si puedes hacer todo con ella, también puedes hacer otras cosas similares.
Por ejemplo, los operadores de Java y los métodos de Java son de tipo similar. Puede definir nuevos métodos, puede (de alguna manera) elegir libremente los nombres de sus propios métodos, puede anular los métodos, puede sobrecargar los métodos. James Gosling también puede hacer todo eso con los operadores, pero usted y yo no podemos. Es decir, contrariamente a la creencia popular, Java hace la sobrecarga de operadores de apoyo: por ejemplo, el
+
operador está sobrecargado parabyte
,short
,int
,long
,float
,double
yString
, y IIRC en Java 7 también paraBigInteger
eBigDecimal
(y probablemente un par me olvidó), es sólo que seno tengo ninguna influencia sobre eso. Eso claramente hace que los operadores sean de segunda clase de acuerdo con esta segunda definición. Sin embargo, tenga en cuenta que los métodos todavía no son objetos de primera clase según la primera definición. (¿Eso hace que los operadores sean de tercera clase?)fuente
Por lo general, esto se refiere a una construcción que es aceptable como parámetro, se puede definir como un tipo de retorno de una función o se le puede asignar un valor. Normalmente necesitas poder construirlos en tiempo de ejecución. Por ejemplo, una instancia de una clase sería un ciudadano de primera clase en c ++ o java, pero una función en C no lo sería.
fuente
Yo diría que una característica es un ciudadano de primera clase si se implementa únicamente por el idioma.
es decir, no requiere características de múltiples idiomas o una biblioteca estándar para implementar esa característica.
Ejemplo:
En C / C ++ no considero que las funciones sean ciudadanos de primera clase (otros pueden).
Esto se debe a que hay formas de manipular funciones que son compatibles directamente con el lenguaje pero que requieren el uso de otras características del lenguaje. Los parámetros de enlace a una función no se admiten directamente y debe crear un functor para implementar esta función.
fuente
Para agregar un ejemplo a las respuestas ya proporcionadas:
En WCF / C #, actualmente tiene que marcar un objeto de clase con un atributo de contrato de servicio para que funcione como un servicio. No hay tal cosa como:
Una clase es un ciudadano de primera clase en c #, donde un servicio no lo es.
Espero que esto ayude
fuente