257 votes

Quels sont les objets « première classe » ?

Quand les objets ou quelque chose d’autre a dit être « first class » dans un langage de programmation donné et pourquoi ? En quoi sont-ils différents de langues où ils ne le sont pas ?

EDIT. Quand on dit « tout est un objet » (comme en Python), veut-il en fait dire que « tout est agencée » ?

234voto

Brian R. Bondy Points 141769

En bref, cela signifie qu'il n'existe pas de restrictions sur l'objet de l'utiliser. C'est le même que tout autre objet.

Une première classe de l'objet est une entité qui peut être créé dynamiquement, détruit, transmis à une fonction, retourné comme une valeur, et ont les mêmes droits que les autres variables dans le langage de programmation ont.

En fonction de la langue, ce qui peut implique:

  • être exprimable comme un anonyme de la valeur littérale
  • être stockés dans des variables
  • être stockés dans des structures de données
  • ayant une valeur intrinsèque de l'identité (indépendant de tout nom)
  • étant comparables pour l'égalité avec les autres entités
  • étant praticable comme un paramètre à une procédure/fonction
  • être consigné comme le résultat d'une procédure/fonction
  • être constructible au moment de l'exécution
  • être imprimable
  • être lisible
  • étant transmissible entre les processus distribués
  • être stockés à l'extérieur de 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 les "() " opérateur d'avoir une fonction de l'objet, qui est de première classe.
  • Pointeurs de fonction sont de première classe.
  • boost lier, lambda et la fonction ne vous offrons des fonctions de classe

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

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

// 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 désignés comme des personnes de seconde classe des objets. Les fonctions en C++ sont de seconde classe parce qu'ils ne peuvent pas être créés dynamiquement.

Concernant le montage:

EDIT. Quand on dit "tout est un objet" (comme en Python), il ne en effet, dire que "tout est première classe"?

Le terme d'objet peut être utilisé de façon imprécise et n'implique pas d'être premier de la classe. Et il serait sans doute plus judicieux d'appeler l'ensemble de la notion de " première de la classe d'entités. Mais en Python, ils visent à rendre le tout premier de la classe. Je crois que l'intention de la personne qui fait votre déclaration signifiait de première classe.

29voto

S.Lott Points 207588

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

Oui.

Tout en Python est un bon objet. Même les choses qui sont "de type primitif" dans d'autres langues.

Vous trouvez qu'un objet comme 2 a fait un assez riche et sophistiqué de l'interface.

>>> 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 de première classe de l'objet en Python, il y a relativement peu obscur des cas particuliers.

En Java, par exemple, il y a des types primitifs (int, bool, double, char) qui ne sont pas des objets. C'est pourquoi Java est d'introduire Integer, Boolean, Double et le Caractère de première classe de types. Cela peut être difficile d'enseigner à des débutants, il n'est pas évident la raison pour laquelle à la fois un type primitif et une classe d'exister côte à côte.

Cela signifie aussi qu'une classe de l'objet est, en lui-même -- un objet. C'est à partir de C++, où les classes ne sont pas toujours d'avoir une existence distincte au moment de l'exécution.

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

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

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

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

20voto

Konrad Rudolph Points 231505

"Première classe" signifie que vous pouvez 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 le retour de fonctions.

Ce qui est évident pour les objets mais pas toujours de façon évidente pour les fonctions, ou même des 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 de réalité ne sont 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<>) de passer une fonction en argument. D'autres langues, comme le Rubis, autoriser le traitement même des classes et des blocs de code comme des variables normales (ou, dans le cas de Ruby, constantes).

19voto

Federico A. Ramponi Points 23106

À partir d'une diapositive dans la Structure et l'Interprétation des Programmes d'Ordinateur, conférence 2A (1986), qui tourne dans les citations Christopher Stracey:

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

  • Pour être nommé par des variables.
  • Pour être passés comme arguments aux procédures.
  • Pour être retourné en tant que valeurs de procédures.
  • Pour être incorporés dans des structures de données

3voto

questzen Points 1963

IMO c'est un 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 envisagez un langage orienté objet, nous pouvons transmettre des diverses fonctions à des objets, par exemple: les droits de succession, la définition de la classe, de la possibilité de passer à d'autres sections de code(des arguments de méthode), la capacité de stocker dans une structure de données etc. Si nous pouvons faire la même chose avec une entité qui n'est normalement pas considérée comme un objet, comme pour les fonctions, dans le cas de java script, ces entités sont considérées comme des objets de première classe.

Première classe essentiellement signifie ici, ce n'est pas manipulé comme deuxième classe (avec une dégradation du comportement). Essentiellement, le moqueur est parfait ou indiscernables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X