Apa objek "kelas satu"?

191

Kapan benda atau sesuatu dikatakan "kelas satu" dalam bahasa pemrograman tertentu, dan mengapa? Dalam apa mereka berbeda dari bahasa di mana mereka tidak?

EDIT. Ketika seseorang mengatakan "semuanya adalah sebuah objek" (seperti dalam Python), apakah ia memang berarti bahwa "semuanya adalah kelas satu"?

Federico A. Ramponi
sumber
1
Apakah mungkin untuk memigrasikan pertanyaan ini ke programmer .SE? Atau akankah itu juga ketidakcocokan di sana? Saya pikir pertanyaan ini bagus. Hanya tidak bisa mengatakan forum mana yang paling cocok untuknya.
Shashank Sawant
16
Dipilih untuk membuka kembali ... sayangnya ini sepertinya ditutup oleh orang-orang yang tidak memprogram, jelas pada topik: /
djechlin

Jawaban:

176

Singkatnya, itu berarti tidak ada batasan pada penggunaan objek. Itu sama dengan benda lainnya.

Objek kelas pertama adalah entitas yang dapat dibuat secara dinamis, dihancurkan, diteruskan ke fungsi, dikembalikan sebagai nilai, dan memiliki semua hak seperti variabel lain dalam bahasa pemrograman miliki.

Bergantung pada bahasanya, ini dapat menyiratkan:

  • menjadi ekspresif sebagai nilai literal anonim
  • dapat disimpan dalam variabel
  • dapat disimpan dalam struktur data
  • memiliki identitas intrinsik (tidak tergantung pada nama yang diberikan)
  • sebanding dengan kesetaraan dengan entitas lain
  • menjadi lumayan sebagai parameter untuk prosedur / fungsi
  • dikembalikan sebagai hasil dari prosedur / fungsi
  • menjadi konstruktif saat runtime
  • sedang dicetak
  • sedang dibaca
  • ditransmisikan di antara proses yang didistribusikan
  • dapat disimpan di luar proses yang sedang berjalan

Sumber .

Namun, dalam fungsi C ++ sendiri bukan objek kelas satu:

  • Anda dapat mengganti operator '()' yang memungkinkan untuk memiliki fungsi objek, yang merupakan kelas pertama.
  • Pointer fungsi adalah kelas pertama.
  • meningkatkan ikatan, lambda dan fungsi memang menawarkan fungsi kelas satu

Dalam C ++, kelas bukan objek kelas satu tetapi contoh kelas tersebut. Dalam Python, kedua kelas dan objek adalah objek kelas satu. (Lihat jawaban ini untuk detail lebih lanjut tentang kelas sebagai objek).

Berikut adalah contoh fungsi kelas pertama Javascript:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

Sumber .

Entitas yang bukan objek kelas satu disebut sebagai objek kelas dua. Fungsi dalam C ++ adalah kelas dua karena mereka tidak dapat dibuat secara dinamis.

Mengenai hasil edit:

EDIT. Ketika seseorang mengatakan "semuanya adalah sebuah objek" (seperti dalam Python), apakah ia memang berarti bahwa "semuanya adalah kelas satu"?

Istilah objek dapat digunakan secara longgar dan tidak menyiratkan menjadi kelas satu. Dan mungkin akan lebih masuk akal untuk menyebut keseluruhan konsep 'entitas kelas satu'. Tetapi dalam Python mereka bertujuan untuk membuat semuanya kelas satu. Saya percaya niat orang yang membuat pernyataan Anda berarti kelas satu.

Brian R. Bondy
sumber
2
Bisakah Anda memberikan beberapa contoh objek yang bukan 'kelas satu'?
Sudip Bhandari
1
@SudipBhandari Saya bertanya-tanya hal yang sama, akhirnya menemukan artikel Wikipedia yang bermanfaat tentang topik ini: warga negara kelas satu / objek . Saya menemukan definisi Robin Popplestone sangat membantu. (Btw, memposting artikel WP mungkin tampak sangat jelas tapi saya tidak menyadari ini adalah konsep bahasa pemrograman yang mendasar)
mblakesley
19

