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


61

Ho visto molte volte dichiarazioni come: "Per favore, rendi questa funzionalità un cittadino di prima classe in una lingua e una piattaforma così". Ad esempio, si dice degli enum in C # /. Net. Quindi, quando una caratteristica è considerata un "cittadino di prima classe" in un linguaggio / piattaforma di programmazione?

Risposte:


40

Definizione

Un oggetto è di prima classe quando:

  • può essere memorizzato in variabili e strutture dati
  • può essere passato come parametro a una subroutine
  • può essere restituito come risultato di una subroutine
  • può essere costruito in fase di esecuzione
  • ha un'identità intrinseca (indipendente da qualsiasi nome)

Il termine "oggetto" è qui usato in modo approssimativo, non necessariamente riferendosi agli oggetti nella programmazione orientata agli oggetti. I tipi di dati scalari più semplici, come numeri interi e in virgola mobile, sono quasi sempre di prima classe.

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


1
Quindi, cosa rende enums un oggetto di seconda classe in .net / C #?
Gulshan,

7
@Gulshan - potresti argomentare la mancanza di identità intrinseca - gli enumerati C # sono fondamentalmente solo zucchero sintattico (cioè un "nome dato") per un valore intero. Confronta con Java, dove gli enum sono oggetti a sé stanti.
Mikera,

@mikera, in .NET gli enumerati sono valori a sé stanti. Java non ha alcun valore, solo oggetti, questa è l'unica differenza.
Logica SK

@mikera: anche se questo impedisce agli enum di Java di avere delle belle proprietà come essere in grado di rappresentare con loro campi di bit. Sebbene la loro implementazione sia probabilmente più di prima classe, la maggior parte delle loro API ha ancora molte costanti intere (o stringhe) e molti usi di queste non possono essere facilmente sostituiti con enumerazioni.
Joey,

Non credo che gli enum possano essere costruiti in fase di esecuzione in .Net, vero? Ho pensato che fossero sempre costanti.
Travis,

33

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

  • Possono essere nominati da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti come risultato delle procedure.
  • Possono essere inclusi in strutture di dati.

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 "pari diritti": puoi fare tutto quanto sopra, con, diciamo, numeri interi, quindi perché qualsiasi altra cosa dovrebbe essere diversa?

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

Ad esempio, gli operatori Java e i metodi Java sono di tipo simile. Puoi definire nuovi metodi, puoi (in qualche modo) scegliere liberamente i nomi dei tuoi metodi, puoi sovrascrivere i metodi, puoi sovraccaricare i metodi. James Gosling può fare tutto questo anche con gli operatori, ma tu e io no. Voglio dire, contrariamente alla credenza popolare, Java fa operatore di supporto sovraccarico: per esempio, l' +operatore viene sovraccaricato per byte, short, int, long, float, doublee String, e IIRC in Java 7 anche per BigIntegere BigDecimal(e probabilmente un paio ho dimenticato), è solo che tenon ha alcuna influenza su di esso. Ciò rende chiaramente gli operatori di seconda classe secondo questa seconda definizione. Tuttavia, i metodi non sono ancora oggetti di prima classe secondo la prima definizione. (Questo rende gli operatori di terza classe?)


6

Normalmente si riferisce a un costrutto passabile come parametro, che può essere definito come tipo di ritorno da una funzione o che può essere assegnato un valore. Normalmente devi essere in grado di costruirli in fase di esecuzione. 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.


Cosa rende una classe un cittadino di prima classe in c ++?
Bjarke Freund-Hansen,

2
@bjarkef: Sembra che abbia già risposto rispondendo alla descrizione offerta nelle frasi precedenti.
doppelgreener,

@Jonathan: Sì, scusa, ho letto male il "costruiscili in fase di esecuzione". Sì, puoi costruire un'istanza di una classe in fase di esecuzione (un oggetto), ma non la classe stessa. Questo è ciò che mi ha confuso.
Bjarke Freund-Hansen,

1
Il passaggio per parametro non è ancora sufficiente. In C / C ++ considererei ancora le funzioni come cittadini di seconda classe. Possono essere passati come parametri, restituiti come risultati posizionati all'interno di altri oggetti. Ma non possono essere manipolati senza l'aiuto di altri costrutti (come std :: bind è richiesto per associare i parametri a una funzione).
Martin York,

@Martin Non ho mai detto che le funzioni fossero cittadini di prima classe in C / C ++.
Pemdas,

1

Direi che una caratteristica è un cittadino di prima classe se è implementata esclusivamente dalla lingua.
cioè non richiede funzionalità in più lingue o una libreria standard per implementare quella funzione.

Esempio:

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


1
Ciò non renderebbe le funzioni associate (o "chiusure") non di prima classe, mentre le funzioni stesse lo sono? In che modo il supporto di 0x per le chiusure tiene conto della tua analisi?
Fred Nurk,

@Fred Nurk: tutto dipende dalla lingua. In alcune lingue le chiusure sono sistemi di prima classe. In altri no. Non ho ancora abbastanza familiarità con C ++ 0x per fare un commento esplicito.
Martin York,

Supponiamo che il linguaggio sia C o C ++ (ma non 0x), come nella tua risposta. La tua definizione di "prima classe" non renderebbe le funzioni associate (o "chiusure") non di prima classe, mentre le funzioni stesse lo sono?
Fred Nurk,

@Fred Nurk: se limiti l'unica cosa che puoi fare con una funzione è renderli una chiusura, allora certo. Ma per me è come dire se la tua piattaforma supporta l'aggiunta di numeri interi solo importando una libreria. Quindi i numeri interi sono cittadini di prima classe, ma l'aggiunta di numeri interi non viene considerata. A mio avviso, la chiusura è un'operazione che può essere eseguita su una funzione che restituisce effettivamente una nuova funzione (ma dipende da come la definisci). Ma chiusura e rilegatura sono solo due operazioni quante altre escludiamo dalla discussione (non sono sicuro che fosse una domanda).
Martin York,

@Martin: non devo spiegarmi chiaramente. Dato che "una caratteristica è un cittadino di prima classe se implementata esclusivamente dal linguaggio", le funzioni sia in C che in C ++ sono implementate esclusivamente dal linguaggio e sarebbero quindi di prima classe. Le funzioni associate (che possono anche essere chiamate "chiusure") sono ciò di cui stai parlando con parametri di associazione, ecc., Ma questa è una caratteristica diversa.
Fred Nurk,

-1

Per aggiungere un esempio alle risposte già fornite:

In WCF / C # attualmente è necessario contrassegnare un oggetto di classe con un attributo del contratto di servizio per farlo funzionare come servizio. Non esiste:

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

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

Spero che sia di aiuto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.