Ho visto molte volte affermazioni del tipo: “Per favore, rendi questa caratteristica un cittadino di prima classe in tale lingua / piattaforma”. Ad esempio, si dice delle enumerazioni in C # /. Net. Quindi, quando una funzionalità è considerata un “cittadino di prima classe” in un linguaggio / piattaforma di programmazione?

Commenti

Risposta

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 runtime
  • ha unidentità intrinseca (indipendente da qualsiasi nome)

Il termine “oggetto” è usato liberamente qui, non si riferisce necessariamente agli oggetti nella programmazione orientata agli oggetti. I tipi di dati scalari più semplici, come i numeri interi e in virgola mobile, sono quasi sempre di prima classe.

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

Commenti

  • Allora, cosa rende enum un oggetto di seconda classe in .net / C #?
  • @Gulshan – potresti sostenere la mancanza di identità intrinseca – le enumerazioni C # sono fondamentalmente solo zucchero sintattico (cioè un ” dato nome “) per un valore intero. Confronta con Java, dove le enumerazioni sono oggetti a sé stanti.
  • @mikera, in .NET le enumerazioni sono valori a sé stanti. Java semplicemente non ha valori, solo oggetti, che ‘ è lunica differenza.
  • @mikera: anche se questo impedisce Java ‘ s enum dallavere alcune proprietà carine come essere in grado di rappresentare campi di bit con loro. Sebbene la loro implementazione sia probabilmente più di prima classe, la maggior parte delle loro API ha ancora molte costanti intere (o stringa) e molti usi di queste non possono essere facilmente sostituite con le enumerazioni.
  • I don ‘ Non credo che le enumerazioni possano essere costruite a runtime in .Net, vero? Pensavo fossero sempre costanti.

Risposta

La nozione di ” cittadino di prima classe ” o ” elemento di prima classe ” in un linguaggio di programmazione è stato introdotto dallo scienziato informatico britannico Christopher Strachey negli anni 60 nel contesto del primo -class funzioni. La formulazione più famosa di questo principio è probabilmente in Struttura e interpretazione dei programmi per computer di Gerald Jay Sussman e Harry Abelson:

  • Possono essere denominati da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti come risultati di procedure.
  • Possono essere incluse nelle strutture dati.

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

Si tratta di ” uguali diritti “: puoi fare tutto quanto sopra, diciamo, con numeri interi, quindi perché qualsiasi altra cosa dovrebbe essere diversa?

La definizione sopra è un po restrittiva nel senso che è solo veramente parla dellaspetto di primordine in relazione allessere oggetti del programma Una definizione più generale sarà Potrebbe essere che una cosa sia di prima classe se puoi fare tutto con essa puoi anche fare con altre cose di tipo simile.

Ad esempio, gli operatori Java ei metodi Java sono di tipo simile. Puoi definire nuovi metodi, puoi (un po ) 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 io e te non possiamo “. Intendo dire, contrariamente alla credenza popolare, Java non supporta il sovraccarico degli operatori: per esempio , loperatore + è sovraccarico per byte, short, int, long, float, double e String e IIRC in Java 7 anche per BigInteger e BigDecimal (e probabilmente un paio che ho dimenticato), è solo che tu non hai alcuna influenza su di esso.Ciò rende chiaramente gli operatori di seconda classe secondo 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?)

Commenti

  • Ottima risposta. Quindi, ad esempio, i pipenv docs dicono ” Windows è un cittadino di prima classe, nel nostro mondo. ” Ciò significherebbe che puoi fare tutto con pipenv su Windows che puoi anche fare con Linux?
  • No, non ‘ credo che luso del termine ” cittadino di prima classe ” ha qualcosa a che fare con la Teoria formale del linguaggio di programmazione definizione del termine. Penso che pipenv stia usando il termine con il suo normale significato inglese standard.
  • Come ” trattato in modo equo? ” Grazie per il tuo aiuto.

Risposta

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

Commenti

  • Cosa rende una classe un cittadino di prima classe in c ++?
  • @bjarkef: Sembra che sia già stata data una risposta dalla sua corrispondenza con la descrizione offerta nelle frasi precedenti.
  • @Jonathan: Sì, scusa, ho letto male le ” costruirle in fase di runtime “. Sì, puoi costruire unistanza di una classe in fase di esecuzione (un oggetto), ma non la classe stessa. Questo è ciò che mi ha confuso.
  • Passare 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 inseriti allinterno di altri oggetti. Ma non possono essere manipolati senza laiuto di altri costrutti (come std :: bind è necessario per associare i parametri a una funzione).
  • @Martin Non ho mai detto che le funzioni fossero cittadini di prima classe in C / C ++ .

Risposta

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

Esempio:

In C / C ++ non considero le funzioni come prime class citizen (altri potrebbero).
Questo perché ci sono modi per manipolare funzioni che sono supportate direttamente dal linguaggio ma richiedono luso di altre caratteristiche del linguaggio. Lassociazione di parametri a una funzione non è direttamente supportata ed è necessario creare un funtore per implementare questa funzione.

Commenti

  • Non ‘ t che rendono le funzioni associate (o le ” chiusure “) non sono di prima classe, mentre le funzioni stesse lo sono? In che modo il supporto di 0x ‘ per le chiusure influisce nella tua analisi?
  • @Fred Nurk: Dipende tutto dalla lingua. In alcune lingue le chiusure sono sistemi di prima classe. In altri no. Non ho ancora familiarità con C ++ 0x per fare un commento esplicito.
  • Lascia che ‘ s dica che il linguaggio è C o C ++ (ma non 0x ), come tu rispondi. ‘ t la tua definizione di ” di prima classe ” creerebbe funzioni associate (o ” chiusure “) non essere di prima classe, mentre le funzioni stesse lo sono?
  • @Fred Nurk: se limiti lunica cosa che puoi fare con una funzione è renderle una chiusura, quindi sicuro. Ma per me che ‘ è come dire che se la tua piattaforma supporta laggiunta di interi solo importando una libreria. Quindi gli interi sono cittadini di prima classe ma laggiunta di interi non è considerata. A mio avviso la chiusura è unoperazione che può essere eseguita su una funzione che effettivamente restituisce una nuova funzione (ma dipende da come la si definisce). Ma chiusura e rilegatura sono solo due operazioni quante altre stiamo escludendo dalla discussione (non sono sicuro che fosse una domanda).
  • @Martin: non devo spiegarmi chiaramente. Dato ” una funzionalità è un cittadino di prima classe se è implementata esclusivamente dal linguaggio “, vengono implementate le funzioni sia in C che in C ++ unicamente dalla lingua e sarebbe quindi di prima classe. Le funzioni associate (che possono anche essere chiamate ” chiusure “) sono ciò che ‘ re parlando di parametri di associazione, ecc., ma quella ‘ è una caratteristica diversa.

Risposta

Per aggiungere un esempio alle risposte già fornite:

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

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

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

Spero questo aiuta

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *