Bisakah kita mengatakan benda memiliki atribut, keadaan, dan perilaku?

16

Saya membaca pengenalan Oracle untuk konsep OOP dan saya menemukan deskripsi ini:

Objek dunia nyata memiliki dua karakteristik: Mereka semua memiliki keadaan dan perilaku. Anjing memiliki status (nama, warna, jenis, lapar) dan perilaku (menggonggong, mengambil, mengibaskan ekor). Objek perangkat lunak secara konseptual mirip dengan objek dunia nyata: mereka juga terdiri dari keadaan dan perilaku terkait.

Masalah saya dengan bagian itu adalah bahwa ketika menggambarkan keadaan campuran nya atribut sana juga. Misalnya, nama dan warna anjing adalah atributnya, sementara itu sedang lapar atau gundah adalah statusnya.

Jadi menurut pendapat saya, lebih akurat untuk memecah karakteristik objek menjadi tiga bagian: atribut, status, dan perilaku .

Tentu, ketika menerjemahkan ini ke dalam bahasa pemrograman saya dapat melihat bahwa partisi tiga kali lipat menjadi dua kali lipat, karena atribut dan status akan disimpan ke dalam bidang / variabel, sementara perilaku akan disimpan ke dalam metode / fungsi.

Tetapi secara konseptual lebih masuk akal untuk memisahkan 3 hal.

Berikut contoh lain: pertimbangkan lampu. Mengatakan bahwa baik ukuran lampu dan apakah itu dinyalakan atau tidak adalah keadaan adalah pendapat saya. Ukuran lampu adalah atribut, bukan status, saat sedang dinyalakan atau dimatikan adalah status.

Atau apakah saya melewatkan sesuatu?

Daniel Scocco
sumber
4
Ya, Anda kehilangan sifat sebagai teknik untuk mensimulasikan perilaku.
yannis
Lihatlah posting ini, mungkin membantu: yegor256.com/2014/12/09/...
yegor256

Jawaban:

13

Anda benar bahwa objek terdiri dari atribut, status, dan perilaku, jika Anda mendefinisikan atribut dengan maksud karakteristik yang tidak berubah dari instance. Faktanya, penting untuk membuat perbedaan ini, karena ada objek yang hanya mengandung atribut, (dalam pengertian Anda,) dan tidak ada keadaan; mereka disebut abadi dan mereka sangat berguna dalam pemrograman.

Definisi tiga bagian ini memang diwakili dalam bahasa pemrograman, misalnya menggunakan finalkata kunci di Jawa atau readonlykata kunci dalam C # untuk menunjukkan data contoh yang mungkin tidak berubah sepanjang masa contoh.

Saya harus menambahkan, bahwa data instance yang tidak berubah biasanya tidak disebut atribut. Kita cenderung berbicara tentang mereka sebagai 'data akhir' atau 'hanya baca' atau 'data konstan' tergantung pada bahasa yang kita gunakan. Istilah yang tepat untuk mereka adalah 'invarian', tetapi kemudian kata ini tidak sering digunakan dalam pengertian ini; lebih sering digunakan untuk hal-hal lain.

Mike Nakis
sumber
Memikirkannya sebagai syarat karakteristik yang tidak berubah dan berubah dari suatu kejadian masuk akal. Dan saya senang saya tidak jauh dari itu. Terima kasih!
Daniel Scocco
Apakah ukuran lampu selama proses pembuatan atau perakitan akan menjadi keadaan?
JeffO
Tidak, itu akan menjadi atribut. (Dalam arti kata OP.)
Mike Nakis
4
Tidak ada perbedaan mendasar antara negara dan atribut karena itu lebih mudah untuk mendefinisikan negara sebagai kemungkinan bisa berubah atau tidak berubah. Walaupun memiliki atribut (tidak berubah) dan keadaan (tidak bisa berubah) tidak salah (dan dalam banyak hal setara), perbedaan itu membuat definisi lebih kompleks daripada yang diperlukan. Meskipun IMO istilah "negara" mungkin bukan istilah terbaik untuk menggambarkan konsep karena "negara" entah bagaimana menyiratkan bahwa itu seharusnya berubah, sementara "negara" - seperti yang dijelaskan dalam artikel Oracle - tidak memiliki itu.
Lie Ryan
Saya berpikir bahwa sikap orang-orang terhadap kekekalan berubah seiring berlalunya waktu; bagi mereka yang memahami kepentingannya, ada perbedaan mendasar antara negara yang bisa berubah dan tidak berubah, cukup untuk menjamin nama yang berbeda. Bolehkah saya merekomendasikan bacaan yang sangat menarik? Eric Lippert - Petualangan Luar Biasa dalam Kode - Ketidakmampuan dalam C # Bagian Satu: Jenis Ketidakmampuan
Mike Nakis
4

