OOP nie wynalazł enkapsulacji i nie jest synonimem enkapsulacji. Wiele języków OOP nie ma modyfikatorów dostępu w stylu C ++ / Java. Wiele języków innych niż OOP oferuje różne techniki oferujące enkapsulację.
Klasycznym podejściem do enkapsulacji są zamknięcia , stosowane w programowaniu funkcjonalnym . Jest to znacznie starsze niż OOP, ale jest w pewnym sensie równoważne. Np. W JavaScript możemy stworzyć taki obiekt:
function Adder(x) {
this.add = function add(y) {
return x + y;
}
}
var plus2 = new Adder(2);
plus2.add(7); //=> 9
Powyższy plus2
obiekt nie ma elementu, który umożliwiałby bezpośredni dostęp do x
- jest całkowicie zamknięty. add()
Metoda jest zamknięcie na x
zmiennej.
Język C obsługuje pewne rodzaje enkapsulacji za pomocą mechanizmu pliku nagłówkowego , w szczególności technikę nieprzezroczystego wskaźnika . W C można zadeklarować nazwę struktury bez definiowania jej członków. W tym momencie nie można użyć żadnej zmiennej typu tej struktury, ale możemy swobodnie używać wskaźników do tej struktury (ponieważ rozmiar wskaźnika struktury jest znany w czasie kompilacji). Weźmy na przykład ten plik nagłówkowy:
#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
Możemy teraz napisać kod korzystający z tego interfejsu Addera, bez dostępu do jego pól, np .:
Adder plus2 = Adder_new(2);
if (!plus2) abort();
printf("%d\n", Adder_add(plus2, 7)); /* => 9 */
Adder_free(plus2);
I oto byłyby całkowicie zamknięte szczegóły implementacji:
#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;
}
Istnieje również klasa modułowych języków programowania , która koncentruje się na interfejsach na poziomie modułu. Rodzina języków ML włącznie OCaml zawiera ciekawe podejście do modułów zwanych funktorami . OOP przyćmiło i w dużej mierze przysłoniło programowanie modułowe, ale wiele rzekomych zalet OOP dotyczy bardziej modułowości niż orientacji obiektowej.
Istnieje również spostrzeżenie, że klasy w językach OOP, takich jak C ++ lub Java, często nie są używane dla obiektów (w sensie podmiotów, które rozwiązują operacje poprzez późne wiązanie / dynamiczne wysyłanie), a jedynie do abstrakcyjnych typów danych (w których definiujemy publiczny interfejs, który ukrywa wewnętrzne szczegóły wdrożenia). Artykuł „ Understanding Data Abstraction, Revisited” (Cook, 2009) omawia tę różnicę bardziej szczegółowo.
Ale tak, wiele języków nie ma żadnego mechanizmu enkapsulacji. W tych językach członkowie struktury są publicznie dostępni. Co najwyżej istniałaby konwencja nazewnictwa zniechęcająca do użycia. Np. Myślę, że Pascal nie miał użytecznego mechanizmu enkapsulacji.