Que sont les objets de «première classe»?

195

Quand est-ce que les objets ou autre chose sont considérés comme «de première classe» dans un langage de programmation donné, et pourquoi? En quoi diffèrent-ils des langues où ils ne le sont pas?

ÉDITER. Quand on dit «tout est objet» (comme en Python), veut-il bien dire que «tout est de première classe»?

Federico A. Ramponi
la source
1
Serait-il possible de migrer cette question vers programmers.SE? Ou serait-ce un inadapté là aussi? Je pense que cette question est bonne. Je ne suis pas en mesure de dire quel forum lui conviendrait le mieux.
Shashank Sawant
17
Voté pour la réouverture ... malheureusement, cela semble vraiment avoir été fermé par des gens qui ne programment pas, c'est clairement sur le sujet: /
djechlin

Réponses:

180

En bref, cela signifie qu'il n'y a aucune restriction sur l'utilisation de l'objet. C'est la même chose que tout autre objet.

Un objet de première classe est une entité qui peut être créée dynamiquement, détruite, transmise à une fonction, renvoyée en tant que valeur et avoir tous les droits comme les autres variables du langage de programmation.

Selon la langue, cela peut impliquer:

  • être exprimable comme une valeur littérale anonyme
  • être stockable dans des variables
  • être stockable dans des structures de données
  • avoir une identité intrinsèque (indépendante de tout prénom)
  • étant comparable pour l'égalité avec d'autres entités
  • étant passable comme paramètre à une procédure / fonction
  • être retournable à la suite d'une procédure / fonction
  • être constructible à l'exécution
  • étant imprimable
  • être lisible
  • étant transmissible entre les processus distribués
  • être stockable en dehors des processus en cours d'exécution

Source .

En C ++, les fonctions elles-mêmes ne sont pas des objets de première classe, cependant:

  • Vous pouvez remplacer l'opérateur '()' permettant d'avoir une fonction objet, qui est de première classe.
  • Les pointeurs de fonction sont de première classe.
  • boost bind, lambda et function offrent des fonctions de première classe

En C ++, les classes ne sont pas des objets de première classe mais des instances de ces classes le sont. En Python, les classes et les objets sont des objets de première classe. (Voir cette réponse pour plus de détails sur les classes en tant qu'objets).

Voici un exemple de fonctions Javascript de première classe:

// 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

Source .

Les entités qui ne sont pas des objets de première classe sont appelées objets de seconde classe. Les fonctions en C ++ sont de seconde classe car elles ne peuvent pas être créées dynamiquement.

Concernant l'édition:

ÉDITER. Quand on dit «tout est objet» (comme en Python), veut-il bien dire que «tout est de première classe»?

Le terme objet peut être utilisé librement et n'implique pas d'être de première classe. Et il serait probablement plus logique d'appeler l'ensemble du concept «entités de première classe». Mais en Python, ils visent à tout rendre de première classe. Je crois que l'intention de la personne qui a fait votre déclaration était de première classe.

Brian R. Bondy
la source
3
Pouvez-vous donner des exemples d'objets qui ne sont pas de «première classe»?
Sudip Bhandari
1
@SudipBhandari Je me suis demandé la même chose, je suis finalement tombé sur l'article utile de Wikipedia sur ce sujet: citoyen / objet de première classe . J'ai trouvé la définition de Robin Popplestone particulièrement utile. (Btw, publier un article WP peut sembler super évident, mais je ne savais pas que c'était un concept de langage de programmation fondamental)
mblakesley
21

"Quand on dit" tout est objet "(comme en Python), veut-il bien dire que" tout est de première classe "?"

Oui.

Tout en Python est un objet approprié. Même les choses qui sont des "types primitifs" dans d'autres langues.

Vous trouvez qu'un objet comme a 2en fait une interface assez riche et sophistiquée.

>>> 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__']

Parce que tout est un objet de première classe en Python, il existe relativement peu de cas spéciaux obscurs.

En Java, par exemple, il existe des types primitifs (int, bool, double, char) qui ne sont pas des objets appropriés. C'est pourquoi Java doit introduire Integer, Boolean, Double et Character comme types de première classe. Cela peut être difficile à enseigner aux débutants - il n'est pas évident de savoir pourquoi à la fois un type primitif et une classe doivent coexister.

Cela signifie également que la classe d'un objet est - elle-même - un objet. Ceci est différent du C ++, où les classes n'ont pas toujours une existence distincte au moment de l'exécution.

Le type de 2est l' type 'int'objet, qui a des méthodes, des attributs et un type.

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

Le type d'un type intégré comme intest l' type 'type'objet. Cela a également des méthodes et des attributs.

>>> type(type(2))
<class 'type'>
S.Lott
la source
1
Cela est vrai du Python moderne. Dans l'ancien Python (version 1? C'était avant mon temps), vous ne pouviez pas hériter int. Ainsi les «anciennes» contre «nouvelles classes» (et dans 3, il n'y a plus de classes à l'ancienne).
Keith Pinson
17

«Première classe» signifie que vous pouvez les opérer de la manière habituelle. La plupart du temps, cela signifie simplement que vous pouvez passer ces citoyens de première classe comme arguments aux fonctions, ou les renvoyer à partir de fonctions.

Cela va de soi pour les objets mais pas toujours aussi évident pour les fonctions, voire les classes:

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

Voici un exemple en C # où les fonctions ne sont en fait pas des objets de première classe. Le code ci-dessus utilise donc une petite solution de contournement (à savoir un délégué générique appelé Action<>) pour passer une fonction en tant qu'argument. D'autres langages, comme Ruby, permettent de traiter même les classes et les blocs de code comme des variables normales (ou dans le cas de Ruby, des constantes).

Konrad Rudolph
la source
17

D'après une diapositive de Structure et interprétation des programmes informatiques , conférence 2A (1986), qui à son tour cite Christopher Stracey :

Les droits et privilèges des citoyens de première classe:

  • À nommer par des variables.
  • A passer comme arguments aux procédures.
  • À renvoyer en tant que valeurs de procédures.
  • À intégrer dans les structures de données
Federico A. Ramponi
la source
1

IMO c'est l'une de ces métaphores utilisées pour décrire les choses dans un langage naturel. Le terme est essentiellement utilisé dans le contexte de la description des fonctions comme des objets de première classe.

Si vous considérez un langage orienté objet, nous pouvons conférer diverses fonctionnalités aux objets, par exemple: l'héritage, la définition de classe, la possibilité de passer à d'autres sections de code (arguments de méthode), la possibilité de stocker dans une structure de données etc. Si nous pouvons faire le idem avec une entité qui n'est normalement pas considérée comme un objet, comme les fonctions dans le cas du script java, ces entités sont considérées comme des objets de première classe.

Première classe signifie essentiellement ici, non traitée comme une seconde classe (avec un comportement dégradé). Essentiellement, les moqueries sont parfaites ou impossibles à distinguer.

questzen
la source