OOP tidak menemukan enkapsulasi dan tidak identik dengan enkapsulasi. Banyak bahasa OOP tidak memiliki pengubah akses gaya C ++ / Java. Banyak bahasa non-OOP memiliki berbagai teknik yang tersedia untuk menawarkan enkapsulasi.
Salah satu pendekatan klasik untuk enkapsulasi adalah penutupan , seperti yang digunakan dalam pemrograman fungsional . Ini secara signifikan lebih tua dari OOP tetapi setara. Misalnya dalam JavaScript kita mungkin membuat objek seperti ini:
function Adder(x) {
this.add = function add(y) {
return x + y;
}
}
var plus2 = new Adder(2);
plus2.add(7); //=> 9
plus2
Objek di atas tidak memiliki anggota yang akan memungkinkan akses langsung ke x
- itu sepenuhnya dirangkum. The add()
metode adalah penutupan atas x
variabel.
Bahasa C mendukung beberapa jenis enkapsulasi melalui mekanisme file tajuknya , khususnya teknik pointer buram . Dalam C, dimungkinkan untuk mendeklarasikan nama struct tanpa mendefinisikan anggotanya. Pada titik itu tidak ada variabel dari jenis struct yang dapat digunakan, tetapi kita dapat menggunakan pointer ke struct itu secara bebas (karena ukuran pointer struct diketahui pada waktu kompilasi). Misalnya, pertimbangkan file tajuk ini:
#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
Kami sekarang dapat menulis kode yang menggunakan antarmuka Adder ini, tanpa memiliki akses ke bidangnya, misalnya:
Adder plus2 = Adder_new(2);
if (!plus2) abort();
printf("%d\n", Adder_add(plus2, 7)); /* => 9 */
Adder_free(plus2);
Dan inilah detail implementasi yang dirangkum secara total:
#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;
}
Ada juga kelas bahasa pemrograman modular , yang berfokus pada antarmuka tingkat modul. Keluarga bahasa ML termasuk OCaml mencakup pendekatan yang menarik untuk modul yang disebut functors . OOP dibayangi dan sebagian besar dimasukkan pemrograman modular, namun banyak keuntungan yang diklaim OOP lebih tentang modularitas daripada orientasi objek.
Ada juga pengamatan bahwa kelas-kelas dalam bahasa OOP seperti C ++ atau Java sering tidak digunakan untuk objek (dalam arti entitas yang menyelesaikan operasi melalui pengikatan / pengiriman dinamis) tetapi hanya untuk tipe data abstrak (di mana kami mendefinisikan antarmuka publik yang menyembunyikan rincian implementasi internal). Makalah Tentang Memahami Abstraksi Data, Revisited (Cook, 2009) membahas perbedaan ini secara lebih rinci.
Tapi ya, banyak bahasa tidak memiliki mekanisme enkapsulasi sama sekali. Dalam bahasa ini, anggota struktur dibiarkan publik. Paling-paling, akan ada konvensi penamaan yang melarang penggunaan. Misalnya saya pikir Pascal tidak memiliki mekanisme enkapsulasi yang berguna.