Apa yang dimaksud dengan "OOP menyembunyikan negara"? [Tutup]


11

Dalam salah satu dari banyak kata-kata kasar anti-OOP di cat-v.org saya menemukan sebuah bagian oleh Joe Armstrong mengajukan beberapa keberatan terhadap model OOP, salah satunya adalah sebagai berikut:

Keberatan 4 - Objek memiliki keadaan pribadi

Negara adalah akar dari semua kejahatan. Secara khusus fungsi dengan efek samping harus dihindari.

Sementara keadaan dalam bahasa pemrograman tidak diinginkan, di negara dunia nyata berlimpah. Saya sangat tertarik dengan keadaan rekening bank saya, dan ketika saya menyetor atau menarik uang dari bank saya, saya berharap keadaan rekening bank saya diperbarui dengan benar.

Mengingat bahwa negara ada di dunia nyata fasilitas apa yang harus disediakan oleh bahasa pemrograman untuk berurusan dengan negara?

OOPL mengatakan "sembunyikan negara dari programmer". Status disembunyikan dan hanya dapat dilihat melalui fungsi akses. Bahasa pemrograman konvensional (C, Pascal) mengatakan bahwa visibilitas variabel keadaan dikontrol oleh aturan ruang lingkup bahasa. Bahasa deklaratif murni mengatakan bahwa tidak ada keadaan. Keadaan global sistem dilakukan ke semua fungsi dan keluar dari semua fungsi. Mekanisme seperti monad (untuk FPL) dan DCG (bahasa logika) digunakan untuk menyembunyikan status dari pemrogram sehingga mereka dapat memprogram "seolah-olah keadaan tidak penting" tetapi memiliki akses penuh ke keadaan sistem jika ini diperlukan.

Opsi "sembunyikan negara dari programmer" yang dipilih oleh OOPL adalah pilihan yang lebih buruk. Alih-alih mengungkapkan negara dan berusaha mencari cara untuk meminimalkan gangguan negara, mereka menyembunyikannya.

Apa sebenarnya yang dimaksud dengan ini? Saya memiliki sedikit pengalaman tingkat rendah atau prosedural, sebagian besar OOP, sehingga mungkin menjelaskan betapa saya tidak terbiasa dengan ini. Dan dari sudut pandang yang lebih modern, sekarang sebagian besar histeria Object-Oriented dilewatkan (setidaknya sejauh yang saya tahu), seberapa akurat / relevan menurut Anda apakah bagian itu?

Terima kasih atas bantuan Anda.


3
direkomendasikan membaca: Diskusikan $ {blog} ini
agas

1
Jika Anda bertanya kepada saya, artikel yang Anda tautkan membuat beberapa argumen yang sangat buruk (belum lagi kualitas tulisannya). Saya tidak akan menaruh terlalu banyak stok dalam apa yang dikatakannya.
Benjamin Hodgson

1
Bah Semakin banyak saya berpikir bahwa semua hal yang "tidak berubah" ini adalah ide bagus yang mulai berbau agama.
Rob

3
Joe Armstrong secara terbuka mengakui bahwa keberatannya terhadap OO didasarkan pada kesalahpahaman yang parah tentang apa sebenarnya OO. Dia sekarang menyadari bahwa Erlang sebenarnya bahasa yang sangat berorientasi objek (pada kenyataannya, itu mungkin bahasa yang paling berorientasi objek dalam penggunaan umum).
Jörg W Mittag

9
Untuk memperluas tentang itu: penangkapan pertama arsip.org dari kata-kata Joe Armstrong adalah dari April 2001. Joe menulis tesisnya pada tahun 2003. Selama menulis tesisnya, dia belajar banyak tentang OO, dan dia menyadari bahwa dia telah menjadi mangsa para penjahat. kesalahpahaman umum bahwa OO entah bagaimana terkait dengan keadaan bisa berubah (tidak, keadaan bisa berubah sepenuhnya ortogonal). Sejak itu, ia mengakui bahwa kritiknya terhadap OO salah dan ironisnya Erlang sebenarnya adalah bahasa berorientasi objek (memiliki pesan, memiliki objek yang disebut proses, memiliki enkapsulasi).
Jörg W Mittag

