Pengertian Enkapsulasi OOP

Dalam object-oriented programming (OOP), enkapsulasi mengacu pada bundling data dengan metode yang beroperasi pada data tersebut, atau pembatasan akses langsung ke beberapa komponen objek.  Enkapsulasi digunakan untuk menyembunyikan nilai atau status objek data terstruktur di dalam class, mencegah akses langsung ke sana oleh klien dengan cara yang dapat mengekspos detail implementasi tersembunyi atau melanggar invarian status yang dikelola oleh metode.

Metode yang dapat diakses publik umumnya disediakan di Class untuk mengakses atau mengubah status secara lebih abstrak. Dalam praktiknya kadang-kadang metode (disebut “getter” dan “setter” ) disediakan untuk mengakses nilai secara tidak langsung, tetapi, meskipun tidak selalu merupakan pelanggaran enkapsulasi abstrak, mereka sering dianggap sebagai tanda dari pemrograman berorientasi objek yang berpotensi buruk. (OOP) praktik desain.

Mekanisme ini tidak unik untuk OOP. Implementasi tipe data abstrak , misalnya modul , menawarkan bentuk enkapsulasi yang serupa. Kesamaan telah dijelaskan oleh ahli teori bahasa pemrograman dalam hal tipe eksistensial.

Dalam bahasa pemrograman berorientasi objek , dan bidang terkait lainnya, enkapsulasi mengacu pada salah satu dari dua gagasan yang terkait tetapi berbeda, dan terkadang kombinasinya.

  • Mekanisme bahasa untuk membatasi akses langsung ke beberapa komponen objek.
  • Konstruksi bahasa yang memfasilitasi penggabungan data dengan metode (atau fungsi lain) yang beroperasi pada data tersebut.

Beberapa peneliti dan akademisi bahasa pemrograman menggunakan makna pertama sendiri atau dalam kombinasi dengan yang kedua sebagai fitur pembeda dari pemrograman berorientasi objek , sementara beberapa bahasa pemrograman yang menyediakan penutupan leksikal melihat enkapsulasi sebagai fitur bahasa ortogonal terhadap orientasi objek.

Definisi kedua dimotivasi oleh fakta bahwa dalam banyak bahasa berorientasi objek, dan bidang terkait lainnya, komponen tidak disembunyikan secara otomatis dan ini dapat diganti; dengan demikian, penyembunyian informasi didefinisikan sebagai gagasan terpisah oleh mereka yang lebih menyukai definisi kedua.

Fitur enkapsulasi didukung menggunakan kelas di sebagian besar bahasa berorientasi objek, meskipun alternatif lain juga ada.

Encapsulation and inheritance

Penulis Pola Desain membahas ketegangan antara pewarisan dan enkapsulasi panjang lebar dan menyatakan bahwa dalam pengalaman mereka, desainer terlalu sering menggunakan pewarisan.

Mereka mengklaim bahwa pewarisan sering merusak enkapsulasi, mengingat bahwa pewarisan memaparkan subkelas ke detail implementasi induknya. Seperti yang dijelaskan oleh  yo-yo probem, penggunaan warisan yang berlebihan dan oleh karena itu enkapsulasi, dapat menjadi terlalu rumit dan sulit untuk di-debug.

Information hiding

Di bawah definisi bahwa enkapsulasi “dapat digunakan untuk menyembunyikan anggota data dan fungsi anggota”, representasi internal suatu objek umumnya tersembunyi dari pandangan di luar definisi objek. Biasanya, hanya metode objek itu sendiri yang dapat secara langsung memeriksa atau memanipulasi bidangnya. Menyembunyikan internal objek melindungi integritasnya dengan mencegah pengguna menyetel data internal komponen ke status tidak valid atau tidak konsisten. Manfaat enkapsulasi yang seharusnya adalah dapat mengurangi kompleksitas sistem, dan dengan demikian meningkatkan ketahanan , dengan memungkinkan pengembang untuk membatasi saling ketergantungan antara komponen perangkat lunak.

Beberapa bahasa seperti Smalltalk dan Ruby hanya mengizinkan akses melalui metode objek, tetapi sebagian besar lainnya (misalnya, C++ , C# , Delphi atau Java ) menawarkan tingkat kontrol kepada programmer atas apa yang disembunyikan, biasanya melalui kata kunci seperti publicdan private.  Standar ISO C++ mengacu pada protected, privatedan publicsebagai ” penentu akses ” dan mereka tidak “menyembunyikan informasi apa pun”. Penyembunyian informasi dilakukan dengan memberikan versi kompilasi dari kode sumber yang dihubungkan melalui file header.

Contoh

Restricting data fields

Bahasa seperti C++ , C# , Java , PHP , Swift , dan Delphi menawarkan cara untuk membatasi akses ke bidang data.

Di bawah ini adalah contoh dalam C# yang menunjukkan bagaimana akses ke bidang data dapat dibatasi melalui penggunaan private kata kunci.

class Program
{
    public class Account
    {
        private decimal accountBalance = 500.00m;

        public decimal CheckBalance()
        {
            return this.accountBalance;
        }
    }

    static void Main()
    {
        Account myAccount = new Account();
        decimal myBalance = myAccount.CheckBalance();

        /* This Main method can check the balance via the public
         * "CheckBalance" method provided by the "Account" class 
         * but it cannot manipulate the value of "accountBalance" */
    }
}

Di bawah ini adalah contoh Java

public class Employee {
    private BigDecimal salary = new BigDecimal(50000.00);
    
    public BigDecimal getSalary() {
        return this.salary;
    }

    public static void main() {
        Employee e = new Employee();
        BigDecimal sal = e.getSalary();
    }
}

Enkapsulasi juga dimungkinkan dalam bahasa yang tidak berorientasi objek. Di C, misalnya, sebuah struktur dapat dideklarasikan di API publik melalui file header untuk serangkaian fungsi yang beroperasi pada item data yang berisi anggota data yang tidak dapat diakses oleh klien API dengan kata kunci eksternal.

// Header file "api.h"

struct Entity;          // Opaque structure with hidden members

// API functions that operate on 'Entity' objects
extern struct Entity *  open_entity(int id);
extern int              process_entity(struct Entity *info);
extern void             close_entity(struct Entity *info);
// extern keywords here are redundant, but don't hurt.
// extern defines functions that can be called outside the current file, the default behavior even without the keyword

Klien memanggil fungsi API untuk mengalokasikan, mengoperasikan, dan membatalkan alokasi objek dari tipe data buram. Konten jenis ini diketahui dan hanya dapat diakses oleh implementasi fungsi API; klien tidak dapat langsung mengakses isinya. Kode sumber untuk fungsi-fungsi ini mendefinisikan konten sebenarnya dari struktur:

// Implementation file "api.c"

#include "api.h"

struct Entity {
    int     ent_id;         // ID number
    char    ent_name[20];   // Name
    ... and other members ...
};

// API function implementations
struct Entity * open_entity(int id)
{ ... }

int process_entity(struct Entity *info)
{ ... }

void close_entity(struct Entity *info)
{ ... }

Di bawah ini adalah contoh Python, yang tidak mendukung pembatasan akses variabel. Namun, konvensinya adalah bahwa variabel yang namanya diawali dengan garis bawah harus dianggap pribadi.

class Car: 
    def __init__(self) -> None:
        self._maxspeed = 200
 
    def drive(self) -> None:
        print(f"Maximum speed is {self._maxspeed}.")
 
redcar = Car()
redcar.drive()  # This will print 'Maximum speed is 200.'

redcar._maxspeed = 10
redcar.drive()  # This will print 'Maximum speed is 10.'