¿Cuándo se considera que una característica es un "ciudadano de primera clase" en un lenguaje / plataforma de programación?

60

He visto muchas veces afirmaciones como: "Por favor, haga de esta característica un ciudadano de primera clase en tal y tal idioma / plataforma". Por ejemplo, se dice acerca de enumeraciones en C # / .net. Entonces, ¿cuándo se considera una característica un "ciudadano de primera clase" en un lenguaje / plataforma de programación?

    
pregunta Gulshan 25.01.2011 - 05:53

5 respuestas

39
  

Definición

     

Un objeto es de primera clase cuando   it:

     
  • se puede almacenar en variables y estructuras de datos
  •   
  • se puede pasar como un parámetro a una subrutina
  •   
  • puede devolverse como resultado de una subrutina
  •   
  • se puede construir en tiempo de ejecución
  •   
  • tiene una identidad intrínseca (independiente de cualquier nombre)
  •   

Se utiliza el término "objeto"   vagamente aquí, no necesariamente   refiriéndose a objetos en   programación orientada a objetos. los   tipos de datos escalares más simples, como   números enteros y de punto flotante,   son casi siempre de primera clase.

enlace

    
respondido por el Waquo 25.01.2011 - 08:43
33

Se introdujo la noción de "ciudadano de primera clase" o "elemento de primera clase" en un lenguaje de programación por el científico informático británico Christopher Strachey en la década de 1960 en el contexto de las funciones de primera clase. La formulación más famosa de este principio se encuentra probablemente en Estructura e interpretación de los programas de computadora por Gerald Jay Sussman y Harry Abelson:

  
  • Se pueden nombrar por variables.
  •   
  • Se pueden pasar como argumentos a procedimientos.
  •   
  • Pueden devolverse como resultado de los procedimientos.
  •   
  • Se pueden incluir en las estructuras de datos.
  •   

Básicamente, significa que puedes hacer con este elemento del lenguaje de programación todo lo que puedes hacer con todos los demás elementos del lenguaje de programación.

Todo se trata de "derechos iguales": puedes hacer todo lo anterior con, digamos, enteros, ¿por qué debería ser diferente cualquier otra cosa?

La definición anterior es un poco restrictiva en el sentido de que solo se refiere al aspecto de primera clase en relación con los 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 hacerlo con otras cosas de tipo similar.

Por ejemplo, los operadores de Java y los métodos de Java son de tipo similar. Puede definir nuevos métodos, puede (un poco) elegir libremente los nombres de sus propios métodos, puede anular métodos, puede sobrecargar métodos. James Gosling también puede hacer todo eso con los operadores, pero tú y yo no podemos. Quiero decir, contrariamente a la creencia popular, Java admite la sobrecarga de operadores: por ejemplo, el operador + está sobrecargado para byte , short , int , long , float , double y String , e IIRC en Java 7 también para BigInteger y BigDecimal (y probablemente un par olvidé), es solo que usted no tiene ninguna influencia encima de eso. Eso claramente hace que los operadores sean de segunda clase según esta segunda definición. Tenga en cuenta que los métodos aún no son objetos de primera clase según la primera definición, sin embargo. (¿Eso hace que los operadores sean de tercera clase?)

    
respondido por el Jörg W Mittag 25.01.2011 - 15:32
6

Por lo general, esto se refiere a una construcción que es pasable 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.

    
respondido por el Pemdas 25.01.2011 - 06:11
1

Yo diría que una característica es un ciudadano de primera clase si se implementa únicamente por el idioma.
es decir, no requiere múltiples funciones de idioma o una biblioteca estándar para implementar esa función.

Ejemplo:

En C / C ++ no considero que las funciones sean un ciudadano de primera clase (otros pueden).
Esto se debe a que hay formas de manipular funciones que son compatibles directamente con el idioma pero que requieren el uso de otras funciones de idioma. Los parámetros de enlace a una función no se admiten directamente y debe crear un functor para implementar esta función.

    
respondido por el Martin York 25.01.2011 - 09:24
-1

Para agregar un ejemplo a las respuestas ya proporcionadas:

En WCF / C # actualmente debe marcar un objeto de clase con un atributo de contrato de servicio para que funcione como un servicio. No hay tal cosa como:

public **service** MyService (in relation public **class** MyClass). 

Una clase es un ciudadano de primera clase en c #, donde un servicio no lo es.

Espero que esto ayude

    
respondido por el Syg 25.01.2011 - 10:59

Lea otras preguntas en las etiquetas