Apakah paradigma pemrograman berorientasi keberatan sudah usang karena anti-modular dan anti-paralel? [Tutup]

23

Saya telah membaca artikel kontroversial Mengajar FP kepada mahasiswa baru yang diposting oleh Robert Harper yang adalah seorang profesor di CMU. Dia mengklaim bahwa CMU tidak akan lagi mengajarkan pemrograman berorientasi objek dalam kursus pengantar karena itu "tidak cocok untuk kurikulum CS modern."

Dan dia mengklaim bahwa:

Pemrograman berorientasi objek sepenuhnya dihilangkan dari kurikulum pengantar, karena keduanya anti-modular dan anti-paralel pada dasarnya.

Mengapa menganggap OOP sebagai anti-modular dan anti-paralel?

xiao
sumber
14
Buhwaaaah ?! OO membuat modularitas dan paralelisme lebih mudah daripada secara prosedural dan tidak saling eksklusif untuk FP. Warna saya bingung.
Matt Ellen
4
Mereka telah mendesain ulang kurikulum mereka sehingga ia harus menjual program baru dan membuat klaim berani didukung tanpa data sama sekali. Tidak ada bukti bahwa program fungsional yang kompleks lebih paralel atau modular daripada program OOP.
davidk01
4
@ Matt Ellen: OOP jelas saling eksklusif dengan FP. FP didasarkan pada beberapa konsep utama yang salah satunya adalah tidak adanya keadaan yang bisa berubah. OOP didasarkan pada keberadaan negara yang bisa berubah yang aksesnya dikendalikan dengan membungkusnya dalam "objek". Negara yang dapat berubah dan negara yang tidak dapat berubah secara eksklusif eksklusif satu sama lain. Ya, memang benar bahwa Anda dapat memprogram dalam gaya fungsional dengan banyak bahasa OOP, tetapi ini tidak sama dengan menggunakan bahasa FP. Dan ya memang benar bahwa tidak semua bahasa FP murni. Ini tidak mengatakan bahwa FP kompatibel dengan OOP.
HANYA PENDAPAT SAYA yang benar
2
@ HANYA: Saya punya ide berbeda tentang saling eksklusifitas untuk Anda. Saya melihat FP murni dan tidak murni sebagai himpunan bagian dari FP, sehingga OOP tidak terpisah dari FP jika Anda menganggap bahwa mutabilitas sangat penting untuk OOP. Saya juga tidak setuju bahwa sifat mudah berubah sangat penting untuk OOP. Anda dapat mencapai dan sepenuhnya menggunakan sistem OO lewat pesan, dan tidak pernah bermutasi.
Matt Ellen

Jawaban:

30

Harap pertimbangkan, bahwa kebutuhan Harper untuk mengajar kelas kurikulum CS pengantar sangat berbeda dari kebutuhan proyek kehidupan nyata . Tugasnya adalah mengajarkan konsep-konsep dasar (misalnya modularitas, paralelisme, induksi) kepada mahasiswa baru. Karena itu sangat penting, bahwa bahasa (dan paradigma) yang dipilih dapat mengekspresikan konsep-konsep ini dengan sesedikit mungkin upacara (sintaksis dan konseptual). Keakraban, dukungan alat, perpustakaan yang tersedia, kinerja eksekusi, dll. Sepenuhnya tidak relevan dalam konteks ini. Jadi harap ingat ini ketika mempertimbangkan yang berikut ...

Pandangan bahwa OO adalah anti-modular hasil dari sejumlah besar dependensi ke kelas lain bahkan objek kelas yang dirancang dengan baik cenderung berakhir dengan. Bahwa ini adalah masalah - bahkan di mata para pendukung OO - menjadi jelas ketika Anda melihat proliferasi kerangka Ketergantungan Injeksi , artikel, buku dan posting blog dalam beberapa tahun terakhir (juga munculnya ejekan dan rintisan yang menarik).

