Jai vu plusieurs fois des déclarations comme- « Veuillez faire de cette fonctionnalité un citoyen de première classe dans tel ou tel langage / plateforme ». Par exemple, on parle dénumérations en C # /. Net. Alors, quand une fonctionnalité est-elle considérée comme un « citoyen de première classe » dans un langage de programmation / plate-forme?

Commentaires

Réponse

Définition

Un objet est de première classe lorsquil:

  • peut être stocké dans des variables et des structures de données
  • peut être passé en paramètre à un sous-programme
  • peut être retourné comme résultat dun sous-programme
  • peut être construit au moment de lexécution
  • a une identité intrinsèque (indépendante de tout nom donné)

Le terme « objet » est utilisé ici de manière vague, ne faisant pas nécessairement référence aux objets dans la programmation orientée objet. Les types de données scalaires les plus simples, tels que les nombres entiers et à virgule flottante, sont presque toujours de première classe.

http://en.wikipedia.org/wiki/First_class_object

Commentaires

  • Alors, quest-ce qui fait dénumérations un objet de deuxième classe dans .net / C #?
  • @Gulshan – vous pourriez faire valoir le manque didentité intrinsèque – les énumérations C # ne sont fondamentalement que du sucre syntaxique (cest-à-dire un  » prénom « ) pour une valeur entière. Comparez avec Java, où les énumérations sont des objets à part entière.
  • @mikera, dans .NET les énumérations sont des valeurs à part entière. Java na tout simplement aucune valeur, seulement des objets, qui ‘ sont la seule différence.
  • @mikera: bien que cela empêche Java ‘ s enums davoir quelques propriétés intéressantes telles que la possibilité de représenter des champs de bits avec eux. Bien que leur implémentation soit probablement plus de première classe, la plupart de leurs API contiennent encore de nombreuses constantes entières (ou chaîne) et de nombreuses utilisations de celles-ci ne peuvent pas être facilement remplacées par des énumérations.
  • « e45fbb3b6b »>

Vous ne pensez pas que les énumérations peuvent être construites au moment de lexécution dans .Net, nest-ce pas? Je pensais que cétait toujours des constantes.

Réponse

La notion de  » citoyen de première classe  » ou  » élément de première classe  » dans un langage de programmation a été introduit par linformaticien britannique Christopher Strachey dans les années 1960 dans le contexte du premier -fonctions de classe. La formulation la plus connue 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 renvoyés comme résultats de procédures.
  • Ils peuvent être inclus dans des structures de données.

En gros, cela signifie que vous pouvez faire avec élément du langage de programmation tout ce que vous pouvez faire avec tous les autres éléments du langage de programmation.

Il sagit de  » droits égaux « : vous pouvez faire tout ce qui précède, avec, disons, des entiers, alors pourquoi autre chose devrait-elle être différente?

La définition ci-dessus est un peu restrictive dans le sens où elle parle de laspect de la première classe comme étant des objets du programme. Une définition plus générale wou Quoi quil en soit, une chose est de première classe si vous pouvez tout faire avec elle, vous pouvez aussi faire dautres choses du même genre.

Par exemple, les opérateurs Java et les méthodes Java sont du même genre. Vous pouvez définir de nouvelles méthodes, vous pouvez (un peu) librement choisir les noms de vos propres méthodes, vous pouvez surcharger des méthodes, vous pouvez surcharger des méthodes. James Gosling peut également faire tout cela avec des opérateurs, mais vous et moi ne pouvons « t. Je veux dire, contrairement à la croyance populaire, Java prend en charge la surcharge des opérateurs: par exemple , lopérateur + est surchargé pour byte, short, int, long, float, double et String, et IIRC en Java 7 également pour BigInteger et BigDecimal (et probablement un couple que jai oublié), cest juste que vous navez aucune influence sur cela.Cela rend clairement les opérateurs de seconde classe selon cette seconde définition. Notez cependant que les méthodes ne sont toujours pas des objets de première classe selon la première définition. (Est-ce que cela fait des opérateurs de troisième classe?)

Commentaires

  • Excellente réponse. Ainsi, par exemple, les docs pipenv disent  » Windows est un citoyen de premier ordre, dans notre monde.  » Cela impliquerait-il que vous pouvez tout faire avec pipenv sous Windows que vous pouvez également faire avec sous Linux?
  • Non, je ne pense ‘ que lutilisation du terme  » citoyen de première classe  » a quelque chose à voir avec la définition de la théorie du langage de programmation formelle du terme. Je pense que pipenv utilise simplement le terme avec sa signification anglaise standard.
  • Comme dans  » traité équitablement?  » Merci pour votre aide.

Réponse

Habituellement, cette référence rs à une construction qui est passable en tant que paramètre, peut être définie comme un type de retour dune fonction ou peut se voir affecter une valeur. Normalement, vous devez être en mesure de les construire au moment de lexécution. Par exemple, une instance dune classe serait un citoyen de première classe en c ++ ou java, mais une fonction en C ne le serait pas.

Commentaires

  • Quest-ce qui fait dune classe un citoyen de première classe en c ++?
  • @bjarkef: On a déjà répondu comme ça par sa correspondance avec la description proposée dans les phrases précédentes.
  • @Jonathan: Oui, désolé, jai mal lu les  » les construire au moment de lexécution « . Oui, vous pouvez construire une instance dune classe au moment de lexécution (un objet), mais pas la classe elle-même. Cest ce qui ma dérouté.
  • Passer par paramètre nest toujours pas suffisant. En C / C ++, je considérerais toujours les fonctions comme des citoyens de seconde zone. Ils peuvent être passés en tant que paramètres, renvoyés en tant que résultats placés à lintérieur dautres objets. Mais ils ne peuvent pas être manipulés sans laide dautres constructions (comme std :: bind est nécessaire pour lier des paramètres à une fonction).
  • @Martin Je nai jamais dit que les fonctions étaient des citoyens de première classe en C / C ++ .

Réponse

Je dirais quune fonctionnalité est un citoyen de première classe si elle est implémentée uniquement par le langage .
cest-à-dire quil ne nécessite pas de fonctionnalités linguistiques multiples ou une bibliothèque standard pour implémenter cette fonctionnalité.

Exemple:

En C / C ++, je ne considère pas les fonctions comme une première citoyen de classe (dautres le peuvent).
Cest parce quil existe des moyens de manipuler des fonctions qui sont directement supportées par le langage mais qui nécessitent lutilisation dautres fonctionnalités du langage. La liaison de paramètres à une fonction nest pas directement prise en charge et vous devez créer un foncteur pour implémenter cette fonctionnalité.

Commentaires

  • wouldn ‘ t qui font que les fonctions liées (ou les  » fermetures « ) ne soient pas de première classe, alors que les fonctions elles-mêmes le sont? Comment la prise en charge des fermetures par 0x ‘ est-elle prise en compte dans votre analyse?
  • @Fred Nurk: Tout dépend de la langue. Dans certaines langues, les fermetures sont des systèmes de première classe. Dans dautres non. Je ne suis pas encore assez familier avec C ++ 0x pour faire un commentaire explicite.
  • Laissez ‘ dire que le langage est C ou C ++ (mais pas 0x ), comme dans votre réponse. ‘ t votre définition de  » de première classe  » créerait des fonctions liées (ou  » closures « ) pas être de première classe, alors que les fonctions elles-mêmes le sont?
  • @Fred Nurk: Si vous limitez la seule chose que vous pouvez faire avec une fonction est de lui faire une fermeture, alors bien sûr. Mais pour moi, ‘ revient à dire si votre plate-forme prend en charge lajout dentiers uniquement en important une bibliothèque. Alors les entiers sont des citoyens de première classe mais laddition dentiers nest pas prise en compte. À mon avis, la fermeture est une opération qui peut être effectuée sur une fonction qui renvoie effectivement une nouvelle fonction (mais cela dépend de la façon dont vous la définissez). Mais la clôture et la liaison ne sont que deux opérations que nous excluons de la discussion (je ne suis pas sûr que cétait une question).
  • @Martin: Je ne dois pas mexpliquer clairement. Étant donné  » quune fonctionnalité est un citoyen de première classe si elle est implémentée uniquement par le langage « , alors les fonctions en C et C ++ sont implémentées uniquement par la langue et serait donc de première classe. Les fonctions liées (qui peuvent également être appelées  » closures « ) sont ce que vous ‘ re parler des paramètres de liaison, etc., mais que ‘ est une fonctionnalité différente.

Réponse

Pour ajouter un exemple aux réponses déjà fournies:

Dans WCF / C # vous devez actuellement marquer un objet de classe avec un attribut de contrat de service pour quil fonctionne en tant que service. Il ny a rien de tel que:

public **service** MyService (in relation public **class** MyClass). 

Une classe est un citoyen de première classe en c #, là où un service nest pas.

Hope cela aide

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *