Salah satu konsep penting dalam Pemrograman Berorientasi Objek adalah Enkapsulasi. Namun, akhir-akhir ini dunia perangkat lunak tampaknya cenderung mendukung paradigma lain seperti pemrograman fungsional.
Itu membuat saya berpikir, bagaimana dengan enkapsulasi dan prinsip OOP lainnya? Apakah mereka salah?
Apakah OOP diterapkan salah? Sebagai contoh, Alan Kay terkenal karena mengatakan dalam Keynote OOPSLA'97: "Saya menemukan istilah berorientasi objek, dan saya dapat memberitahu Anda bahwa saya tidak memiliki C ++ dalam pikiran."
Joe Armstrong - "Objek mengikat fungsi dan struktur data bersama dalam unit yang tidak dapat dibagi. Saya pikir ini adalah kesalahan mendasar karena fungsi dan struktur data termasuk dalam dunia yang sama sekali berbeda."
Jawaban:
Saya pikir perangkap Anda jatuh ke sini berpikir bahwa ada definisi yang kaku dari setiap paradigma pemrograman (terstruktur, berorientasi objek, fungsional, dan lain-lain.)
Jika Anda bertanya kepada dua pengembang yang berbeda apa arti OOP, Anda akan mendapatkan dua jawaban berbeda. Ya, sebagai profesi kami sepakat bahwa ada beberapa tema umum seperti enkapsulasi, penyembunyian data, dll. Yang dicakup oleh kelas rekayasa perangkat lunak OOP di perguruan tinggi.
Namun , di dunia nyata, hal-hal yang tidak begitu potong dan kering, itulah sebabnya dua pengembang akan memberikan dua jawaban berbeda. Mungkin mereka ahli dalam berbagai bahasa yang mengekspresikan konsep OOP secara berbeda. Paradigma bahasa cenderung tumpang tindih. Kemarahan terbaru pada 2013 atau lebih menggabungkan pemrograman fungsional dalam bahasa berorientasi objek melalui penutupan atau lambdas. Apakah Java 8 berorientasi objek atau fungsional? Saya akan menyebutnya berorientasi objek dengan sedikit fungsional. Orang lain mungkin menggambarkannya secara berbeda.
Tidak, masalahnya adalah bahwa berbagai bahasa mengekspresikan konsep pemrograman secara berbeda. Mungkin satu bahasa meninggalkan konsep OOP, dan bahasa lain memasukkannya tetapi meninggalkan konsep OOP yang berbeda. Bahasa biasanya dirancang untuk suatu tujuan: untuk membuat jenis tugas tertentu mudah, dengan mengorbankan membuat tugas-tugas lain lebih sulit. Itu tidak benar atau salah, itu hanyalah tradeoff dunia nyata yang tidak mungkin untuk dihindari.
Dunia nyata bukan ruang kelas. Kita juga perlu mendiskusikan paradigma pemrograman konseptual di tingkat abstrak, atau kita perlu membahas bahasa pemrograman nyata yang dipaksa untuk membuat pengorbanan agar bermanfaat. Selama bahasa pemrograman sebagian besar ditentukan oleh definisi abstrak OOP, kita dapat memasukkannya ke dalam ember itu.
sumber
Itu bisa diperdebatkan. Pertama, saya tidak melihat paradigma lain selain OOP dan pemrograman fungsional yang dibahas secara luas, jadi saya kira kita bisa melupakan frasa "paradigma lain seperti" , mari kita bicara tentang FP, tidak ada yang lain.
Alasan mengapa pemrograman fungsional menjadi sangat populer selama beberapa tahun terakhir dibahas dalam pertanyaan lain di sini secara mendalam, saya tidak akan mengulangi ini (lihat di sini atau di sini , misalnya). Tapi, menurut saya ini bukan karena "OOP adalah kesalahan besar", atau "Fungsional vs OOP saling eksklusif", itu lebih seperti orang memperluas kotak alat mereka dan mencoba untuk mendapatkan yang terbaik dari kedua dunia. Ok, pasti ada ahli yang garis keras lebih menyukai satu sama lain, tetapi Anda akan menemukan orang-orang di kedua sisi.
Enkapsulasi memiliki banyak rasa yang berbeda. Bahasa pemrograman fungsional dan konstruksi bahasa menyediakan bentuk enkapsulasi tertentu, berorientasi objek lainnya. Jika Anda mencari contoh enkapsulasi dengan cara fungsional, mulailah dengan penutupan .
Mengenai "prinsip lain": tidak, mereka tidak salah, tetapi untuk skenario tertentu seperti paralelisasi skala tinggi, pendekatan fungsional mungkin berskala lebih baik. Untuk skenario lain, seperti membuat kerangka UI yang dirancang dengan baik, OOP mendekati skala mungkin lebih baik (YMMV, saya tidak hanya memiliki contoh yang lebih baik di tangan). Selain itu, saya yakin untuk sebagian besar skenario dunia nyata itu tergantung pada pengetahuan dan pengalaman tim dengan paradigma pemrograman favoritnya seberapa baik skala sistem tertentu.
Tentunya OOP sering diterapkan salah oleh banyak orang, tetapi saya yakin hal yang sama berlaku untuk FP. Dan saya akan heran jika John Mc Carthy (desainer Lisp) memiliki sesuatu seperti Javascript dalam pikiran ketika dia berpikir tentang pemrograman fungsional (kasihanilah saya, jangan nyalakan saya terlalu banyak untuk perbandingan itu ;-)
Saya kira penemu Erlang memiliki beberapa argumen bagus, tetapi ia juga memiliki sudut pandangnya sendiri, jadi biarkan dia pendapatnya dan bangun pendapat Anda sendiri. Ada banyak ahli lain yang memiliki gagasan berbeda tentang ini.
sumber
Tentu saja:
Saya tahu apa yang akan Anda katakan: "Tapi itu tidak juga merangkum perilaku!" Baiklah, saya bersama Joe Armstrong untuk hal ini: Anda dapat menulis seluruh program atau sistem operasi tanpa perlu objek kelas satu. Linux membuktikannya.
Pemrogram Javascript secara rutin merangkum status dan perilaku dalam fungsi dan penutup, bukan kelas.
sumber
Masalah utama di sini adalah bahwa Enkapsulasi bukanlah konsep yang didefinisikan dengan kaku atau mengapa itu berguna. Melakukan beberapa penelitian menunjukkan bahwa cara orang melihat enkapsulasi sangat disukai dan banyak orang yang bingung dengan Abstraksi.
Definisi pertama yang akan Anda temukan adalah
Jika ini adalah definisi Anda, maka sebagian besar bahasa memiliki cara untuk mengelompokkan data dan fungsi yang beroperasi pada data tersebut ke dalam kelas, modul, perpustakaan, ruang nama, dll.
Tetapi saya berpendapat bahwa itu bukan tujuan utama enkapsulasi, karena definisi itu berlanjut:
Wikipedia juga menyetujui itu:
Tetapi sekarang, kita perlu bertanya apa yang dimaksud dengan "gangguan dan penyalahgunaan" dan mengapa akses langsung ke data dibatasi. Saya percaya ada dua alasan.
Pertama adalah bahwa membatasi ruang lingkup di mana data dapat bermutasi adalah kepentingan terbaik pengembang. Terlalu sering ada kebutuhan untuk memiliki logika sebelum / sesudah nilai ditetapkan. Dan hanya memiliki jumlah tempat terbatas di mana nilai dapat ditetapkan sangat berharga. Dalam bahasa OOP ini bisa dilakukan menggunakan kelas. Dalam bahasa fungsional "bisa berubah" penutupan melayani tujuan yang sama. Dan karena kita tahu kelas = penutupan , itu bahkan bisa diperdebatkan dari bahasa fungsional yang bisa berubah yang berbeda "paradigma" untuk OOP.
Tapi bagaimana dengan bahasa yang tidak berubah? Tidak ada masalah dengan mutasi variabel. Di sinilah masalah kedua muncul: fungsi dan data yang mengikat memungkinkan untuk mempertahankan data tersebut dalam keadaan yang valid. Bayangkan Anda memiliki struktur abadi
Email
. Struktur ini memilikistring
bidang tunggal . Kami memiliki persyaratan bahwa jika Anda memiliki nilai tipeEmail
maka bidang itu berisi alamat yang valid. Dalam enkapsulasi OOP, ini mudah dilakukan dengan menyatakan bidang ituprivate
, hanya menyediakanGet
metode dan memilikiconstructor method
yang hanya berhasil jika diteruskan dalam string adalah alamat yang valid. Serupa dengan penutupan. Sekarang, untuk bahasa yang tidak dapat diubah, perlu dikatakan bahwa struktur hanya dapat diinisialisasi melalui fungsi tertentu dan fungsi tersebut dapat gagal. Dan saya tidak mengetahui bahasa apa pun yang cocok dengan kriteria itu (mungkin seseorang yang berkomentar dapat mencerahkan saya).Isu terakhir adalah apa yang dimaksud dengan enkapsulasi "pendukung" bahasa. Di satu sisi ada bahasa yang memungkinkan penegakan enkapsulasi, sehingga kode tidak akan dikompilasi jika enkapsulasi rusak. Di sisi lain, bahasa mungkin menyediakan cara untuk melakukan enkapsulasi, tetapi tidak menegakkannya, meninggalkan pengembang untuk menegakkannya sendiri. Untuk kasus kedua, bahasa apa pun yang memiliki struktur dan fungsi dapat berfungsi. Bahasa yang dinamis dan Haskell muncul di pikiran. Dan saya akan mengatakan tidak ada banyak bahasa yang jatuh di sisi lain dari spektrum. Bahkan C #, yang benar-benar pandai menegakkan enkapsulasi untuk objek-objeknya dapat dilewati menggunakan refleksi. Tetapi melihat bahwa di C # akan dianggap sebagai bau kode besar dan tidak ada pengembang C # yang waras akan melakukannya dengan sukarela.
sumber