OOP kapsülleme icat etmedi ve kapsülleme ile eşanlamlı değildi. Çoğu OOP dilinde C ++ / Java stili erişim değiştiricileri yoktur. Birçok OOP dışı dil, kapsülleme sunmak için çeşitli tekniklere sahiptir.
Kapsülleme için klasik bir yaklaşım , fonksiyonel programlamada kullanılan kapaklardır . Bu, OOP'dan önemli ölçüde daha eskidir ancak bir şekilde eşdeğerdir. Örneğin, JavaScript'te şöyle bir nesne yaratabiliriz:
function Adder(x) {
this.add = function add(y) {
return x + y;
}
}
var plus2 = new Adder(2);
plus2.add(7); //=> 9
Yukarıdaki plus2
nesnenin doğrudan erişime izin verecek bir üyesi yoktur x
- tamamen kapsüllenmiştir. add()
Yöntem, üzerinde bir kapaktır x
değişken.
Cı dili, içinden kapsülleme birtakım destekler başlık dosyası mekanizması, özel olarak , opak işaretçi tekniği. C de üyelerini tanımlamadan bir yapı ismi tanımlamak mümkündür. Bu noktada, o yapının türünün hiçbir değişkeni kullanılamaz, ancak o yapı için işaretçileri serbestçe kullanabiliriz (çünkü bir yapı göstergesinin boyutu derleme zamanında bilinir). Örneğin, bu başlık dosyasını düşünün:
#ifndef ADDER_H
#define ADDER_H
typedef struct AdderImpl *Adder;
Adder Adder_new(int x);
void Adder_free(Adder self);
int Adder_add(Adder self, int y);
#endif
Artık bu Adder arabirimini kullanan, alanlarına erişimi olmayan bir kod yazabiliriz, örneğin:
Adder plus2 = Adder_new(2);
if (!plus2) abort();
printf("%d\n", Adder_add(plus2, 7)); /* => 9 */
Adder_free(plus2);
Ve burada tamamen kapsüllenmiş uygulama detayları olacaktır:
#include "adder.h"
struct AdderImpl { int x; };
Adder Adder_new(int x) {
Adder self = malloc(sizeof *self);
if (!self) return NULL;
self->x = x;
return self;
}
void Adder_free(Adder self) {
free(self);
}
int Adder_add(Adder self, int y) {
return self->x + y;
}
Sınıf da vardır modüler programlama dilleri modül düzeyi arayüzleri odaklanır. ML dil ailesi dahil. OCaml, functor adı verilen modüllere ilginç bir yaklaşım içerir . OOP gölgelenmiş ve büyük ölçüde kestirilmiş modüler programlamayı sürdürse de, OOP'un öne sürülen birçok avantajı nesne yönelmesinden çok modülerlikle ilgilidir.
Ayrıca, C ++ veya Java gibi OOP dillerinde sınıfların genellikle nesneler için (geç bağlama / dinamik gönderme yoluyla işlemleri çözen varlıklar anlamında) kullanılmadığı, ancak yalnızca soyut veri türleri için (gizleyen bir ortak arayüz tanımladığımız yerlerde ) gözlemleri vardır. iç uygulama detayları). Veri Soyutlamasını Anlama, Revisited (Cook, 2009) makalesi bu farkı daha ayrıntılı olarak tartışmaktadır.
Ancak evet, birçok dilde hiçbir kapsülleme mekanizması yoktur. Bu dillerde yapı üyeleri herkese açık bırakılmıştır. En çok, kullanımı cesaretlendiren bir adlandırma kuralı olacaktı. Örneğin, Pascal'ın yararlı bir kapsülleme mekanizması olmadığını düşünüyorum.