Qu'entend-on par «objet de première classe»?


146

Dans une question récente , j'ai reçu des suggestions pour parler, entre autres, de l'aspect de JavaScript où les fonctions sont des objets de «première classe». Que signifie la «première classe» dans ce contexte, par opposition à d'autres objets?

EDIT (Jörg W Mittag): Dupliquer exact: "Qu'est-ce qu'une construction de programmation de première classe?"


Réponses:


179

Pour citer Wikipedia :

En informatique, on dit qu'un langage de programmation prend en charge les fonctions de première classe (ou littéral de fonction) s'il traite les fonctions comme des objets de première classe. Plus précisément, cela signifie que le langage prend en charge la construction de nouvelles fonctions lors de l'exécution d'un programme, les stockant dans des structures de données, les passant comme arguments à d'autres fonctions et les renvoyant comme valeurs d'autres fonctions.

Cette page l' illustre également magnifiquement:

Vraiment, comme toute autre variable

  • Une fonction est une instance du type Object
  • Une fonction peut avoir des propriétés et avoir un lien vers sa méthode constructeur
  • Vous pouvez stocker la fonction dans une variable
  • Vous pouvez passer la fonction en tant que paramètre à une autre fonction
  • Vous pouvez renvoyer la fonction à partir d'une fonction

lire aussi le commentaire de TrayMan, intéressant ...


11
Citant wikipedia est sympa et dandy, mais la description est écrite dans un langage pour les scientifiques et non pour les geeks. Qu'est-ce que tout cela signifie de toute façon? La dernière phrase de cette citation est vague.
Spoike

1
@Spoike, true ... a fourni une ressource javascript.
Sander Versluys

16
Commodément, un langage qui a des fonctions de première classe a également des fonctions d'ordre supérieur, au lieu d'être limité aux fonctions de premier ordre, ce qui exclurait les fonctions de première classe. (Bien que d'ordre supérieur, pas de première classe soit possible.)
TrayMan

5
Je n'ai rien trouvé de clair dans la citation de Wikipedia, mais le lien supplémentaire est excellent.
ProfK

4
Le lien ne fonctionne plus (après environ 8 ans).
doubleOrt

47

La notion de «fonctions de premier ordre» dans un langage de programmation a été introduite par l'informaticien britannique Christopher Strachey dans les années 1960. La formulation la plus célèbre de ce principe se trouve probablement dans Structure et interprétation des programmes informatiques de Gerald Jay Sussman et Harry Abelson:

  • Ils peuvent être nommés par des variables.
  • Ils peuvent être passés comme arguments aux procédures.
  • Ils peuvent être retournés comme résultats de procédures.
  • Ils peuvent être inclus dans des structures de données.

Fondamentalement, cela signifie que vous pouvez faire avec les fonctions tout ce que vous pouvez faire avec tous les autres éléments du langage de programmation. Donc, dans le cas de JavaScript, cela signifie que tout ce que vous pouvez faire avec un entier, une chaîne, un tableau ou tout autre type d'objet, vous pouvez également le faire avec des fonctions.


14

Approbation plus complète de la formulation de Strachey-Sussman-Abelson. Donc, si votre langage prend en charge une telle construction, vous avez une fonction en tant que langage de première classe :)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

En bref, tout est un objet de première classe s'il agit dans le langage comme une sorte d'objet ou de type d'objet de manipulation d'état. Simplement quelque chose sur lequel vous pouvez opérer et transmettre des déclarations et évaluer dans des expressions en même temps. Ou encore plus court: lorsque vous pouvez considérer une fonction comme un objet pouvant être appelé en plus.


9

Les fonctions JavaScript sont des fonctions de première classe, ce qui signifie que les fonctions et les objets sont traités comme la même chose. Les fonctions peuvent être stockées sous forme de variable à l'intérieur d'un objet ou d'un tableau ainsi que passées en argument ou renvoyées par une autre fonction. Cela rend la fonction "citoyens de première classe en JavaScript"

JavaScript utilise une syntaxe de notation littérale qui rend difficile de saisir pleinement le fait que dans JavaScript les fonctions sont des objets.

Par exemple..

var youObj1 = new Object();
// or
var youObj1 = {};

