¿Qué son los objetos de "primera clase"?

191

¿Cuándo se dice que los objetos u otra cosa son de "primera clase" en un lenguaje de programación dado y por qué? ¿En qué se diferencian de los idiomas donde no están?

EDITAR. Cuando uno dice "todo es un objeto" (como en Python), ¿quiere decir que "todo es de primera clase"?

Federico A. Ramponi
fuente
1
¿Sería posible migrar esta pregunta a los programadores? ¿O sería un inadaptado allí también? Creo que esta pregunta es buena. Simplemente no puedo decir qué foro le conviene más.
Shashank Sawant
16
Votado para reabrir ... lamentablemente esto realmente parece que fue cerrado por personas que no programan, es claramente sobre el tema: /
djechlin

Respuestas:

176

En resumen, significa que no hay restricciones en el uso del objeto. Es lo mismo que cualquier otro objeto.

Un objeto de primera clase es una entidad que se puede crear dinámicamente, destruir, pasar a una función, devolver como valor y tener todos los derechos que tienen otras variables en el lenguaje de programación.

Dependiendo del idioma, esto puede implicar:

  • ser expresable como un valor literal anónimo
  • ser almacenable en variables
  • ser almacenable en estructuras de datos
  • Tener una identidad intrínseca (independiente de cualquier nombre de pila)
  • siendo comparable para la igualdad con otras entidades
  • ser transitable como parámetro de un procedimiento / función
  • ser retornable como resultado de un procedimiento / función
  • ser constructible en tiempo de ejecución
  • ser imprimible
  • ser legible
  • ser transmisible entre procesos distribuidos
  • ser almacenable fuera de los procesos en ejecución

Fuente .

Sin embargo, en C ++ las funciones en sí mismas no son objetos de primera clase:

  • Puede anular el operador '()' haciendo posible tener una función de objeto, que es de primera clase.
  • Los punteros de función son de primera clase.
  • boost bind, lambda y function ofrecen funciones de primera clase

En C ++, las clases no son objetos de primera clase, pero las instancias de esas clases sí lo son. En Python, tanto las clases como los objetos son objetos de primera clase. (Consulte esta respuesta para obtener más detalles sobre las clases como objetos).

Aquí hay un ejemplo de funciones de JavaScript de primera clase:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

Fuente .

Las entidades que no son objetos de primera clase se denominan objetos de segunda clase. Las funciones en C ++ son de segunda clase porque no se pueden crear dinámicamente.

En cuanto a la edición:

EDITAR. Cuando uno dice "todo es un objeto" (como en Python), ¿quiere decir que "todo es de primera clase"?

El término objeto puede usarse libremente y no implica ser de primera clase. Y probablemente tendría más sentido llamar a todo el concepto 'entidades de primera clase'. Pero en Python apuntan a hacer que todo sea de primera clase. Creo que la intención de la persona que hizo su declaración fue de primera clase.

Brian R. Bondy
fuente
2
¿Puedes dar algunos ejemplos de objetos que no sean de "primera clase"?
Sudip Bhandari
1
@SudipBhandari Me preguntaba lo mismo, finalmente me topé con el útil artículo de Wikipedia sobre este tema: ciudadano / objeto de primera clase . La definición de Robin Popplestone me pareció especialmente útil. (Por cierto, la publicación de un artículo WP puede parecer muy obvio, pero no me di cuenta que esto era un concepto fundamental lenguaje de programación)
mblakesley
19

"Cuando uno dice" todo es un objeto "(como en Python), ¿quiere decir que" todo es de primera clase "?"

Si.

Todo en Python es un objeto apropiado. Incluso cosas que son "tipos primitivos" en otros idiomas.

Descubres que un objeto como 2tiene una interfaz bastante rica y sofisticada.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

Debido a que todo es un objeto de primera clase en Python, hay relativamente pocos casos especiales oscuros.

En Java, por ejemplo, hay tipos primitivos (int, bool, double, char) que no son objetos adecuados. Es por eso que Java tiene que introducir Integer, Boolean, Double y Character como tipos de primera clase. Esto puede ser difícil de enseñar a los principiantes: no es obvio por qué un tipo primitivo y una clase tienen que existir uno al lado del otro.

También significa que la clase de un objeto es, en sí misma, un objeto. Esto es diferente de C ++, donde las clases no siempre tienen una existencia distinta en tiempo de ejecución.

El tipo de 2es el type 'int'objeto, que tiene métodos, atributos y un tipo.

>>> type(2)
<class 'int'>

El tipo de un tipo incorporado como intes el type 'type'objeto. Esto tiene métodos y atributos, también.

>>> type(type(2))
<class 'type'>
S.Lott
fuente
1
Esto es cierto para Python moderno. En Python antiguo (versión 1? Era anterior a mi tiempo) no se podía heredar int. Así, las "clases antiguas" versus las "clases de estilo nuevo" (y en 3, ya no hay clases de estilo antiguo).
Keith Pinson
17

"Primera clase" significa que puede operarlos de la manera habitual. La mayoría de las veces, esto solo significa que puede pasar a estos ciudadanos de primera clase como argumentos para las funciones, o devolverlos de las funciones.

Esto es evidente para los objetos, pero no siempre es tan evidente para las funciones o incluso las clases:

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

Este es un ejemplo en C # donde las funciones en realidad no son objetos de primera clase. Por lo tanto, el código anterior utiliza una pequeña solución (es decir, un delegado genérico llamado Action<>) para pasar una función como argumento. Otros lenguajes, como Ruby, permiten tratar incluso las clases y los bloques de código como variables normales (o en el caso de Ruby, constantes).

Konrad Rudolph
fuente
17

De una diapositiva en Estructura e interpretación de programas de computadora , conferencia 2A (1986), que a su vez cita a Christopher Stracey :

Los derechos y privilegios de los ciudadanos de primera clase:

  • Para ser nombrado por las variables.
  • Para ser pasado como argumentos a los procedimientos.
  • Para ser devuelto como valores de procedimientos.
  • Para ser incorporado a las estructuras de datos
Federico A. Ramponi
fuente
1

OMI, esta es una de esas metáforas utilizadas para describir cosas en un lenguaje natural. El término se usa esencialmente en el contexto de describir funciones como objetos de primera clase.

Si considera un lenguaje orientado a objetos, podemos impartir varias características a los objetos, por ejemplo: herencia, definición de clase, capacidad de pasar a otras secciones de código (argumentos de método), capacidad de almacenar en una estructura de datos, etc. Si podemos hacer el lo mismo con una entidad que normalmente no se considera como un objeto, como las funciones en el caso del script java, tales entidades se consideran objetos de primera clase.

La primera clase esencialmente aquí significa, no manejado como segunda clase (con comportamiento degradado). Esencialmente, la burla es perfecta o indistinguible.

questzen
fuente