... ve muhtemelen OOP'un dayandığı makalelerden biridir.
Gerçekten değil, ama tartışmaya, özellikle de o zamanlar, makalesinde tanımladığı ilk kriterleri kullanarak sistemleri parçalamak için eğitilmiş olan uygulayıcılara ekledi.
Öncelikle değerlendirmemin doğru olup olmadığını bilmek istiyorum. FP paradigması ve bu makale felsefi olarak aynı fikirde mi?
Hayır. Ayrıca, gözlerime göre bir FP programının neye benzediğini açıklamanız, prosedürleri veya işlevleri kullanan diğerlerinden farklı değildir:
Veri, fonksiyondan fonksiyona aktarılır, her fonksiyon verinin yakından farkındadır ve yol boyunca "onu değiştirir".
... “samimiyet” kısmı dışında , kesinlikle samimiyetten kaçınmak için soyut veriler üzerinde çalışan fonksiyonlara sahip olabilirsiniz (ve çoğu zaman yaparsınız). Böylece, bu "samimiyet" üzerinde bir kontrole sahipsiniz ve saklamak istediğiniz şeyler için arayüzler (yani fonksiyonlar) kurarak dilediğiniz gibi düzenleyebilirsiniz.
Bu nedenle, Parnas'ın bilgi gizleme kriterlerini fonksiyonel programlama kullanarak izleyemememizin ve ikinci uygulamada olduğu gibi benzer faydaları olan bir KWIC endeksinin uygulanması ile sonuçlanmamasının bir nedeni olmadığını görüyorum.
Kabul ettiklerini varsayarak, FP'lerin veri gizleme uygulamasının ne olduğunu bilmek istiyorum. Bunu OOP'da görmek çok açık. Sınıf dışında kimsenin erişemediği özel bir alana sahip olabilirsiniz. FP'de bunun bana açık bir benzetmesi yok.
Veriler söz konusu olduğunda, FP kullanarak veri soyutlamaları ve veri tipi soyutlamaları detaylandırabilirsiniz. Bunlardan herhangi biri somut yapıları gizler ve bu somut yapıların soyutlamalar olarak işlevler kullanarak manipüle edilmesini sağlar.
DÜZENLE
Burada, FP bağlamında "verileri gizlemenin" çok yararlı olmadığını (veya OOP-ish (?)) Belirten çok sayıda iddia vardır. Öyleyse, buraya SICP'den çok basit ve açık bir örnek vereyim:
Sisteminizin rasyonel sayılarla çalışması gerektiğini varsayalım. Onları temsil etmek isteyebileceğiniz bir yol, iki tamsayının bir çifti veya listesi olarak: pay ve payda. Böylece:
(define my-rat (cons 1 2)) ; here is my 1/2
Veri soyutlama görmezden gelirsek, büyük olasılıkla kullandığınız pay ve payda alacak car
ve cdr
:
(... (car my-rat)) ; do something with the numerator
Bu yaklaşımı takiben, rasyonel sayıları manipüle eden sistemin tüm parçaları rasyonel sayının bir olduğunu bilecektir cons
- cons
rasyonel oluşturmak için sayıları toplayacak ve liste operatörlerini kullanarak bunları çıkaracaktır .
Karşılaşabileceğiniz sorunlardan biri, rasyonel sayılarınızın azaltılmış bir şekline sahip olmanız gerektiğidir - tüm sistemde değişiklikler gerekecektir. Ayrıca, oluşturma sırasında azaltmaya karar verirseniz, daha sonra rasyonel terimlerden birine erişirken azaltmanın daha iyi olduğunu ve başka bir tam ölçek değişikliği sağladığını görebilirsiniz.
Diğer bir sorun, varsayımsal olarak, onlar için alternatif bir temsilin tercih edilmesi ve cons
gösterimi bırakmaya karar vermenizdir - yine tam ölçek değişikliği.
Bu durumlarla başa çıkmak için her türlü mantıklı çaba muhtemelen rasyonellerin arayüzlerin ardındaki temsilini gizlemeye başlayacaktır. Sonunda, böyle bir şeyle bitebilir:
(make-rat <n> <d>)
Payı tamsayı <n>
ve paydası tamsayı olan rasyonel sayıyı döndürür <d>
.
(numer <x>)
rasyonel sayının payını döndürür <x>
.
(denom <x>)
rasyonel sayının paydasını döndürür <x>
.
ve sistem artık gerekçelerin ne yapıldığını bilmeyecek (ve artık gerekmeyecek). Bunun nedeni ise cons
, car
ve cdr
rationals içkin değildir, ancak make-rat
, numer
ve denom
vardır . Tabii ki, bu kolayca bir FP sistemi olabilir. Bu nedenle, "veri gizleme" (bu durumda, veri soyutlama veya daha iyi temsiller ve somut yapıları içine alma çabası olarak bilinir), OO bağlamında, işlevsel programlama veya her neyse.
Ve mesele şu ki ... kişi ne tür "gizlenme" ya da enkapsülasyon yaptıkları arasında ayrım yapmayı deneyebilse de (prosedürel soyutlamalar söz konusu olduğunda, bir tasarım kararını mı saklıyorlar mı yoksa veri yapıları veya algoritmaları), hepsinde aynı tema var: Parnas’ın açıkça belirttiği bir veya daha fazla puanla motive oluyorlar. Yani:
- Değiştirilebilirlik: İstenilen değişikliklerin yerel olarak yapılıp yapılamayacağı veya sistem üzerinden yayılması
- Bağımsız Gelişme: Sistemin ne kadarına paralel olarak iki bölüm geliştirilebilir.
- Anlaşılabilirlik: Sistemden ne kadarının parçalarından birini bildiği bilinmelidir.
Yukarıdaki örnek SICP kitabından alınmıştır, bu yüzden bu kavramların kitapta tartışılması ve sunulması için, bölüm 2'ye bakmanızı şiddetle tavsiye ederim . Ayrıca, ÇB bağlamında Özet Veri Tiplerine aşina olmanızı tavsiye ediyorum, bu da diğer konuları masaya getiriyor.