web-dev-qa-db-fra.com

Que sont les objets "de première classe"?

Quand des objets ou quelque chose d'autre est-il dit "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?

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

170

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

Un objet de première classe est une entité qui peut être créée, détruite, passée de manière dynamique, passée à une fonction, renvoyée sous forme de valeur et disposant de tous les droits associés aux autres variables du langage de programmation.

Selon la langue, cela peut impliquer:

  • être exprimable sous forme de valeur littérale anonyme
  • être stockable dans des variables
  • être stockable dans des structures de données
  • ayant une identité intrinsèque (indépendante de tout nom donné)
  • être comparable pour l'égalité avec d'autres entités
  • être passable en tant que paramètre d'une procédure/fonction
  • être retournable à la suite d'une procédure/fonction
  • être constructible à l'exécution
  • être imprimable
  • être lisible
  • être 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 d'objet 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. Dans Python les deux 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.

En ce qui concerne l'édition:

MODIFIER. Quand on dit "tout est un objet" (comme en Python), veut-il vraiment 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 dans Python, ils visent à tout faire en premier cours. Je crois que l'intention de la personne qui a fait votre déclaration voulait dire en premier lieu.

155
Brian R. Bondy

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

Oui.

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

Vous trouvez qu'un objet comme 2 possède en 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 y a 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 les types de premier ordre Integer, Boolean, Double et Character. Cela peut être difficile à enseigner aux débutants - il n’est pas clair pourquoi un type primitif et un la classe doit exister côte à côte.

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

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

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

Le type d'un type intégré comme int est le type 'type' objet. Cela a aussi des méthodes et des attributs.

>>> type(type(2))
<type 'type'>
17
S.Lott

"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 transmettre ces citoyens de première classe comme arguments à des fonctions ou les renvoyer depuis des fonctions.

Cela va de soi pour les objets mais pas toujours pour les fonctions, ni même pour 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

Ceci est un exemple en C # où les fonctions ne sont pas 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 argument. D'autres langages, tels que 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).

17
Konrad Rudolph

Extrait d’une diapositive Structure et interprétation des programmes informatiques , conférence 2A (1986), qui cite à son tour Christopher Stracey :

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

  • Être nommé par des variables.
  • A transmettre en tant qu'arguments aux procédures.
  • A renvoyer en tant que valeurs de procédures.
  • A intégrer aux structures de données
16

OMI 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 de fonctions en tant qu'objets de première classe.

Si vous considérez un langage orienté objet, nous pouvons conférer diverses caractéristiques aux objets, par exemple: héritage, définition de classe, possibilité de passer à d’autres sections de code (arguments de méthode), possibilité de stocker dans une structure de données, etc. de même 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.

Par première classe, on entend ici essentiellement, et non comme une seconde classe (avec un comportement dégradé). Essentiellement, le moquage est parfait ou impossible à distinguer.

1
questzen