Prvotřídní občan - First-class citizen
V návrhu programovacího jazyka je občan první třídy (také typ , objekt , entita nebo hodnota ) v daném programovacím jazyce entita, která podporuje všechny operace obecně dostupné jiným entitám. Tyto operace obvykle zahrnují předání jako argument, vrácení z funkce, úpravu a přiřazení proměnné.
Dějiny
Pojem objektů první a druhé třídy představil Christopher Strachey v 60. letech minulého století. Ve skutečnosti tento termín nedefinoval striktně, ale porovnával skutečná čísla a postupy v ALGOLU :
Objekty první a druhé třídy. V ALGOL se skutečné číslo může objevit ve výrazu nebo může být přiřazeno proměnné a jeden z nich se může objevit jako skutečný parametr při volání procedury. Procedura se naopak může objevit pouze v jiném volání procedury buď jako operátor (nejběžnější případ), nebo jako jeden ze skutečných parametrů. Neexistují žádné další výrazy zahrnující postupy nebo jejichž výsledky jsou postupy. V jistém smyslu jsou tedy procedury v ALGOLu občany druhé třídy - vždy se musí dostavit osobně a nikdy nemohou být zastoupeny proměnnou nebo výrazem (kromě případu formálního parametru) ...
Robin Popplestone uvedl následující definici: Všechny položky mají určitá základní práva.
- 1. Všechny položky mohou být skutečnými parametry funkcí
- 2. Všechny položky lze vrátit jako výsledky funkcí
- 3. Všechny položky mohou být předmětem prohlášení o zadání
- 4. Všechny položky lze testovat na rovnost.
V průběhu 90. let navrhoval Raphael Finkel definice hodnot druhé a třetí třídy, ale tyto definice nebyly široce přijímány.
Příklady
Nejjednodušší skalární datové typy, jako jsou celá čísla a čísla s plovoucí desetinnou čárkou, jsou téměř vždy prvotřídní.
V mnoha starších jazycích nejsou pole a řetězce prvotřídní: nemohou být přiřazeny jako objekty nebo předávány jako parametry podprogramu. Například Fortran IV ani C nepodporuje přiřazení polí, a když jsou předány jako parametry, ve skutečnosti je předána pouze poloha jejich prvního prvku - jejich velikost je ztracena. Zdá se, že C podporuje přiřazení ukazatelů pole , ale ve skutečnosti se jedná pouze o ukazatele na první prvek pole a opět nenesou velikost pole.
Ve většině jazycích, datové typy nejsou objekty prvotřídní, i když v některých objektově orientovaných jazycích, třídy jsou objekty první třídy a jsou případy Metaclasses .
Několik jazyků podporuje pokračování a označení GOTO jako objekty vůbec, natož jako prvotřídní objekty.
| Pojem | Popis | Jazyky |
|---|---|---|
| prvotřídní funkce | zavírání a anonymní funkce | Dart , Scheme , ML , Haskell , F# , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust |
| prvotřídní ovládání | pokračování | Schéma , ML , F# |
| prvotřídní typ | závislé typy | Coq , Idris , Agda |
| prvotřídní datový typ | Obecný Haskell , C ++ 11 | |
| prvotřídní polymorfismus | impresivní polymorfismus | |
| prvotřídní zpráva | dynamické zprávy (volání metod) | Smalltalk , Cíl-C |
| prvotřídní třída | metaclass | Smalltalk , Objective-C , Ruby , Python , Delphi |
| prvotřídní důkazy | důkazní předmět | Coq , Agda |
Funkce
Mnoho programovacích jazyků podporuje předávání a vracení hodnot funkcí, které lze použít na argumenty. Zda to stačí k volání funkčních hodnot první třídy, je sporné.
Někteří autoři vyžadují, aby bylo možné za běhu vytvářet nové funkce, které by je nazývaly „prvotřídní“. V důsledku toho nejsou funkce v jazyce C prvotřídními objekty; místo toho se jim někdy říká objekty druhé třídy , protože s nimi lze stále manipulovat ve většině výše uvedených módů (pomocí ukazatelů funkcí ).
V Smalltalk jsou funkce (metody) objekty první třídy, stejně jako třídy Smalltalk. Protože operátory Smalltalk (+, -atd.) Jsou metody, jsou to také prvotřídní objekty.
Odraz
Některé jazyky, jako například Java a PHP , mají explicitní reflexní subsystém, který umožňuje přístup k interním implementačním strukturám, přestože nejsou přístupné ani manipulovatelné stejným způsobem jako běžné objekty.