Saya pikir lebih akurat untuk mengatakan objek hanya memiliki dua karakteristik. Mengambil contoh Oracle:

Anjing memiliki status (nama, warna, jenis, lapar) dan perilaku (menggonggong, mengambil, mengibaskan ekor). Objek perangkat lunak secara konseptual mirip dengan objek dunia nyata: mereka juga terdiri dari keadaan dan perilaku terkait.

Fakta bahwa nilai-nilai (negara) untuk nama, warna, berkembang biak, dan lapar disimpan dalam objek dalam atribut adalah detail implementasi. Anda tidak benar-benar membutuhkan atribut sama sekali.

Jika Anda akan memasukkan atribut sebagai karakteristik ketiga, maka Anda juga harus memasukkan metode sebagai yang keempat, karena (seperti keadaan) perilaku objek dapat berubah juga. Negara dan perilaku adalah dua karakteristik abstrak dari objek. Atribut dan metode adalah implementasi konkret dari konsep-konsep tersebut.

Bill the Lizard
sumber
Apakah warna bulu rubah menjadi keadaan karena berubah di musim dingin?
JeffO
@JeffO Warna bulu juga dapat berubah ketika menjadi tua, basah, diwarnai ... sejumlah alasan. Ini bukan benar-benar keadaan hanya karena dapat berubah selama kehidupan satu objek, tetapi karena objek yang berbeda dari jenis yang sama dapat memiliki nilai yang berbeda untuk atribut itu.
Bill the Lizard
1

Status adalah set atribut dan nilai yang sesuai, jadi dari sudut pandang saya, Anda tidak benar (dan Anda membuat kompleksitas tambahan yang tidak perlu ke definisi sederhana).

Pavel Bucek
sumber
0

Kita dapat mengklasifikasikan hal-hal dengan cara yang tak terhitung banyaknya dan setiap klasifikasi tidak memiliki "jawaban yang benar". Ada manfaat untuk mengklasifikasikan hal-hal hanya jika klasifikasi mengarah pada pemahaman yang lebih dalam atau untuk meningkatkan komunikasi. Jika tim Anda lebih suka menggunakan atribut istilah, status dan fungsi dan memiliki definisi kerja yang baik untuk ini, ini akan membantu meningkatkan komunikasi internal tetapi Anda harus fleksibel ketika berkomunikasi di luar grup ini.

Konsep "lapar" dan "haus" dapat diturunkan dari atribut dasar (misalnya glukosa darah, tingkat hidrasi) sehingga kita dapat menganggap status sebagai atribut-meta yang berasal dari atribut dasar yang dapat kita daur ke Benar atau Salah berdasarkan pada keadaan atribut dasar yang relevan. Sebagai contoh cahaya, kita dapat menganggap cahaya memiliki atribut applied_voltagedan resistancefungsi voltage_switch()dan shine(). The voltage_swich()kemudian fungsi dari beberapa input (misalnya pengguna switch, lampu, timer, dll) dan shine()merupakan fungsi dari applied_voltagedan resistance. Kita dapat mendeklarasikan atribut meta yang disebut light_stateBenar atau Salah untuk membantu membangun objek secara mental, tetapi pada akhirnya ide-ide ini semua hanyalah konstruksi mental yang kita gunakan untuk mengatur pekerjaan kita.

Blane
sumber
-2

Keadaan objek dikodekan dalam atributnya, baik secara langsung maupun tidak langsung. Misalnya, jika Anda ingin Anjing Anda haus, Anda dapat membiarkannya

private boolean thirsty;

Atau, Anda dapat membiarkannya seperti

private Date lastDrinkAt;

dan simpulkan apakah anjing Anda haus dengan membandingkan waktu saat ini dengan waktu terakhir ia minum sesuatu.

Either way, keadaan objek Anda terletak di dalam atributnya.

Lalu ada kelas yang tidak memiliki atribut, kebanyakan kelas utilitas. Tetapi Anda biasanya tidak ingin membuat instance dari mereka dalam kasus ini.

Demi bisa beralasan tentang pernyataan, para ilmuwan biasanya berpegang pada prinsip minimalitas. Saya pikir itu sebabnya Oracle tidak menyebutkan status secara eksplisit. Itu bisa diturunkan dari nilai atribut.

Raku
sumber
1
Oracle memang menyebutkan status secara eksplisit; baca kutipannya. Dan OP jelas menggunakan atribut atribut dalam arti karakteristik yang tidak berubah dari suatu objek, sehingga ia tidak membingungkan mereka dengan keadaan.
Mike Nakis
Mereka masih karakteristik - apakah mereka berubah atau, apakah Anda menyebutnya "atribut" atau "anggota". Tidak ada yang lain di dunia pemrograman untuk mewakili keadaan suatu objek selain atributnya.
Raku
-3

Koneksi dunia nyata salah arah. Inilah cara saya akan mengajarkannya (pendekatan c ++):

  1. Komputer mendukung dua format penyimpanan yang berbeda: data dan kode
  2. data tampak seperti bit 010101010101
  3. kode seperti instruksi asm
  4. bit data memiliki dua nilai yang berbeda, itu 0 atau 1
  5. data disarikan ke tipe data: int i = 1; adalah notasi singkat untuk beberapa bit 0000001
  6. kode akan terlihat seperti fungsi: int f (int a) {return a + a + a; } adalah notasi singkat untuk beberapa instruksi asm
  7. ketika Anda memiliki beberapa variabel, Anda menggabungkannya ke struct: int a; mengapung b; dapat ditempatkan ke struct AB {int a; mengapung b; };
  8. ketika Anda menggabungkan beberapa potongan kode untuk itu, Anda mendapatkan kelas: kelas ABf {int a; mengapung b; float sum (float c) const {mengembalikan a + b + c; }};
  9. Kemudian untuk data kami memiliki nama variabel yang dapat digunakan untuk menemukan nilai: a + b + c untuk mengakses data.
  10. Dan kemudian kita memiliki panggilan fungsi normal: int k = f (10); untuk mengakses instruksi asm "tersimpan" di dalam f-function.
  11. Lalu ada contoh objek: ABf var;
  12. Dan fungsi anggota memanggil: int k2 = var.sum (10.0);
  13. fungsi memiliki tipe int f (int);
  14. fungsi anggota memiliki tipe int ABf :: sum (float);
  15. Ada pointer ini dengan tipe ABf *
  16. variabel seperti a dan b dan c bergantung pada konteks, jika mereka berada di dalam fungsi anggota, mereka bisa berarti ini-> b, atau hanya b.
  17. Fungsi anggota int ABf :: sum (float c) hanyalah notasi singkat untuk int sum (ABf * this, float c);
  18. kata "negara" sama artinya dengan data
  19. kata "perilaku" sama artinya dengan kode
  20. kata "atribut" sama artinya dengan data.

Jadi sebenarnya tidak ada yang berbeda antara status dan atribut. Itu hanya kumpulan bit acak. Hanya perbedaan sewenang-wenang untuk memisahkan mereka. Hanya perlu tahu untuk apa itu alias.

tp1
sumber