Petunjuk lain adalah pentingnya Pola Desain dan kompleksitas penerapannya - dibandingkan dengan beberapa paradigma pemrograman lainnya - misalnya Pabrik, Pembangun, Adaptor, Jembatan, Dekorator, Penglihatan, Komando, Iterator, Mediator, Pengamat, Strategi dan Metode Templat, dan mungkin semua Komposit dalam beberapa hal terkait dengan meningkatkan modularitas kode OO.

Warisan juga bermasalah (misalnya Fragile Base Class Problem ) dan (subtype) polimorfisme menggoda seseorang untuk menumpahkan implementasi algoritma antara beberapa kelas, di mana perubahan dapat beriak melalui seluruh rantai pewarisan (atas dan ke bawah!).

Tuduhan menjadi anti-paralel terkait dengan penekanan negara dibandingkan dengan perhitungan (alias. Mutability vs immutability). Yang pertama membuatnya lebih terlibat untuk mengekspresikan dependensi subkomputasi (yang merupakan Harper's mengambil paralelisme!) Karena Anda biasanya tidak dapat menyimpulkan dari lokasi negara dikelola (alias file, di mana variabel instance dideklarasikan) yang aktor luar akan mengubahnya pada titik waktu berapa.

Penekanan pada kekekalan dan komputasi membuat mengekspresikan dependensi subkomputasi menjadi lebih mudah, karena tidak ada manajemen negara, hanya fungsi / komputasi yang digabungkan di tempat di mana Anda ingin mengekspresikan dependensi subkomputasi.

Alexander Battisti
sumber
10
Klaim paralelisme dari kubu fungsional sering kali terlalu berlebihan. Kompiler untuk bahasa fungsional bekerja dengan teori dasar yang lebih bersih sehingga implementator memiliki lebih banyak cara untuk mengatur ulang kode sebelum diubah menjadi kode mesin, tetapi ini tidak berarti bahwa jika Anda memberi OO programmer abstraksi yang tepat untuk paralelisme, mereka tidak akan mampu untuk menulis kode paralel bersih. Sejauh ini pemrogram prosedural hanya mendapatkan kunci dan utas dan mereka telah melakukan cukup baik menurut saya dengan alat-alat itu.
davidk01
2
Sementara saya umumnya setuju dengan semua yang Anda katakan di sini, saya ingin menunjukkan bahwa pola desain datang dalam semua paradigma pemrograman. Untuk pemrograman fungsional, saya akan menunjukkan hal-hal seperti monad dan memetakan / mengurangi.
Anm
@ davidk01 Ambil Go misalnya. Ini mendukung pemrograman berorientasi objek dan memiliki primitif konkurensi yang hebat. Lebih penting lagi, itu benar-benar lepas landas untuk pemrograman bersamaan tanpa murni berfungsi.
weberc2
19

Ini mungkin klaim yang berani untuk dibuat, tapi entah bagaimana saya curiga, Robert Harper ini tidak pernah benar-benar menulis perangkat lunak yang sebenarnya dalam hidupnya. Yang tampaknya ia perhatikan hanyalah ML dan sistem tipe statis. Kontribusi sebesar itu mungkin, saya tidak melihat bagaimana klaimnya tentang OOP memiliki relevansi.

Artikel ini tidak kontroversial. Kontroversi melibatkan pemeriksaan, argumen, dan diskusi. Apa yang Anda miliki di sini adalah beberapa akademisi bodoh yang mengajukan dua tuduhan yang cukup mendasar hanya dalam satu pernyataan tunggal, tanpa repot-repot memberikan argumen.

  1. Klaim tentang OOP sebagai anti-modular hanyalah omong kosong belaka. Saya bahkan tidak tahu bagaimana menanggapinya, tidak hanya tidak ada argumen yang diberikan tetapi juga OOP dengan desain adalah pendekatan untuk membangun modularitas dengan kopling yang sangat rendah antara modul individu melalui cara enkapsulasi dan abstraksi.

  2. Mengklaim OOP anti-paralel hanya menunjukkan kurangnya pemahaman. OOP tidak mengunci keputusan tentang konkurensi. OOP hanya menentukan untuk menyembunyikannya: Jika dibangun dengan benar, Anda tidak bisa mengatakan, apakah implementasi suatu objek paralel atau tidak.
    Jadi pada akhirnya OOP dan pemrograman paralel bersifat ortogonal. Model aktor adalah model elegan untuk konkurensi yang dapat secara langsung tercermin dalam sistem objek (tetapi tidak harus), menghasilkan kombinasi yang hebat dari keduanya.

Masalah dengan OOP adalah, hanya sedikit orang yang benar-benar memahaminya dalam arti yang didefinisikan oleh Alan Kay .

  1. OOP adalah pendekatan. Dalam beberapa bahasa diimplementasikan menggunakan pola, dalam bahasa lain Anda dapat langsung menggunakan idiom bahasa bawaan (misalnya Ruby, Objective-C, Smalltalk, Io ).
  2. Bertentangan dengan kepercayaan umum, OOP bukan tentang kelas. Ini tentang objek dan objek tentang pesan yang lewat atau cara enkapsulasi dan abstraksi yang sama sekali tidak bocor.

Inilah sebabnya mengapa Jawa adalah untuk OOP tongkat runcing untuk pertempuran laut. Ini juga berlaku bagi banyak orang yang disebut "bahasa OOP", tetapi hal tentang Jawa adalah, bahwa tampaknya menjadi kepercayaan umum di Universitas, bahwa Jawa harus digunakan untuk mengajar OOP.

Saya setuju dengan semua orang yang berpikir perkenalan untuk OOP dengan Java harus dihapus dari CS kurikulum. Saya juga berpikir bahwa orang yang jelas-jelas kurang memahami OOP seharusnya tidak mengajarkannya. Jadi mungkin lebih baik jika Bob tongkat untuk ML untuk kursus dan hanya mengajarkan apa yang ia memiliki pemahaman yang kuat tentang.
Sekarang OOP lebih dari etiket modis, orang-orang seperti untuk tongkat ke segala sesuatu. Ini merugikan OOP dan kata orang. OOP tidak ketinggalan jaman. Masa keemasan OOP belum tiba, ketika orang akhirnya mengerti apa itu tentang apa yang bukan tentang (misalnya menyelesaikan setiap masalah yang mungkin terjadi dengan menggunakan kata kunci class500 kali).

back2dos
sumber
1
+1 untuk pesan yang lewat, dan +1 untuk 'dengan Java'. Sayangnya jika mereka menghapus Java, mereka hanya akan menggantinya dengan C # dan melanjutkan warisannya.
gbjbaanb
@ back2dos +1 untuk kritik, -1 untuk Java. Tentunya, Smalltalk "jauh lebih OO" dari Jawa, tetapi siapa yang menggunakannya? Objective-C sulit untuk pemula seperti halnya C.
maaartinus
@maaartinus: Anda akan menemukan mencicit untuk digunakan secara luas di bidang pendidikan dan akademik, jika itu menjawab pertanyaan Anda. Juga untuk Java: Anda mungkin menyukainya, saya mungkin tidak. Sama seperti kopi, ini masalah preferensi pribadi dan tidak ada gunanya mendiskusikan hal itu. Namun Java menjadi tidak cocok untuk pengenalan ke OOP adalah IMHO implikasi yang tidak dapat disangkal dari sifat Java dan konsep OOP dan itulah yang saya katakan. Popularitas Java tidak akan membuatnya hilang. Sedangkan untuk C, saya sarankan Anda membaca joelonsoftware.com/articles/ThePerilsofJavaSchools.html .
back2dos
@ back2dos Squeak dapat digunakan di area ini, tetapi di universitas saya telah belajar ML. Keduanya sama-sama tidak dapat digunakan dalam industri dan keduanya layak dipelajari, karena konsep mereka. Artikel runcing adalah artikel terburuk oleh Joel yang pernah saya baca, terlalu panjang dan pada pandangan pertama pesan tersebut tampaknya menjadi pentingnya berurusan dengan segfault. : D Saya benar-benar masih menyarankan Java untuk mengajar OOP.
maaartinus
@maaartinus: Apa yang Anda pelajari di universitas tidak banyak berarti dalam pertanyaan apa yang harus diajarkan . Anda masih tidak memberikan alasan mengapa orang harus menggunakan Java untuk mengajar OOP, sementara saya memberikan apa yang saya anggap sebagai alasan yang kuat mengapa tidak melakukannya. Anda juga jelas gagal memahami esensi artikel: Orang-orang yang tidak dapat mengatasi masalah yang sama sulitnya dengan C seharusnya tidak mempelajari CS sejak awal. Saya pikir CS tidak boleh dibodohi dengan apa yang setiap anak yang suka komputer bisa mengerti. Jika kami tidak dapat menyetujui hal itu, maka diskusi lebih lanjut adalah buang-buang waktu dan milik Anda.
back2dos
12

Anda mendapatkan fanatik dari setiap garis.

Pemrograman berorientasi objek bukan peluru perak. Tidak pernah ada. Apa itu, adalah korban hype. Tidak bisa dihindari, orang muak dengan hype dan serangan balasan mulai berkembang (terlepas dari kegunaan sebenarnya dari paradigma).

Dua puluh tahun dari sekarang, tidak diragukan lagi, kita akan memiliki reaksi lain terhadap pemrograman fungsional.

Frank Shearar
sumber
1
Sudah ada!
quant_dev
1
++ "Kamu mendapatkan fanatik dari setiap garis." Saya seorang akademisi, dan pengalaman saya adalah ini . Akademisi suka mengemukakan pendapat yang provokatif, mungkin mengesankan siswa mereka.
Mike Dunlavey
5

Saya tidak bisa menjawab pertanyaan ini sepenuhnya karena kita hanya bisa menebak pemikiran samar penulisnya. Saya sangat curiga bahwa artikel ini akan membuat penulisnya malu. Tidak ada apa pun tentang OOP yang menyarankan bahwa itu bukan modular maupun paralel:

Modularitas : Aspek utama dari OOP adalah bahwa ia memang modular (tetapi modularitas berarti hal yang berbeda dalam konteks yang berbeda). Jadi, terlepas dari apakah penulis berbicara tentang generalisasi atau pemrograman statis, ia salah.

Parallelisation : Adapun pemrograman paralel, sebagian besar kerangka kerja telah mendukung interupts kemudian threading dan sekarang parallelisation yang tepat seperti apa yang kita lihat di .Net framework 4.0 dan bahasa OOP yang melesat ke dalamnya.

Saya menduga bahwa penulis telah menjadi korban mode karena ada kesalahpahaman bahwa pemrograman fungsional dan OOP saling eksklusif dalam penggunaannya. Ada gaya fungsional dalam bahasa OOP yang didokumentasikan dengan baik, misalnya, Oliver Sturm telah menerbitkan di bidang ini.

CarneyCode
sumber
4

Penulis berpendapat bahwa OOP terlalu sulit untuk dipahami oleh programmer baru, yang mungkin benar - meskipun saya ragu, mengingat persyaratan masuk untuk CMU! Pernyataan anti-modular dan anti-paralel mungkin benar dalam konteks yang sempit jika dibandingkan dengan bahasa murni fungsional, tetapi hampir tidak merupakan kecaman dari seluruh paradigma (yang tampaknya bekerja dengan baik bagi mereka yang tahu cara menggunakannya).

Kurikulum yang diusulkan akan mengajarkan pemrograman fungsional dalam satu kelas, pemrograman imperatif (prosedural) di kelas lain, dan struktur data di kelas lain. Setelah mahasiswa baru menguasai 3 hal ini, ia harus siap untuk belajar OOP.

Secara pribadi saya pikir itu berlebihan, tetapi akademisi suka mencoba hal-hal baru dan ekstrim. Sebagai penyeimbang, MIT dulu (dan mungkin masih) mengajarkan semua paradigma pemrograman utama dalam satu kelas mahasiswa baru.

Anehnya, kedua sekolah telah menghasilkan beberapa programmer yang sangat bagus. Sosok pergi.

Steven A. Lowe
sumber