Apakah paradigma non-OOP mendukung konsep seperti enkapsulasi?

12

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."

JeffV
sumber
2
Saya akan mengatakan pertanyaan pertama perlu mengklarifikasi apa yang dimaksud dengan Enkapsulasi dan apa artinya bagi bahasa untuk mendukungnya.
Euforia
14
Saya mengalami kesulitan mencari tahu apa yang ditanyakan pertanyaan ini. Apakah ia menanyakan apakah enkapsulasi bisa ada di luar OO (baris subjek)? Apakah ini menanyakan apakah enkapsulasi salah (paragraf kedua)? Apakah ia bertanya apakah OO salah diterapkan (paragraf ketiga)? Dan apa yang OP ingin katakan dengan kutipan Joe Armstrong itu? Bagaimana OP mendefinisikan "enkapsulasi"? Bagaimana OP mendefinisikan "OO"? Apa itu "prinsip lain"?
Jörg W Mittag
1
Robert Martin pernah berkata bahwa OOP mengambil enkapsulasi dan kemudian menambalnya kembali dengan peretasan yang mengerikan. "Kami memiliki enkapsulasi sempurna sebelum oo". Tentu saja dia bersikap hiperbolik, tetapi sekarang setiap kali saya melihat seseorang mengatakan bahwa OO adalah tentang enkapsulasi, saya ingat Paman Bob.
GnP

Jawaban:

15

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.

Apakah OOP diterapkan salah?

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
10

Namun, akhir-akhir ini dunia perangkat lunak tampaknya cenderung mendukung paradigma lain seperti pemrograman fungsional.

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.

Itu membuat saya berpikir, bagaimana dengan enkapsulasi dan prinsip OOP lainnya? Apakah mereka salah?

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.

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."

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 ;-)

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."

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.

Doc Brown
sumber
1
Saya tidak yakin OO lebih baik untuk GUI, lebih dari itu OO dan GUI muncul pada waktu yang sama. +1 untuk McCarthy / javascript;)
jk.
1
Agar adil, beberapa orang menyarankan pendekatan yang ada cacat dan bisa diganti dengan yang lain . Saya tidak tahu apakah saya akan menyebutnya "memperluas" atau lebih tepatnya "meningkatkan" kotak alat :)
Andres F.
1
@AndresF. Itu bacaan yang fantastis. Saya berencana membaca makalah itu secara rinci ketika saya punya waktu.
Robert Harvey
4

Tentu saja:

struct Foo
{
    string bar;
    int bux;
}

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.

Robert Harvey
sumber
3
Anda juga dapat menyekop bukit tanah hanya dengan sendok teh. Tetapi siapa pun yang mengklaim bahwa cara optimal untuk melakukannya harus dilihat dengan curiga.
Euforia
6
Saya tidak pernah mengatakan itu optimal, dan bukan itu yang diminta OP. Dalam berita lain, saya merasa lucu bahwa Linux memenuhi syarat sebagai menyekop kotoran dengan satu sendok teh.
Robert Harvey
2
@jk. Tentu saja. Begitu juga dengan C.
Robert Harvey
1
memang itu semacam tidak
jk.
4
Saya tidak akan menyebut struktur C 'enkapsulasi'. Mereka tidak melindungi data atau menyediakan metode standar untuk mengaksesnya. Mereka hanya menyelamatkan Anda dari melakukan aritmatika pointer manual. Sebagai contoh, cukup umum untuk menemukan kode jaringan yang melemparkan paket-paket berseri ke dalam struktur dan sebaliknya. Dapatkan urutan byte jaringan yang salah dan menyenangkan terjadi kemudian.
david25272
2

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

Enkapsulasi adalah konsep yang mengikat bersama data dan fungsi yang memanipulasi data ...

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:

..., dan itu membuat keduanya aman dari gangguan luar dan penyalahgunaan.

Wikipedia juga menyetujui itu:

Mekanisme bahasa untuk membatasi akses langsung ke beberapa komponen objek.

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 memiliki stringbidang tunggal . Kami memiliki persyaratan bahwa jika Anda memiliki nilai tipe Emailmaka bidang itu berisi alamat yang valid. Dalam enkapsulasi OOP, ini mudah dilakukan dengan menyatakan bidang itu private, hanya menyediakan Getmetode dan memilikiconstructor methodyang 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.

Euforia
sumber