Pojęcie „pierwszorzędnego obywatela” lub „pierwszorzędnego elementu” w języku programowania zostało wprowadzone przez brytyjskiego informatyka Christophera Stracheya w latach 60. XX wieku w kontekście funkcji najwyższej klasy. Najbardziej znanym sformułowaniem tej zasady jest prawdopodobnie Struktura i interpretacja programów komputerowych Geralda Jaya Sussmana i Harry'ego Abelsona:
- Mogą być nazwane przez zmienne.
- Mogą być przekazywane jako argumenty do procedur.
- Mogą zostać zwrócone jako wyniki procedur.
- Mogą być zawarte w strukturach danych.
Zasadniczo oznacza to, że możesz zrobić z tym elementem języka programowania wszystko, co możesz zrobić ze wszystkimi innymi elementami w języku programowania.
Chodzi o „równe prawa”: możesz wykonać wszystkie powyższe czynności, używając, powiedzmy, liczb całkowitych, więc dlaczego inna rzecz ma być inna?
Powyższa definicja jest nieco restrykcyjna w tym sensie, że naprawdę mówi tylko o aspekcie pierwszorzędności związanym z byciem obiektami programu. Bardziej ogólną definicją byłoby, że rzecz jest najwyższej jakości, jeśli możesz zrobić z nią wszystko, co możesz 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 przeciążać metody. James Gosling może to wszystko zrobić również z operatorami, ale ty i ja nie. To znaczy, wbrew powszechnemu przekonaniu, Java czy przeciążanie operatorów wsparcia: na przykład, +
operator jest przeciążony na byte
, short
, int
, long
, float
, double
i String
, i IIRC w Javie 7 również BigInteger
i BigDecimal
(i zapewne kilka zapomniałem), tylko że ciebienie mam na to żadnego wpływu. To wyraźnie czyni operatorów drugiej klasy według tej drugiej definicji. Zauważ jednak, że metody nadal nie są obiektami pierwszej klasy zgodnie z pierwszą definicją. (Czy to czyni operatorów trzecią klasą?)