les deux déclinaisons sont équivalentes. En utilisant, newnous appelons la fonction constructeur d'un objet. En utilisant également {}(raccourci JavaScript appelé littéraux), nous appelons la fonction de construction d'un objet. {}est juste une représentation plus courte pour instancier le constructeur.

La plupart des langages utilisent des newmots-clés pour créer un objet, donc créons un objet JavaScript.

var myFunction = new Function("a",  "b", 'return a_b');

Comme vous le voyez, nous avons créé une fonction de nom d'objet .

Création de la même fonction de nom d'objet à l'aide d'une expression de fonction JavaScript.

var myFunction = function myFunction(a,b) {
    return a+b;
}

Ici, nous venons de créer une fonction de nom d'objet.


9

En javascript, les fonctions sont des objets de première classe car elles peuvent faire beaucoup plus que ce que les objets peuvent faire.

  • Une fonction est une instance d'un type Object.

Function instanceof Object //returns true

Comme un objet, une fonction peut avoir des propriétés et peut avoir un lien vers sa fonction constructeur.

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • Les fonctions peuvent être stockées dans une variable sous forme de valeur.

  var foo = function(){}; 
    console.log(foo); // function(){}

  • Les fonctions peuvent être passées comme arguments à d'autres fonctions

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • Vous pouvez renvoyer une fonction à partir d'une fonction

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • Peut être stocké dans une variable comme référence.

    var sum = function (a,b){return a+b}  
    sum(4,4);


Un objet peut faire tout cela aussi.
doubleOrt

5

Test simple. Si vous pouvez le faire dans votre langage (Python par exemple):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Votre langage traite les fonctions comme des objets de première classe.


3
Mais je peux le faire en C ++: int deux fois (int x) {return x << 1; } int (* f) (int) = deux fois; std :: cout << (* f) (5) << std :: endl; Cela signifie-t-il que C ++ traite les fonctions comme des objets de première classe (avec une syntaxe amusante)?
Thomas L Holaday

1
Jusqu'à ce que vous puissiez créer une fonction à l'intérieur d'une fonction, je veux dire non.
cHao

1
Les pointeurs de fonction C prennent en charge (une définition très limitée) des fonctions de première classe, mais les fonctions ne sont pas des objets. Les pointeurs de fonction en C ne contiennent ni état ni comportement.
Steven Kramer

2

Cela signifie que les fonctions sont des objets, avec un type et un comportement. Ils peuvent être construits dynamiquement, transmis comme n'importe quel autre objet, et le fait qu'ils puissent être appelés fait partie de leur interface.


2

Cela signifie que la fonction hérite en fait de Object. Pour que vous puissiez le faire circuler et travailler avec comme avec n'importe quel autre objet.

En c # cependant, vous devez vous abstenir de déléguer ou de réfléchir pour jouer avec les fonctions. (cela s'est beaucoup amélioré récemment avec les expressions lambda)


2

La définition sur le site de Mozilla est concise et claire. Selon eux,

En JavaScript, les fonctions sont des objets de première classe, car elles peuvent avoir des propriétés et des méthodes comme tout autre objet . Ce qui les distingue des autres objets, c'est que des fonctions peuvent être appelées. En bref, ce sont des objets Function.

Et

une fonction est un "sous-programme" qui peut être appelé par un code externe (ou interne en cas de récursivité) à la fonction. Comme le programme lui-même, une fonction est composée d'une séquence d'instructions appelée le corps de la fonction. Les valeurs peuvent être transmises à une fonction et la fonction renverra une valeur.


0

Je suppose que lorsque quelque chose est de première classe dans une langue, cela signifie qu'il est pris en charge par sa syntaxe plutôt que par une bibliothèque ou un sucre syntaxique. par exemple, les classes en C ne sont pas de première classe


0

Simple en JavaScript, les fonctions sont des objets de première classe c'est-à-dire que les fonctions sont de type Object et peuvent être utilisées de manière de première classe comme n'importe quel autre objet (String, Array, Number, etc.) puisqu'elles sont en fait des objets se. Ils peuvent être «stockés dans des variables, passés comme arguments à des fonctions, créés dans des fonctions et renvoyés à partir de fonctions

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.