Jawaban:


32

Apa sebenarnya yang dimaksud dengan ini?

Dalam konteks ini, itu berarti bahwa OOP mengaburkan keadaan suatu program dengan menyembunyikannya dari programmer tetapi tetap membuatnya terlihat melalui metode accessor (bocor). Argumennya adalah bahwa dengan mengaburkan negara, itu membuatnya lebih sulit untuk bekerja dengan, dan dengan ekstensi menyebabkan lebih banyak bug.

seberapa akurat / relevan menurut kalian bagian itu?

Saya merasa itu relevan, tetapi salah arah. Benar-benar ada masalah jika kelas Anda membocorkan konsep negaranya ke dunia luar. Benar-benar ada masalah jika kelas Anda mencoba mengaburkan negara ketika itu harus dimanipulasi oleh dunia luar. Meskipun demikian bukan kegagalan OOP secara keseluruhan, tetapi dengan desain individu kelas. Saya tidak akan mengatakan bahwa menyembunyikan negara adalah masalah - monad melakukan ini dalam pemrograman fungsional sepanjang waktu.

Dalam kasus terbaik, OOP bekerja seperti campuran terbaik pemrograman fungsional dan prosedural - orang dapat menggunakan kelas "seolah-olah negara tidak penting" karena negara pribadi yang digunakan untuk melindungi invarian kelas tersembunyi, tetapi memiliki kebebasan untuk menggunakan status publik yang terdefinisi dengan baik dari kelas yang meringkas detailnya.

Apakah OOP mempersulit orang untuk mencapai kasus terbaik ini? Mungkin. "Sekolah Jawa" dan seluruh Bentuk / Lingkaran / Persegi Panjang atau Mobil memiliki sekolah Roda OO mungkin harus disalahkan lebih dari pendekatan itu sendiri. OOP modern membutuhkan sedikit dari pemrograman fungsional, mendorong objek yang tidak dapat diubah dan fungsi murni sementara mencegah pewarisan untuk membantu membuatnya lebih mudah untuk merancang kelas yang bekerja dengan baik.


3
Setuju dengan sepenuh hati pada seluruh "sekolah java" sedikit, tidak suka itu sama sekali heh. Terima kasih banyak, saya akan memberikan suara jika saya bisa.
Jake

2
Untuk lebih tepatnya: monads pada umumnya tidak menyembunyikan negara, beberapa monads melakukannya (misalnya IO). Lihat antara lain stackoverflow.com/questions/2488646/…
thSoft

2
+1. Ini adalah analisis yang jauh lebih seimbang dan bernuansa daripada artikel yang dihubungkan oleh si penanya
Benjamin Hodgson

2
Joe Armstrong secara terbuka mengakui bahwa keberatannya terhadap OO didasarkan pada kesalahpahaman yang parah tentang apa sebenarnya OO. Dia sekarang menyadari bahwa Erlang sebenarnya bahasa yang sangat berorientasi objek (pada kenyataannya, itu mungkin bahasa yang paling berorientasi objek dalam penggunaan umum).
Jörg W Mittag

2
Jorg - dapatkah Anda memposting tautan ke tindak lanjut Joe? Saya akan sangat tertarik untuk membacanya. Dan @radarbob, langsung!
user949300

2

Penalaran tentang suatu sistem akan sulit jika ada bagian dari keadaan yang bisa berubah yang tidak memiliki "pemilik" yang jelas. Itu tidak berarti bahwa objek tidak boleh memiliki keadaan yang bisa berubah, melainkan bahwa benda yang memang memiliki kondisi yang bisa berubah tidak boleh digunakan dengan cara-cara di mana kepemilikan mungkin tidak jelas, dan sebaliknya benda-benda yang perlu secara bebas diedarkan tanpa melacak kepemilikan harus menjadi abadi.

