Dalam buku Coders at work, Joe Armstrong menyatakan bahwa:
Saya pikir kurangnya usabilitas datang dalam bahasa berorientasi objek, bukan dalam bahasa fungsional. Karena masalah dengan bahasa berorientasi objek adalah mereka memiliki semua lingkungan implisit yang mereka bawa. Anda menginginkan pisang, tetapi yang Anda dapatkan adalah gorila yang memegang pisang dan seluruh hutan
Saya tidak mengerti di sini. Jika masalahnya adalah mendapatkan pisang, kita dapat merangkum semua logika di balik fungsi 'getBanana'. Bagaimana monyet dan hutan terlibat dalam konteks ini. Bisakah seseorang menulis potongan kode yang menjelaskan masalah dengan cara yang lebih mudah dimengerti, katakanlah, tunjukkan fakta bahwa Banana
objek tersebut memerlukan objek Monkey
dan Jungle
untuk diinisiasi, tolong?
sumber
Jawaban:
Dia mengisyaratkan fakta, bahwa sebagian besar program OOP nyata tidak menghormati pemisahan kekhawatiran. Misalnya, Anda dapat memiliki kelas:
Jika Anda menggunakan
Banana
, secara transitif perlu juga bergantung padaMonkey
danJungle
.Tapi saya akan sangat tidak setuju bahwa ini masalah dengan OOP dan gaya fungsional itu entah bagaimana tidak memilikinya. Ini dapat dengan mudah diperbaiki di OOP dengan pengenalan abstraksi yang benar.
Masalahnya lebih tentang pengembang tidak peduli tentang pemisahan masalah. Dan saya tidak akan takut untuk menyatakan bahwa mayoritas programmer OOP adalah pemula, sementara programmer fungsional memiliki beberapa pengalaman, yang memotivasi mereka untuk memisahkan kode mereka dengan benar.
Kemungkinan abstraksi adalah:
Dengan cara ini, Anda tahu bahwa
Banana
memiliki pemilik, tetapi tidak harus demikianMonkey
. Itu bisa apa saja. Dan itu membatasi apa yang dapatBanana
dilakukan dengan pemilik hanya operasi yang ditentukan olehIBananaOwner
, yang menyederhanakan penalaran.sumber
Monkey
danJungle
adalah lingkungan untukBanana
. Dengan memperkenalkan abstraksi sepertiIBananaOwner
, lingkungan menjadi eksplisit. Dan bagaimana lingkungan ini dirancang adalah apa masalahnya.Gorila bukan monyet!
Terlepas dari itu, Anda menjawab pertanyaan Anda sendiri dengan " kami dapat merangkum semua logika di balik fungsi 'getBanana' ". Yang saya inginkan adalah pisang, tetapi untuk mendapatkannya saya perlu memanggil
getBanana
beberapa objek, misalnya instanceGorilla
kelas. Objek pisang itu kemudian kemungkinan berisi referensi ke gorila miliknya dan bahwa objek gorila pada gilirannya akan memiliki referensi ke hutan miliknya. Jadi saya minta pisang, tapi dibungkus di belakang itu adalah seluruh hutan.Ini adalah contoh ekstrem dan tidak akan selalu seburuk itu. Tapi tidak jarang berakhir dengan sistem OO seperti ini. Jadi, untuk menguji
getBanana
metode itu, saya perlu membuat instance, atau mengejek, seluruh hutan.sumber