Wiele razy widziałem takie stwierdzenia jak: „Proszę, uczyń tę funkcję obywatelem pierwszej klasy w takim a takim języku / platformie”. Na przykład mówi się o wyliczeniach w C # / .net. Kiedy więc obiekt jest uważany za „obywatela pierwszej kategorii” w języku / platformie programowania?

Komentarze

Odpowiedź

Definicja

Obiekt jest pierwszej klasy, gdy:

  • mogą być przechowywane w zmiennych i strukturach danych
  • mogą być przekazywane jako parametr do podprogramu
  • mogą być zwracane jako wynik podprogramu
  • może być konstruowany w czasie wykonywania
  • ma wewnętrzną tożsamość (niezależnie od jakiejkolwiek nazwy)

Termin „obiekt” jest tutaj używany luźno, niekoniecznie odnosząc się do obiektów w programowaniu obiektowym. Najprostsze skalarne typy danych, takie jak liczby całkowite i zmiennoprzecinkowe, są prawie zawsze pierwszej klasy.

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

Komentarze

  • Co sprawia, że wyliczenia są obiektem drugiej klasy w .net / C #?
  • @Gulshan – można by argumentować o braku wewnętrznej tożsamości – wyliczenia w C # to po prostu cukier składniowy (tj. ” podana nazwa „) dla wartości całkowitej. Porównaj z Javą, gdzie wyliczenia są same w sobie obiektami.
  • @mikera, w wyliczeniach .NET są wartościami same w sobie. Java po prostu nie ma żadnych wartości, tylko obiekty, które ' są jedyną różnicą.
  • @mikera: Chociaż to uniemożliwia Javę ' wyliczenia mają kilka fajnych właściwości, takich jak możliwość reprezentowania ich pól bitowych. Chociaż ich implementacja jest prawdopodobnie bardziej pierwszorzędna-y, większość ich interfejsów API nadal ma wiele stałych całkowitych (lub łańcuchowych), a wielu ich zastosowań nie można łatwo zastąpić wyliczeniami.
  • Nie ' Nie sądzę, że wyliczenia można konstruować w czasie wykonywania w .Net, prawda? Myślałem, że zawsze były to stałe.

Odpowiedź

Pojęcie ” obywatel pierwszej klasy ” lub ” element pierwszej klasy ” w języku programowania został wprowadzony przez brytyjskiego informatyka Christophera Stracheya w latach sześćdziesiątych XX wieku w kontekście pierwszego -klasowe funkcje. Najsłynniejszym sformułowaniem tej zasady jest prawdopodobnie Struktura i interpretacja programów komputerowych autorstwa Geralda Jaya Sussmana i Harryego Abelsona:

  • Mogą być nazywane zmiennymi.
  • Mogą być przekazywane jako argumenty do procedur.
  • Mogą być zwracane jako wynik procedury.
  • Mogą być zawarte w strukturach danych.

Zasadniczo oznacza to, że możesz to zrobić element języka programowania wszystko, co możesz zrobić ze wszystkimi innymi elementami języka programowania.

Chodzi o ” równe prawa „: możesz zrobić wszystkie powyższe, powiedzmy, liczbami całkowitymi, więc dlaczego cokolwiek miałoby być inne?

Powyższa definicja jest nieco restrykcyjna w tym sensie, że tak naprawdę mówi o aspekcie pierwszorzędności w odniesieniu do bycia przedmiotem programu Być może rzecz jest pierwszorzędna, jeśli możesz zrobić z nią wszystko, co możesz też zrobić z innymi rzeczami podobnego rodzaju.

Na przykład operatory Java i metody Java są podobnego rodzaju. Możesz definiować nowe metody, możesz (nieco) dowolnie wybierać nazwy własnych metod, możesz nadpisywać metody, możesz je przeciążać. James Gosling może to wszystko zrobić z operatorami, ale ty i ja nie możemy. Mam na myśli, wbrew powszechnemu przekonaniu, Java obsługuje przeciążenie operatorów: na przykład , operator + jest przeciążony dla byte, short, int, long, float, double i String i IIRC w Javie 7 także dla BigInteger i BigDecimal (i prawdopodobnie kilku, o których zapomniałem), po prostu ty nie masz na to żadnego wpływu.To wyraźnie sprawia, że operatorzy są drugiej kategorii zgodnie z tą drugą definicją. Zauważ, że metody nadal nie są obiektami pierwszej klasy zgodnie z pierwszą definicją. (Czy to sprawia, że operatory są trzecią klasą?)

Komentarze

  • Świetna odpowiedź. Na przykład w dokumentach pipenv powiedz: ” Windows jest obywatelem pierwszej kategorii, w naszym świecie. ” Czy to sugeruje, że w pipenv w systemie Windows możesz zrobić wszystko, co możesz zrobić również w systemie Linux?
  • Nie, nie ' nie sądzę, że użycie terminu ” obywatel pierwszej klasy ” ma cokolwiek wspólnego z formalną teorią języka programowania definicją terminu. Myślę, że pipenv po prostu używają tego terminu w jego normalnym, standardowym, angielskim znaczeniu.
  • Tak jak w ” traktowanym sprawiedliwie? ” Dziękuję za pomoc.

