... dan mungkin merupakan salah satu artikel yang menjadi dasar OOP.
Tidak juga, tetapi hal itu menambah diskusi, khususnya bagi para praktisi yang, pada saat itu, dilatih untuk menguraikan sistem menggunakan kriteria pertama yang ia jelaskan di koran.
Pertama saya ingin tahu apakah penilaian saya benar. Apakah paradigma FP dan artikel ini secara filosofis tidak setuju?
Tidak. Terlebih lagi, bagi saya, uraian Anda tentang seperti apa program FP tidak berbeda dari yang lain yang menggunakan prosedur atau fungsi:
Data diteruskan dari satu fungsi ke fungsi lainnya, masing-masing fungsi sangat menyadari data dan "mengubahnya" di sepanjang jalan.
... kecuali bagian "keintiman", karena Anda dapat (dan sering melakukannya) memiliki fungsi yang beroperasi pada data abstrak, tepatnya untuk menghindari keintiman. Dengan demikian, Anda memiliki kontrol atas "keintiman" itu dan Anda dapat mengaturnya sesuka Anda, dengan mengatur antarmuka (mis. Fungsi) untuk apa yang ingin Anda sembunyikan.
Jadi, saya tidak melihat alasan mengapa kita tidak dapat mengikuti kriteria penyembunyian informasi Parnas menggunakan pemrograman fungsional dan berakhir dengan implementasi indeks KWIC dengan manfaat yang sama dengan implementasi keduanya.
Dengan asumsi mereka setuju, saya ingin tahu apa implementasi menyembunyikan data oleh FP. Jelas melihat ini di OOP. Anda dapat memiliki bidang pribadi yang tidak dapat diakses siapa pun di luar kelas. Tidak ada analogi yang jelas tentang ini bagi saya di FP.
Sejauh menyangkut data, Anda dapat menguraikan abstraksi data dan abstraksi tipe data menggunakan FP. Semua ini menyembunyikan struktur beton dan manipulasi struktur beton ini menggunakan fungsi sebagai abstraksi.
EDIT
Ada semakin banyak pernyataan di sini yang menyatakan bahwa "menyembunyikan data" dalam konteks FP tidak begitu berguna (atau OOP-ish (?)). Jadi, izinkan saya memberi stempel di sini contoh yang sangat sederhana dan jelas dari SICP:
Misalkan sistem Anda perlu bekerja dengan bilangan rasional. Salah satu cara Anda mungkin ingin mewakili mereka adalah sebagai pasangan atau daftar dua bilangan bulat: pembilang dan penyebut. Demikian:
(define my-rat (cons 1 2)) ; here is my 1/2
Jika Anda mengabaikan abstraksi data, kemungkinan besar Anda akan mendapatkan pembilang dan penyebut menggunakan car
dan cdr
:
(... (car my-rat)) ; do something with the numerator
Mengikuti pendekatan ini, semua bagian dari sistem yang memanipulasi bilangan rasional akan tahu bahwa bilangan rasional adalah cons
- mereka akan cons
membuat angka rasional dan mengekstraknya menggunakan operator daftar.
Satu masalah yang mungkin Anda hadapi adalah ketika Anda perlu mengurangi bentuk bilangan rasional - perubahan akan diperlukan di seluruh sistem. Juga, jika Anda memutuskan untuk mengurangi pada waktu pembuatan, Anda mungkin menemukan kemudian bahwa mengurangi ketika mengakses salah satu istilah rasional lebih baik, menghasilkan perubahan skala penuh lainnya.
Masalah lain adalah jika, secara hipotesis, representasi alternatif untuk mereka lebih disukai dan Anda memutuskan untuk meninggalkan cons
representasi - perubahan skala penuh lagi.
Setiap upaya yang waras dalam menghadapi situasi ini kemungkinan akan mulai menyembunyikan representasi rasional di balik antarmuka. Pada akhirnya, Anda mungkin berakhir dengan sesuatu seperti ini:
(make-rat <n> <d>)
mengembalikan bilangan rasional yang pembilangnya adalah bilangan bulat <n>
dan yang penyebutnya bilangan bulat <d>
.
(numer <x>)
mengembalikan pembilang dari bilangan rasional <x>
.
(denom <x>)
mengembalikan penyebut bilangan rasional <x>
.
dan sistem tidak akan lagi (dan seharusnya tidak lagi) tahu dari apa rasionalisasi dibuat. Hal ini karena cons
, car
dan cdr
tidak intrinsik untuk rasional, tetapi make-rat
, numer
dan denom
yang . Tentu saja, ini bisa dengan mudah menjadi sistem FP. Jadi, "penyembunyian data" (dalam hal ini, lebih dikenal sebagai abstraksi data, atau upaya untuk merangkum representasi dan struktur konkret) muncul sebagai konsep yang relevan dan teknik yang banyak digunakan dan dieksplorasi, baik dalam konteks OO, pemrograman fungsional atau terserah.
Dan intinya adalah ... meskipun orang mungkin mencoba untuk membuat perbedaan antara apa "jenis persembunyian" atau enkapsulasi yang mereka lakukan (apakah mereka menyembunyikan keputusan desain, atau struktur data atau algoritma - dalam kasus abstraksi prosedural), semuanya memiliki tema yang sama: mereka dimotivasi oleh satu atau lebih poin yang dibuat Parnas secara eksplisit. Itu adalah:
- Changeability: apakah perubahan yang diperlukan dapat dilakukan secara lokal atau disebarkan melalui sistem.
- Pengembangan Mandiri: sejauh mana dua bagian dari sistem dapat dikembangkan secara paralel.
- Comprehensibility: seberapa banyak sistem yang dibutuhkan untuk diketahui untuk memahami salah satu bagiannya.
Contoh di atas diambil dari buku SICP jadi, untuk diskusi lengkap dan presentasi konsep-konsep ini dalam buku, saya sangat merekomendasikan memeriksa bab 2 . Saya juga merekomendasikan untuk membiasakan diri dengan Tipe Data Abstrak dalam konteks FP, yang membawa masalah lain ke tabel.