Mnohokrát jsem viděl výroky jako – „Prosím, udělejte z této funkce prvotřídního občana v tak či onak jazyce / platformě“. Například se říká o enums v C # /. Net. Kdy je tedy funkce v programovacím jazyce / platformě považována za „občana první třídy“?
Komentáře
- BTW: termín “ občan první třídy “ se doporučuje např. google styleguide pro inkluzivní jazyk jako sociálně nabitý výraz: developers.google.com/style/inclusive-documentation
Odpověď
Definice
Objekt je prvotřídní, když:
- lze uložit do proměnných a datových struktur
- lze předat jako parametr podprogramu
- lze jej vrátit jako výsledek podprogramu
- lze sestavit za běhu
- má vlastní identitu (nezávislou na jakémkoli křestním jménu)
pojem „objekt“ je zde použit volně, nemusí nutně odkazovat na objekty v objektově orientovaném programování. Nejjednodušší skalární datové typy, jako jsou celá čísla a čísla s plovoucí desetinnou čárkou, jsou téměř vždy prvotřídní.
http://en.wikipedia.org/wiki/First_class_object
Komentáře
- Takže, co dělá výčet objektu druhé třídy v .net / C #?
- @Gulshan – můžete argumentovat nedostatkem vnitřní identity – výčty C # jsou v podstatě jen syntaktický cukr (tj. “ křestní jméno „) pro celočíselnou hodnotu. Porovnejte s Javou, kde jsou výčty samy o sobě objekty.
- @mikera, v .NET jsou výčty samy o sobě hodnoty. Java prostě nemá žádné hodnoty, pouze objekty, které ‚ jsou jediným rozdílem.
- @mikera: I když to brání prostředí Java ‚ s vychází z toho, že má některé pěkné vlastnosti, jako je schopnost s nimi reprezentovat bitová pole. Zatímco jejich implementace je pravděpodobně prvotřídní, většina jejich API má stále spoustu celočíselných (nebo řetězcových) konstant a mnoho jejich použití nelze snadno nahradit enumy.
- Nemám ‚ si nemyslí, že výčty mohou být konstruovány za běhu v .Net, že? Myslel jsem, že jsou to vždy konstanty.
Odpověď
Pojem “ prvotřídní občan “ nebo “ prvotřídní prvek “ v programovacím jazyce představil britský počítačový vědec Christopher Strachey v 60. letech v kontextu prvního – funkce třídy. Nejslavnější formulace tohoto principu je pravděpodobně ve Struktuře a interpretaci počítačových programů Geralda Jay Sussmana a Harryho Abelsona:
- Mohou být pojmenovány proměnnými.
- Mohou být předávány jako argumenty postupům.
- Mohou být vráceny jako výsledky postupy.
- Mohou být zahrnuty v datových strukturách.
V zásadě to znamená, že s tím můžete dělat. prvek programovacího jazyka vše, co můžete dělat se všemi ostatními prvky v programovacím jazyce.
Je to vše o “ stejných právech „: Všechno výše uvedené můžete dělat, řekněme s celými čísly, tak proč by měla být jiná věc odlišná?
Výše uvedená definice je trochu omezující v tom smyslu, že pouze ve skutečnosti hovoří o aspektu prvotřídnosti ve vztahu k tomu, že je objektem programu. Obecnější definice wou Bude to, že věc je prvotřídní, pokud s ní dokážete všechno, ale také s jinými věcmi podobného druhu.
Například operátoři Java a metody Java jsou podobného druhu. Můžete definovat nové metody, můžete si (poněkud) svobodně zvolit názvy svých vlastních metod, můžete přepsat metody, můžete metody přetížit. James Gosling to všechno dokáže i s operátory, ale vy a já nemůžeme. Myslím, na rozdíl od všeobecného přesvědčení, Java podporuje přetížení operátorů: například , operátor +
je přetížen pro byte
, short
, int
, long
, float
, double
a String
a IIRC v Javě 7 také pro BigInteger
a BigDecimal
(a pravděpodobně pár, které jsem zapomněl), je to jen to, že nemáte na to žádný vliv.To podle této druhé definice jednoznačně činí operátory druhou třídou. Všimněte si, že metody stále nejsou prvotřídními objekty podle první definice. (Znamená to, že jsou operátoři třetí třídou?)
Komentáře
- Skvělá odpověď. Takže například pipenv docs říká “ Windows je občanem první třídy, v našem světě. “ Znamenalo by to, že můžete dělat vše s
pipenv
v systému Windows, což můžete dělat i v systému Linux? - Ne, nemyslím si ‚ že použití výrazu “ prvotřídního občana “ má co do činění s formální definicí pojmu Teorie programovacího jazyka . Myslím, že pipenv právě používá tento výraz s jeho běžným standardním anglickým významem.
- Jako v “ zacházeno spravedlivě? “ Děkujeme za vaši pomoc.
Odpověď
Obvykle toto doporučení rs na konstrukci, která je pasivní jako parametr, může být definována jako návratový typ z funkce nebo jí může být přiřazena hodnota. Normálně musíte být schopni je postavit za běhu. Například instancí třídy by byl občan první třídy v jazyce C ++ nebo Java, ale funkce v jazyce C by neměla být.
Komentáře
- Co dělá třídu občanem první třídy v jazyce C ++?
- @bjarkef: Zdá se, že to už bylo zodpovězeno tím, že odpovídá popisu nabízenému v předchozích větách.
- @Jonathan: Ano, omlouvám se, špatně jsem je přečetl “ za běhu „. Ano, můžete vytvořit instanci třídy za běhu (objekt), ale ne samotnou třídu. To mě zmátlo.
- Předávání parametrem stále nestačí. V C / C ++ bych i nadále považoval funkce za občany druhé třídy. Mohou být předány jako parametry, vráceny jako výsledky umístěné uvnitř jiných objektů. Nelze s nimi ale manipulovat bez pomoci jiných konstruktů (jako je třeba std :: bind pro svázání parametrů s funkcí).
- @Martin Nikdy jsem neřekl, že funkce byly občany první třídy v C / C ++ .
Odpověď
Řekl bych, že funkce je občanem první třídy, pokud je implementována pouze jazykem .
tj. k implementaci této funkce nevyžaduje vícejazyčné funkce ani standardní knihovnu.
Příklad:
V C / C ++ nepovažuji funkce za první občan třídy (ostatní mohou).
Je to proto, že existují způsoby, jak manipulovat s funkcemi, které jsou přímo podporovány jazykem, ale vyžadují použití dalších jazykových funkcí. Vazba parametrů na funkci není přímo podporována a pro implementaci této funkce musíte vytvořit funktor.
Komentáře
- Nebyl by t, které zajišťují, aby vázané funkce (nebo “ uzávěry „) nebyly prvotřídní, zatímco samotné funkce jsou? Jak se při analýze promítá podpora zavírání 0x ‚?
- @Fred Nurk: Vše záleží na jazyce. V některých jazycích jsou uzávěry prvotřídními systémy. V ostatních ne. Nejsem dostatečně obeznámen s C ++ 0x, abych mohl explicitně komentovat.
- Řekněme ‚, že jazyk je buď C nebo C ++ (ale ne 0x ), jak jste odpověděli. Nechtěl ‚ definovat “ prvotřídní “ vázané funkce (nebo “ uzávěry „) nebudou prvotřídní, zatímco samotné funkce jsou?
- @Fred Nurk: Pokud omezujete Jediná věc, kterou můžete s funkcí udělat, je udělat je zavírací, pak jistě. Ale pro mě to ‚ rád říká, když platforma podporuje přidání celých čísel pouze importem knihovny. Celá čísla jsou pak občany první třídy, ale přidání celých čísel se neuvažuje. Podle mého názoru je uzavření operace, kterou lze provést na funkci, která efektivně vrací novou funkci (ale záleží na tom, jak ji definujete). Uzávěrka a vazba jsou ale jen dvě operace, kolik dalších z diskuse vylučujeme (nejsem si jist, zda to byla otázka).
- @Martin: Nesmím to vysvětlovat jasně. Vzhledem k “ je funkce občanem první třídy, pokud je implementována pouze jazykem „, jsou implementovány funkce v C i C ++ pouze jazykem a byl by tak prvotřídní. Vázané funkce (které lze také nazvat “ uzávěry „) jsou to, co ‚ znovu mluvení o parametrech vazby atd., ale to je ‚ jiná vlastnost.
Odpověď
Přidání příkladu k již poskytnutým odpovědím:
Ve WCF / C # aktuálně musíte označit objekt třídy atributem kontraktu služby, aby fungoval jako služba. Neexistuje nic jako:
public **service** MyService (in relation public **class** MyClass).
Třída je občanem první třídy v jazyce C #, kde služba není.
Doufám to pomáhá