Dalam praktiknya, pemrograman yang efisien sering kali mengharuskan beberapa objek memiliki keadaan yang bisa berubah; negara semacam itu, bagaimanapun, harus dibatasi, bagaimanapun, untuk objek pekerja yang tidak dibagi . Pertimbangkan IEnumerable/ IEnumeratorantarmuka di .NET: jika koleksi mengimplementasikan IEnumerable, itu akan memungkinkan item untuk dibacakan satu per satu. Proses pembacaan koleksi yang sebenarnya sering membutuhkan melacak item mana yang telah dibaca (sepotong keadaan yang bisa berubah), tetapi keadaan tersebut tidak terkandung dalam implementasi IEnumerable. Alih-alih, IEnumerableberikan metode yang disebut GetEnumeratoryang akan mengembalikan objek yang mengimplementasikan IEnumeratordan berisi status yang cukup untuk memungkinkan item dibaca dari koleksi. Fakta bahwa objek tersebut mengandung keadaan seperti itu tidak akan menimbulkan masalah,jika implementasi objek IEnumeratortidak dibagikan .

Pola terbaik dalam banyak kasus adalah menggunakan campuran objek yang dibagikan secara bebas tetapi tidak akan pernah dimodifikasi (setidaknya tidak setelah dibagikan), dan objek yang memiliki pemilik yang jelas, dan dapat dimodifikasi secara bebas oleh pemilik itu , tetapi tidak pernah dibagikan dengan siapa pun.


Perbedaan yang sangat baik antara apa yang seharusnya tidak berubah dan apa yang bisa memiliki keadaan yang bisa berubah. Membaca ini, saya menyadari bahwa grafik objek saya yang lebih baru (lebih tidak berubah dari biasanya) pada dasarnya mengikuti panduan ini tanpa harus menyatakan sejelas Anda. Ini adalah penangkal moderat yang baik untuk "keadaan berubah-ubah selalu jahat" omong kosong yang kadang-kadang Anda dengar.
Mike Mendukung Monica

@ Mike: Saya pikir masalah sebenarnya adalah bahwa semua referensi objek di Java dan .NET sepenuhnya bebas pilih-pilih; kode apa pun yang memperoleh atau menerima referensi ke suatu objek dapat membaginya dengan kode lain apa pun, tanpa batasan. Tidak ada kerangka kerja yang memiliki konsep bidang referensi yang tidak dapat dibagikan; struktur dan byrefs di .NET mendekati, tetapi mereka agak terbatas dalam hal apa yang dapat mereka lakukan atau apa yang mereka dapat mencegah kode luar dari melakukan. Dalam hal apa pun, saya akan mengajukan sebuah pepatah mendasar berkenaan dengan keadaan yang bisa berubah: pada pukul 12:57 pagi, sebuah objek dapat secara bersamaan mewakili ...
supercat

... keadaan saat ini dari objek dunia nyata, dan keadaan yang dimiliki objek tersebut pada pukul 12:57 pagi. Jika keadaan dunia nyata dari objek berubah, maka tidak akan mungkin lagi bagi objek untuk mewakili keduanya. Kadang-kadang akan diperlukan untuk memiliki objek terus mewakili negara 12:57, dan kadang-kadang negara saat ini. Namun, hubungan antara kondisi 12:57 dan kondisi saat ini tidak dapat tetap, jika kondisi saat ini berubah.
supercat

0

Dengan risiko melampaui menjawab pertanyaan, mudah untuk melihat kekurangan dalam ide OOP, tapi saya cenderung berpikir kekuatan ide tercermin dalam kemampuannya untuk disalahgunakan.

Lagi pula, setiap orang memiliki bahasa favorit mereka, yang mereka gambarkan dengan istilah seperti "sangat sangat kuat" yang berarti mereka benar-benar menyukainya . Tetapi keajaiban dari universalitas komputasi adalah bahwa tidak peduli betapa mulianya sebuah bahasa, jika itu benar-benar kuat dapat mensimulasikan bahasa majelis. Dan jika itu bisa, seseorang akan melihat itu terjadi. (Bukan berarti ada yang salah dengan bahasa assembly.)