Odpowiedź

Zwykle to odwołanie rs do konstrukcji, która jest dopuszczalna jako parametr, może być zdefiniowana jako typ zwracany z funkcji lub można jej przypisać wartość. Zwykle musisz mieć możliwość ich skonstruowania w czasie wykonywania. Na przykład instancja klasy byłaby obywatelem pierwszej klasy w języku c ++ lub java, ale funkcja w języku C nie.

Komentarze

  • Co sprawia, że klasa jest obywatelem pierwszej klasy w języku c ++?
  • @bjarkef: Brzmi tak, jakby już udzielono odpowiedzi zgodnie z opisem przedstawionym w poprzednich zdaniach.
  • @Jonathan: Tak, przepraszam, źle odczytałem „, tworząc je w czasie wykonywania „. Tak, możesz skonstruować instancję klasy w czasie wykonywania (obiekt), ale nie samą klasę. To mnie zmyliło.
  • Przekazywanie przez parametr to wciąż za mało. W C / C ++ nadal uważałbym funkcje za obywateli drugiej kategorii. Mogą być przekazywane jako parametry, zwracane jako wyniki umieszczane wewnątrz innych obiektów. Ale nie można nimi manipulować bez pomocy innych konstrukcji (np. Std :: bind jest wymagane do powiązania parametrów z funkcją).
  • @Martin Nigdy nie powiedziałem, że funkcje są obywatelami pierwszej klasy w C / C ++ .

Odpowiedź

Powiedziałbym, że obiekt jest obywatelem pierwszej kategorii, jeśli jest implementowany wyłącznie przez język .
tj. nie wymaga wielu funkcji językowych ani biblioteki standardowej, aby zaimplementować tę funkcję.

Przykład:

W C / C ++ nie uważam funkcji za pierwszą obywatel klasy (inni mogą).
Dzieje się tak, ponieważ istnieją sposoby manipulowania funkcjami, które są obsługiwane bezpośrednio przez język, ale wymagają użycia innych funkcji języka. Wiązanie parametrów z funkcją nie jest bezpośrednio obsługiwane i aby zaimplementować tę funkcję, musisz zbudować funktor.

Komentarze

  • Wouldn ' t które sprawiają, że powiązane funkcje (lub ” domknięcia „) nie są pierwszorzędnymi, podczas gdy same funkcje są? W jaki sposób wsparcie 0x ' dla domknięć wpływa na twoją analizę?
  • @Fred Nurk: Wszystko zależy od języka. W niektórych językach domknięcia są systemami pierwszej klasy. W innych nie. Nie znam jeszcze na tyle C ++ 0x, aby wyrazić wyraźny komentarz.
  • Niech ' powie, że język to C lub C ++ (ale nie 0x ), tak jak odpowiadasz. Czy nie ' t Twoja definicja ” pierwszej klasy ” nie wiązałaby funkcji (lub ” domknięcia „) nie są pierwszorzędne, a same funkcje są?
  • @Fred Nurk: Jeśli ograniczysz jedyną rzeczą, jaką możesz zrobić z funkcją, jest zamknięcie ich. Ale dla mnie to ' przypomina mówienie, że Twoja platforma obsługuje dodawanie liczb całkowitych tylko poprzez import biblioteki. Wtedy liczby całkowite są obywatelami pierwszej kategorii, ale dodawanie liczb całkowitych nie jest brane pod uwagę. Moim zdaniem zamknięcie jest operacją, którą można wykonać na funkcji, która skutecznie zwraca nową funkcję (ale zależy to od tego, jak ją zdefiniujesz). Ale zamknięcie i wiązanie to tylko dwie operacje, ilu innych wykluczamy z dyskusji (nie jestem pewien, czy to było pytanie).
  • @Martin: Nie mogę się jasno tłumaczyć. Biorąc pod uwagę „, funkcja jest obywatelem pierwszej kategorii, jeśli jest zaimplementowana wyłącznie w języku „, funkcje są zaimplementowane zarówno w C, jak i C ++ wyłącznie przez język, a zatem byłby pierwszej klasy. Funkcje związane (które można również nazwać ” domknięcia „) są tym, co ' re mówimy o parametrach wiązania itp., ale to ' to inna funkcja.

Odpowiedź

Aby dodać przykład do już podanych odpowiedzi:

W WCF / C # obecnie musisz oznaczyć obiekt klasy atrybutem kontraktu usługi, aby działał jako usługa. Nie ma czegoś takiego jak:

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

Klasa jest obywatelem pierwszej klasy w języku c #, gdzie nie ma usługi.

Mam nadzieję to pomaga

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *