Quando una caratteristica è considerata un "cittadino di prima classe" in un linguaggio / piattaforma di programmazione?

60

Ho visto molte volte affermazioni come: "Per favore, rendi questa caratteristica un cittadino di prima classe in così e così lingua / piattaforma". Ad esempio, si parla di enumerazioni in C # / .net. Quindi, quando una caratteristica è considerata un "cittadino di prima classe" in un linguaggio / piattaforma di programmazione?

    
posta Gulshan 25.01.2011 - 05:53
fonte

5 risposte

39

Definition

An object is first-class when it:

  • can be stored in variables and data structures
  • can be passed as a parameter to a subroutine
  • can be returned as the result of a subroutine
  • can be constructed at runtime
  • has intrinsic identity (independent of any given name)

The term "object" is used loosely here, not necessarily referring to objects in object-oriented programming. The simplest scalar data types, such as integer and floating-point numbers, are nearly always first-class.

link

    
risposta data 25.01.2011 - 08:43
fonte
33

È stata introdotta la nozione di "cittadino di prima classe" o "elemento di prima classe" in un linguaggio di programmazione dallo scienziato informatico britannico Christopher Strachey negli anni '60 nel contesto delle funzioni di prima classe. La formulazione più famosa di questo principio è probabilmente in Struttura e interpretazione dei programmi per computer di Gerald Jay Sussman e Harry Abelson:

  • They may be named by variables.
  • They may be passed as arguments to procedures.
  • They may be returned as the results of procedures.
  • They may be included in data structures.

Fondamentalmente, significa che puoi fare con questo elemento del linguaggio di programmazione tutto ciò che puoi fare con tutti gli altri elementi nel linguaggio di programmazione.

Si tratta di "diritti uguali": puoi fare tutto quanto sopra, con, per esempio, numeri interi, quindi perché un'altra cosa dovrebbe essere diversa?

La definizione di cui sopra è un po 'restrittiva nel senso che parla solo dell'aspetto della prima classe in relazione all'essere oggetti del programma. Una definizione più generale sarebbe che una cosa è di prima classe se puoi fare tutto con essa puoi fare anche con altre cose di tipo simile.

Ad esempio, gli operatori Java e i metodi Java sono di tipo simile. È possibile definire nuovi metodi, è possibile (in qualche modo) scegliere liberamente i nomi dei propri metodi, è possibile sovrascrivere i metodi, è possibile sovraccaricare i metodi. James Gosling può fare tutto questo anche con gli operatori, ma tu e io non possiamo. Voglio dire, contrariamente alla credenza popolare, Java supporta l'overloading dell'operatore: ad esempio, l'operatore + è sovraccarico per byte , short , int , long , float , double e String e IIRC in Java 7 anche per BigInteger e BigDecimal (e probabilmente una coppia che ho dimenticato), è solo che tu non hai alcuna influenza sopra. Ciò rende chiaramente gli operatori di seconda classe in base a questa seconda definizione. Nota che i metodi non sono ancora oggetti di prima classe secondo la prima definizione, però. (Questo rende gli operatori di terza classe?)

    
risposta data 25.01.2011 - 15:32
fonte
6

Di solito questo si riferisce a un costrutto che è passabile come parametro, può essere definito come un tipo di ritorno da una funzione o può essere assegnato a un valore. Normalmente è necessario essere in grado di costruirli in fase di runtime. Ad esempio, un'istanza di una classe sarebbe un cittadino di prima classe in c ++ o java, ma una funzione in C non lo sarebbe.

    
risposta data 25.01.2011 - 06:11
fonte
1

Direi che una caratteristica è un cittadino di prima classe se è implementata esclusivamente dalla lingua.
Ad esempio, non richiede più funzioni linguistiche o una libreria standard per implementare tale funzione.

Esempio:

In C / C ++ non considero le funzioni come cittadini di prima classe (altri possono).
Questo perché ci sono modi per manipolare funzioni che sono supportate direttamente dalla lingua ma richiedono l'uso di altre funzionalità linguistiche. I parametri di associazione a una funzione non sono supportati direttamente ed è necessario creare un functor per implementare questa funzione.

    
risposta data 25.01.2011 - 09:24
fonte
-1

Per aggiungere un esempio alle risposte già fornite:

In WCF / C #, al momento, devi contrassegnare un oggetto di classe con un attributo di contratto di servizio per farlo funzionare come un servizio. Non esiste una cosa come:

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

Una classe è un cittadino di prima classe in c #, dove un servizio non lo è.

Spero che questo aiuti

    
risposta data 25.01.2011 - 10:59
fonte

Leggi altre domande sui tag