Perasaan pribadi saya tentang kereta OOP adalah bahwa hal itu merupakan pengerdilan pendidikan masyarakat dalam rekayasa perangkat lunak / ilmu komputer. Mereka terhambat pada tingkat di mana mereka pikir itu semua tentang struktur data. Kelas, warisan, wadah, iterator, peta hash, properti, persembunyian negara , dll. - semua tentang struktur data - semakin meriah.

Saya pribadi ingin melihat level berikutnya di mana orang akan belajar untuk memecahkan masalah dengan melihat mereka secara linguistik. Di mana mereka akan memahami konsep bahasa-spesifik-domain, cara mudah membuatnya dan membiarkan kreasi mereka menjadi bagian integral dari pemecahan masalah. Tidak salah mengatakan bahwa struktur data adalah bahasa. Orang-orang harus memiliki keterampilan desain bahasa, sehingga mereka tidak hanya kikuk melewatinya.

Kemudian sebagai tingkat berikutnya, saya ingin melihat kecerdasan buatan dihidupkan kembali. Saya ingin melihat pemrogram bergerak melampaui byte dan utas serta tabel fungsi virtual dan CUDA dan beralih ke cara membuat mesin beralasan, belajar, dan membuat. Saya tahu ini telah berkembang sangat jauh di sudut-sudut kecil lapangan, tetapi tidak cukup dekat.


1
"Jika benar-benar kuat, ia dapat mensimulasikan bahasa assembly" - Anda menukar definisi powerfuldi sana. Ketika orang lain mengatakan powerful, mereka berbicara tentang seberapa baik memungkinkan programmer untuk abstrak , yang merupakan cerita yang berbeda dari kekuatan komputasi .
Phil

@ Phil: abstrak adalah salah satu dari kata-kata itu :)
Mike Dunlavey

Tidak Anda berbicara tentang kata-kata. Saya sedang berbicara tentang ide. Penggunaan kata ke 2 dan ke 3 Anda memiliki powerarti yang berbeda. Tolong jangan menyesatkan.
Phil

Btw, jika Anda tertarik, periksa Racket , yang agak dekat dengan pendekatan yang Anda katakan di paragraf ke-4 Anda (memungkinkan programmer untuk membawa bahasa ke tingkat masalah mereka alih-alih membuat mereka membawa masalah mereka ke bawah ke set konstruksi tetap bahasa). Ini jauh melampaui Lisp / Skema klasik, kalau-kalau ada orang yang memiliki kesan itu ketika pertama kali melihatnya.
Phil

0

Aksesibilitas bukan fitur OOP, ini khusus untuk implementasi seperti Java dan Microsoft dotNET. Fitur utama yang mendefinisikan OOP adalah polimorfisme.

Bagaimanapun, dengan menyembunyikan status objek, tidak ada cara untuk membuat API yang bermakna. Presentasi adalah komponen vital dari OOP dunia nyata. Mereka yang tidak setuju kemungkinan memiliki permusuhan yang tidak rasional terhadap industri perangkat lunak, yang membuat pendapat mereka tidak relevan dari sudut pandang saya.

Situs web seperti yang Anda tautkan terkenal karena pemikiran dan kritik yang sangat keras terhadap teknologi baru. Beberapa orang tidak mengerti.


Sebuah objek harus ada untuk melindungi invarian dari konsep yang dimodelkannya. Presentasi adalah masalah yang sepenuhnya terpisah dan tidak dapat ditangani secara efisien dan dikelola oleh objek yang sama, karena suatu objek tidak dapat memahami semua berbagai cara yang mungkin disajikan dari waktu dan ruang. Presentasi harus ditangani melalui beberapa mekanisme lain seperti streaming acara dan pandangan terwujud jika tujuan Anda adalah objek yang fleksibel dan dapat dirawat. Satu-satunya waktu objek harus berubah adalah jika konsepnya direvisi atau invariannya berubah.
Andrew Larsson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.