Kapan fitur dianggap sebagai "warga negara kelas satu" dalam bahasa pemrograman / platform?

61

Saya telah melihat berkali-kali pernyataan seperti- "Tolong jadikan fitur ini sebagai warga negara kelas satu dalam bahasa dan platform". Sebagai contoh, dikatakan tentang enum di C # /. Net. Jadi, kapan fitur dianggap sebagai "warga negara kelas satu" dalam bahasa pemrograman / platform?

Gulshan
sumber

Jawaban:

40

Definisi

Objek adalah kelas ketika itu:

  • dapat disimpan dalam variabel dan struktur data
  • dapat dikirimkan sebagai parameter ke subrutin
  • dapat dikembalikan sebagai hasil dari subrutin
  • dapat dibangun saat runtime
  • memiliki identitas intrinsik (terlepas dari nama yang diberikan)

Istilah "objek" digunakan secara longgar di sini, tidak harus merujuk ke objek dalam pemrograman berorientasi objek. Tipe data skalar yang paling sederhana, seperti bilangan integer dan floating-point, hampir selalu kelas satu.

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

Waquo
sumber
1
Jadi, apa yang membuat enum objek kelas dua di .net / C #?
Gulshan
7
@Gulshan - Anda bisa membantah kurangnya identitas intrinsik - C # enum pada dasarnya hanya gula sintaksis (yaitu "nama yang diberikan") untuk nilai integer. Bandingkan dengan Java, di mana enum adalah objek dengan haknya sendiri.
mikera
@mikera, dalam. NET enums adalah nilai dalam hak mereka sendiri. Java tidak memiliki nilai, hanya objek, itulah satu-satunya perbedaan.
SK-logic
@mikera: Meskipun itu mencegah enum Jawa dari memiliki beberapa properti bagus seperti dapat mewakili bidang bit dengan mereka. Walaupun implementasinya mungkin lebih berkelas-y, sebagian besar API mereka masih memiliki banyak konstanta integer (atau string) dan banyak penggunaannya tidak dapat dengan mudah diganti dengan enum.
Joey
Saya tidak berpikir enum dapat dibangun saat runtime di. Net, bukan? Saya pikir mereka selalu konstanta.
travis
33

Gagasan "warga negara kelas satu" atau "elemen kelas satu" dalam bahasa pemrograman diperkenalkan oleh ilmuwan komputer Inggris Christopher Strachey pada 1960-an dalam konteks fungsi kelas satu. Formulasi paling terkenal dari prinsip ini mungkin dalam Struktur dan Interpretasi Program Komputer oleh Gerald Jay Sussman dan Harry Abelson:

  • Mereka dapat dinamai dengan variabel.
  • Mereka dapat diteruskan sebagai argumen untuk prosedur.
  • Mereka dapat dikembalikan sebagai hasil dari prosedur.
  • Mereka dapat dimasukkan dalam struktur data.

Pada dasarnya, ini berarti bahwa Anda dapat melakukan semua elemen bahasa pemrograman ini dengan semua elemen lain dalam bahasa pemrograman.

Ini semua tentang "persamaan hak": Anda dapat melakukan semua hal di atas, dengan, katakanlah, bilangan bulat, jadi mengapa hal lain harus berbeda?

Definisi di atas agak membatasi dalam arti bahwa itu hanya benar-benar berbicara tentang aspek kelas sebagai yang terkait dengan menjadi objek program. Definisi yang lebih umum adalah bahwa sesuatu itu kelas satu jika Anda dapat melakukan semuanya dengan itu Anda juga dapat melakukan dengan hal-hal lain yang sejenis.

Sebagai contoh, operator Java dan metode Java adalah sejenis. Anda dapat mendefinisikan metode baru, Anda dapat (agak) bebas memilih nama-nama metode Anda sendiri, Anda dapat mengganti metode, Anda dapat membebani metode. James Gosling dapat melakukan semua itu dengan operator juga, tetapi Anda dan saya tidak bisa. Maksudku, bertentangan dengan kepercayaan populer, Jawa melakukan operator overloading dukungan: misalnya, +operator kelebihan beban untuk byte, short, int, long, float, doubledan String, dan IIRC di Jawa 7 juga untuk BigIntegerdan BigDecimal(dan mungkin beberapa saya lupa), hanya saja Andatidak memiliki pengaruh terhadapnya. Itu jelas membuat operator kelas dua sesuai dengan definisi kedua ini. Perhatikan bahwa metode masih bukan objek kelas satu sesuai dengan definisi pertama. (Apakah itu membuat operator kelas tiga?)

Jörg W Mittag
sumber
6

