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.
sumber
Jawaban:
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.
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.
sumber
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
/IEnumerator
antarmuka di .NET: jika koleksi mengimplementasikanIEnumerable
, 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 implementasiIEnumerable
. Alih-alih,IEnumerable
berikan metode yang disebutGetEnumerator
yang akan mengembalikan objek yang mengimplementasikanIEnumerator
dan berisi status yang cukup untuk memungkinkan item dibaca dari koleksi. Fakta bahwa objek tersebut mengandung keadaan seperti itu tidak akan menimbulkan masalah,jika implementasi objekIEnumerator
tidak 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.
sumber
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.
sumber
powerful
di sana. Ketika orang lain mengatakanpowerful
, mereka berbicara tentang seberapa baik memungkinkan programmer untuk abstrak , yang merupakan cerita yang berbeda dari kekuatan komputasi .power
arti yang berbeda. Tolong jangan menyesatkan.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.
sumber