Ini adalah pertanyaan pemula, tetapi saya tidak dapat menemukan jawaban yang cukup untuk pemula di Google.
Apa yang orang maksud ketika mereka mengatakan 'status' - dalam pemrograman secara umum, dan dalam pemrograman OO secara khusus?
Juga, apa yang bisa berubah dan tidak berubah - lagi, umumnya dalam pemrograman dan juga secara khusus dalam OOP?
Jawaban:
Anda memiliki status saat Anda mengaitkan nilai (angka, string, struktur data yang kompleks) ke identitas dan titik waktu.
Misalnya, angka 10 dengan sendirinya tidak mewakili keadaan apa pun: itu hanya angka yang terdefinisi dengan baik dan akan selalu menjadi dirinya sendiri: bilangan asli 10. Sebagai contoh lain, string "HELLO" adalah urutan lima karakter, dan itu sepenuhnya dijelaskan oleh karakter yang dikandungnya dan urutan di mana mereka muncul. Dalam lima juta tahun dari sekarang, string "HELLO" akan tetap menjadi string "HELLO": nilai murni.
Untuk memiliki negara Anda harus mempertimbangkan dunia di mana nilai-nilai murni ini terkait dengan beberapa jenis entitas yang memiliki identitas . Identitas adalah ide primitif: itu berarti Anda dapat membedakan dua hal terlepas dari properti lain yang mungkin mereka miliki. Sebagai contoh, dua mobil dengan model yang sama, warna yang sama, ... adalah dua mobil yang berbeda.
Dengan hal-hal ini dengan identitas, Anda dapat melampirkan properti padanya, dijelaskan oleh nilai-nilai murni. Misalnya, mobil saya memiliki sifat biru. Anda dapat menggambarkan fakta ini dengan mengaitkan pasangan
ke mobil saya. Pasangan ("warna", "biru") adalah nilai murni yang menggambarkan keadaan mobil itu.
Negara tidak hanya terkait dengan entitas tertentu, tetapi juga ke titik waktu tertentu. Jadi, Anda dapat mengatakan bahwa hari ini, mobil saya memiliki status
Besok aku akan mengecatnya dalam warna hitam dan negara baru akan melakukannya
Perhatikan bahwa status suatu entitas dapat berubah, tetapi identitasnya tidak berubah menurut definisi. Ya, selama entitas itu ada, tentu saja: sebuah mobil dapat dibuat dan dihancurkan, tetapi ia akan mempertahankan identitasnya sepanjang masa hidupnya. Tidak masuk akal untuk berbicara tentang identitas sesuatu yang belum ada / lagi.
Jika nilai properti yang dilampirkan pada entitas tertentu berubah seiring waktu, Anda mengatakan bahwa status entitas itu bisa berubah . Kalau tidak, Anda mengatakan bahwa negara tidak dapat diubah .
Implementasi yang paling umum adalah untuk menyimpan keadaan suatu entitas dalam beberapa jenis variabel (variabel global, variabel anggota objek), yaitu untuk menyimpan snapshot keadaan saat ini. Keadaan yang tidak dapat diubah kemudian diimplementasikan menggunakan penugasan: setiap operasi penugasan menggantikan foto sebelumnya dengan yang baru. Solusi ini biasanya menggunakan lokasi memori untuk menyimpan snapshot saat ini. Menimpa lokasi memori adalah operasi destruktif yang menggantikan snapshot dengan yang baru. ( Di sini Anda dapat menemukan pembicaraan yang menarik tentang pendekatan pemrograman berorientasi tempat ini .)
Alternatifnya adalah dengan melihat status (histori) selanjutnya dari suatu entitas sebagai aliran (barangkali urutan tak terbatas) dari nilai-nilai, lihat misalnya Bab 3 dari SICP . Dalam hal ini, setiap foto disimpan di lokasi memori yang berbeda, dan program dapat memeriksa foto yang berbeda secara bersamaan. Snapshots yang tidak terpakai dapat dikumpulkan dari sampah saat tidak diperlukan lagi.
Keuntungan / kerugian dari kedua pendekatan tersebut
map
danfilter
.sumber
Negara hanyalah informasi tentang sesuatu yang tersimpan dalam ingatan.
Sebagai latihan sederhana dalam orientasi objek, pikirkan kelas sebagai pemotong kue, dan cookie sebagai objek. Anda dapat membuat cookie (instantiate objek) menggunakan cookie cutter (kelas). Katakanlah salah satu sifat cookie adalah warnanya (yang dapat diubah dengan menggunakan pewarna makanan). Warna cookie itu adalah bagian dari kondisinya, seperti properti lainnya.
Keadaan tidak berubah adalah keadaan yang dapat diubah setelah Anda membuat objek (cookie). Keadaan abadi adalah keadaan yang tidak bisa diubah.
Objek yang tidak dapat diubah (yang tidak dapat diubah oleh negara bagian) menjadi penting ketika Anda berurusan dengan konkurensi, kemampuan lebih dari satu prosesor di komputer Anda untuk beroperasi pada objek itu secara bersamaan. Immutability menjamin bahwa Anda dapat mengandalkan negara agar stabil dan valid selama masa pakai objek.
Secara umum, keadaan suatu objek disimpan dalam "variabel pribadi atau anggota," dan diakses melalui "properti" atau metode pengambil / penyetel.
sumber
Saya pikir istilah "negara" (sebagai lawan dari jenis negara konkret seperti "variabel anggota") paling berguna ketika membandingkan API stateful dengan yang tanpa negara. Mencoba mendefinisikan "keadaan" tanpa menyebutkan API sedikit seperti mencoba mendefinisikan "variabel" atau "fungsi" tanpa menyebutkan bahasa pemrograman; sebagian besar jawaban yang benar hanya masuk akal bagi orang-orang yang sudah tahu apa arti kata-kata itu.
Stateful vs Stateless
Sebagai contoh, OpenGL mungkin adalah API paling stateful yang saya tahu. Jika saya mungkin terlalu sederhana menyederhanakannya, kita mungkin mengatakan itu terlihat seperti ini:
Hampir setiap fungsi hanya digunakan untuk melewati beberapa keadaan yang perlu diingat OpenGL, maka pada akhirnya Anda memanggil satu fungsi antiklimaks yang sederhana untuk melakukan semua gambar.
Versi OpenGL (disederhanakan) tanpa kewarganegaraan mungkin akan terlihat lebih seperti ini:
Anda akan sering mendengar orang mengatakan bahwa API dengan status yang lebih sedikit lebih mudah untuk dipikirkan. Jika Anda dapat menjaga agar jumlah argumen tetap terkendali, saya biasanya setuju dengan itu.
Berubah vs Tidak Berubah
Sejauh yang saya tahu, perbedaan ini hanya bermakna ketika Anda dapat menentukan kondisi awal . Misalnya, menggunakan konstruktor C ++:
Akan sulit untuk menerapkan kelas jendela yang tidak "mengingat" ukuran apa itu, tetapi Anda dapat memutuskan apakah pengguna harus dapat mengubah ukuran jendela setelah membuatnya.
PS Dalam OOP memang benar bahwa "negara" biasanya berarti "variabel anggota", tetapi bisa lebih dari itu. Misalnya, dalam C ++, suatu metode dapat memiliki variabel statis, dan lambdas dapat menjadi penutupan dengan menangkap variabel. Dalam kedua kasus variabel-variabel tersebut bertahan di beberapa panggilan ke fungsi dan dengan demikian mungkin memenuhi syarat sebagai negara. Variabel lokal dalam fungsi reguler juga dapat dianggap status tergantung pada bagaimana mereka digunakan (yang saya punya di main () sering dihitung).
sumber
Dengan kata-kata awam
The Kamus negara:
Keadaan sesuatu adalah himpunan nilai yang dimiliki atributnya pada saat tertentu.
Dalam OOP, keadaan suatu objek adalah potret dari nilai-nilai atributnya pada saat tertentu.
Keadaannya adalah warnanya yang biru, harganya 100 dan ukurannya kecil.
Jika nanti Anda lakukan:
Anda mengubah salah satu atributnya tetapi Anda juga mengubah keadaan secara keseluruhan karena objek tidak lagi sama seperti sebelumnya.
Terkadang kelas dirancang sehingga nilai propertinya tidak dapat diubah setelah dibuat. Semua nilai properti mereka diteruskan ke konstruktor atau dibaca dari beberapa sumber seperti database atau file, tetapi tidak ada cara untuk mengubah nilai-nilai itu setelah saat itu, karena tidak ada metode "setter", atau cara lain untuk mengubah nilai di dalam objek.
Itu disebut keadaan yang tidak bisa diubah dari bermutasi. Yang bisa Anda lakukan adalah menghancurkan objek, membuat yang baru dan menganggapnya dengan referensi atau variabel yang sama.
sumber