Biasanya ini merujuk pada konstruk yang dapat dilewati sebagai parameter, dapat didefinisikan sebagai tipe pengembalian dari suatu fungsi atau dapat diberi nilai. Biasanya Anda harus dapat membangunnya saat runtime. Sebagai contoh turunan dari kelas akan menjadi warga negara kelas pertama di c ++ atau java, tetapi fungsi di C tidak akan.

Pemda
sumber
Apa yang membuat kelas menjadi warga negara kelas pertama di c ++?
Bjarke Freund-Hansen
2
@ bjarkef: Kedengarannya seperti itu sudah dijawab dengan mencocokkan deskripsi yang ditawarkan dalam kalimat sebelumnya.
doppelgreener
@ Jonathan: Ya, maaf, saya salah membaca "konstruksinya saat runtime". Ya, Anda dapat membuat instance kelas saat runtime (objek), tetapi tidak kelas itu sendiri. Itulah yang membingungkan saya.
Bjarke Freund-Hansen
1
Melewati parameter masih belum cukup. Dalam C / C ++ saya masih akan mempertimbangkan fungsi sebagai warga negara kelas dua. Mereka dapat dilewatkan sebagai parameter, dikembalikan sebagai hasil yang ditempatkan di dalam objek lain. Tetapi mereka tidak dapat dimanipulasi tanpa bantuan konstruksi lain (seperti std :: bind diperlukan untuk mengikat parameter ke suatu fungsi).
Martin York
@ Martin Saya tidak pernah mengatakan bahwa fungsi adalah warga negara kelas satu di C / C ++.
Pemdas
1

Saya akan mengatakan fitur adalah warga negara kelas satu jika diterapkan semata-mata oleh bahasa.
yaitu tidak memerlukan fitur banyak bahasa atau pustaka standar untuk mengimplementasikan fitur itu.

Contoh:

Dalam C / C ++ saya tidak menganggap fungsi sebagai warga negara kelas satu (orang lain mungkin).
Ini karena ada cara untuk memanipulasi fungsi yang didukung secara langsung oleh bahasa tetapi memerlukan penggunaan fitur bahasa lainnya. Mengikat parameter ke suatu fungsi tidak secara langsung didukung dan Anda harus membangun functor untuk mengimplementasikan fitur ini.

Martin York
sumber
1
Bukankah itu membuat fungsi terikat (atau "penutupan") tidak menjadi kelas satu, sedangkan fungsi itu sendiri? Bagaimana dukungan 0x untuk faktor penutupan dalam analisis Anda?
Fred Nurk
@Fred Nurk: Semuanya tergantung bahasa. Dalam beberapa bahasa, penutupan adalah sistem kelas satu. Yang lain tidak. Saya belum cukup terbiasa dengan C ++ 0x untuk membuat komentar eksplisit.
Martin York
Katakanlah bahasanya adalah C atau C ++ (tetapi bukan 0x), seperti pada jawaban Anda. Bukankah definisi Anda tentang "kelas satu" membuat fungsi terikat (atau "penutupan") tidak menjadi kelas satu, sedangkan fungsi itu sendiri?
Fred Nurk
@Fred Nurk: Jika Anda membatasi satu-satunya hal yang dapat Anda lakukan dengan suatu fungsi adalah membuat mereka menjadi penutup, maka pasti. Tetapi bagi saya itu seperti mengatakan jika platform Anda mendukung penambahan bilangan bulat hanya dengan mengimpor perpustakaan. Maka bilangan bulat adalah warga negara kelas satu tetapi penambahan bilangan bulat tidak dipertimbangkan. Dalam pandangan saya penutupan adalah operasi yang dapat dilakukan pada fungsi yang secara efektif mengembalikan fungsi baru (tapi itu tergantung bagaimana Anda mendefinisikannya). Tetapi penutupan dan pengikatan hanyalah dua operasi, berapa banyak yang tidak termasuk dalam diskusi (saya tidak yakin itu pertanyaan).
Martin York
@ Martin: Saya tidak harus menjelaskan diri saya dengan jelas. Mengingat "sebuah fitur adalah warga negara kelas satu jika diterapkan semata-mata oleh bahasa", maka fungsi dalam C dan C ++ diimplementasikan semata-mata oleh bahasa dan dengan demikian akan menjadi kelas satu. Fungsi Bound (yang juga bisa disebut "closure") adalah apa yang Anda bicarakan dengan parameter pengikat, dll., Tapi itu fitur yang berbeda.
Fred Nurk
-1

Untuk menambahkan contoh ke jawaban yang sudah disediakan:

Di WCF / C # Anda saat ini harus menandai objek kelas dengan atribut kontrak layanan agar beroperasi sebagai layanan. Tidak ada yang namanya:

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

Kelas adalah warga negara kelas satu di c #, di mana layanan tidak.

Semoga ini membantu

Syg
sumber