"Ketika seseorang mengatakan" semuanya adalah objek "(seperti dalam Python), apakah dia memang bermaksud bahwa" semuanya adalah kelas satu "?"

Iya.

Segala sesuatu di Python adalah objek yang tepat. Bahkan hal-hal yang merupakan "tipe primitif" dalam bahasa lain.

Anda menemukan bahwa objek seperti 2sebenarnya memiliki antarmuka yang cukup kaya dan canggih.

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']

Karena semuanya adalah objek kelas satu di Python, ada beberapa kasus khusus yang relatif tidak jelas.

Di Jawa, misalnya, ada tipe primitif (int, bool, double, char) yang bukan objek yang tepat. Itu sebabnya Java harus memperkenalkan Integer, Boolean, Double, dan Character sebagai tipe kelas satu. Ini bisa sulit untuk diajarkan kepada pemula - tidak jelas mengapa tipe primitif dan kelas harus ada berdampingan.

Ini juga berarti bahwa kelas objek adalah - itu sendiri - objek. Ini berbeda dari C ++, di mana kelas tidak selalu memiliki keberadaan yang berbeda saat run-time.

Tipe 2adalah type 'int'objek, yang memiliki metode, atribut, dan tipe.

>>> type(2)
<class 'int'>

Jenis tipe bawaan intadalah type 'type'objek. Ini memiliki metode dan atribut juga.

>>> type(type(2))
<class 'type'>
S.Lott
sumber
1
Ini berlaku untuk Python modern. Dalam Python lama (versi 1? Itu sebelum waktu saya), Anda tidak dapat mewarisi dari int. Jadi "lama" versus "kelas gaya baru" (dan dalam 3, tidak ada kelas gaya lama lagi).
Keith Pinson
17

"Kelas satu" berarti Anda dapat beroperasi pada mereka dengan cara yang biasa. Sebagian besar waktu, ini hanya berarti Anda dapat melewati warga negara kelas satu ini sebagai argumen untuk suatu fungsi, atau mengembalikan mereka dari fungsi.

Ini jelas untuk objek tetapi tidak selalu begitu jelas untuk fungsi, atau bahkan kelas:

void f(int n) { return n * 2; }

void g(Action<int> a, int n) { return a(n); }

// Now call g and pass f:

g(f, 10); // = 20

Ini adalah contoh dalam C # di mana fungsi sebenarnya bukan objek kelas satu. Karenanya kode di atas menggunakan solusi kecil (yaitu delegasi generik yang dipanggil Action<>) untuk melewatkan fungsi sebagai argumen. Bahasa lain, seperti Ruby, memungkinkan memperlakukan kelas dan blok kode sebagai variabel normal (atau dalam kasus Ruby, konstanta).

Konrad Rudolph
sumber
17

Dari slide dalam Struktur dan Interpretasi Program Komputer , kuliah 2A (1986), yang pada gilirannya mengutip Christopher Stracey :

Hak dan hak istimewa warga negara kelas satu:

  • Untuk diberi nama oleh variabel.
  • Untuk disampaikan sebagai argumen untuk prosedur.
  • Untuk dikembalikan sebagai nilai prosedur.
  • Untuk dimasukkan ke dalam struktur data
Federico A. Ramponi
sumber
1

IMO ini adalah salah satu metafora yang digunakan untuk menggambarkan hal-hal dalam bahasa alami. Istilah ini pada dasarnya digunakan dalam konteks menggambarkan fungsi sebagai objek kelas satu.

Jika Anda mempertimbangkan bahasa berorientasi objek, kami dapat memberikan berbagai fitur ke objek untuk misalnya: pewarisan, definisi kelas, kemampuan untuk meneruskan ke bagian kode lain (argumen metode), kemampuan untuk menyimpan dalam struktur data dll. Jika kami dapat melakukan sama dengan entitas yang biasanya tidak dianggap sebagai objek, seperti fungsi dalam kasus skrip java, entitas tersebut dianggap sebagai objek kelas satu.

Kelas pertama pada dasarnya di sini berarti, tidak ditangani sebagai kelas kedua (dengan perilaku terdegradasi). Intinya mengejek itu sempurna atau tidak bisa dibedakan.

questzen
sumber