-->

Pemrograman #3 - Enkapsulasi



Encapsulation

Enkapsulasi adalah konsep pemrograman berorientasi objek yang mengikat bersama-sama data dan fungsi yang memanipulasi data, dan membuat keduanya aman dari gangguan dan penyalahgunaan. Data enkapsulasi menyebabkan penyembunyian data menjadi penting pada konsep pemrograman berorientasi objek.

Enkapsulasi berasal dari kata kapsul yang berarti pembungkus. Enkapsulasi mempunyai arti pembungkusan terhadap data dan fungsi menjadi komponen tunggal. fitur dari enkapsulasi sendiri sudah didukung dikebanyakan bahasa pemrogramman berorientasi objek, meskipun ada alternatif yang lain. enkapsulasi mengijinkan untuk memilih properti yang dan metode (fungsi) yang akan disembunyikan didalam sebuah objek dengan cara membangun seperti dinding yang tidak tertembus untuk melindungi kode dari kerusakan yang tidak disengaja.

Enkapsulasi berarti bahwa representasi internal dari sebuah objek umumnya tersembunyi dari pandangan luar objek yang didefinisikan. Kebanyakan bahasa pemrogramman (seperti C++, C#, JAVA) menawarkan kepada programmer sebuah tingkatan untuk mengontrol atas apa yang tersembunyi, khususnya dengan menggunakan beberapa keyword seperti private dan public. Perlu dicatat pada ISO C++ mengartikan protected, private dan public sebagai “access specifier”. dan sebenarnya mereka tidak menyembunyikan informasi apapun. Menyembunyikan informasi telah tercapai oleh proses kompilasi (compiler) dari source code yang dihubungkan melalui header file.

Sudah dipelajari sebelumnya bahwa sebuah kelas memiliki anggota-anggota yang mempunyai akses penentu private, public, dan protected. Secara umum semua anggota data yang didefinisikan di kelas bersifat private.

Berikut contoh sederhana
class Student {
  private:
    string sId;
    string name;
    string gender;
  public:
    // Enkapsulasi pada data member “name”
    string getName() {
      return name;
    }
    void setName(string cName) {
      name = cName;
    }
};

Pada contoh diatas dapat dilihat bagaimana enkapsulasi dibuat pada data member “name”. Enkapsulasi secara lengkap terdiri atas dua buah fungsi dasar. Dimana pada fungsi pertama sebuah data member dengan nama “name” akan dikembalikan apa adanya. sedangkan pada fungsi kedua akan menyimpan variabel “cName” bertipe string, dimana variabel itu nantinya akan ditempatkan kedalam data member “name” yang ada pada kelas “Student”.

Hal ini perlu dilakukan untuk mengamankan data yang ada member “name” sehingga isi dari data tersebut tidak dapat dirubah-rubah oleh fungsi lain tanpa seijin dari kelas “Student” yang dalam ini sebagai pemilik resmi dari data member “name”.

Untuk lebih jelasnya perhatikan perbedaan dari dua kasus dibawah ini.
/* Berkas Student.cpp */
#include <iostream>
using namespace std;

class Student {
  public:
    string sId;
    string name;
    string gender;
};

class Staff {
  public:
    void printOut();
};

void Staff::printOut() { // Definisi fungsi dari class Staff
  Student student;
  student.gender = "M";
  cout << "Your gender is " << student. gender << endl;
}

int main() {
  Staff staff;
  staff.printOut();
  return 0;
}

Pada kasus yang pertama dapat dilihat terdapat dua buah kelas yaitu “Student” dan “Staff”. pada kelas “Student” terdapat tiga buah member data yaitu “sId”, “name”, dan “gender” dimana member tersebut diberikan akses public.

Dilain tempat terdapat satu buah kelas dengan nama “Staff” yang mempunyai fungsi “printOut”, pada fungsi itu dapat dilihat dimana terdapat kode student.gender = "M"; jika dilihat baik-baik terdapat operator (=) yang berarti penugasan dalam pengertian bahwa data member “gender” diberikan value bernilai “M”.

Dan jika dianalisa lagi terdapat kejanggalan dimana kelas “Staff” dapat merubah value data member yang terdapat pada kelas “Student”. Hal ini dianggap janggal sebab adanya campur tangan kelas lain dalam perubahan data member dari kelas tertentu. Dan ini akan menyebabkan kelas “Student” kehilangan kontrol atas data membernya.

Sekarang perhatikan kasus kedua
/* Berkas Student.cpp */
#include <iostream>
using namespace std;

class Student {
  private:
    string sId;
    string name;
    string gender;
  public:
    // Enkapsulasi
    string getGender() {return gender;}
    void setGender(string cGender) {
      gender = cGender; // Operator (=) tetap berada pada class Student
    }
};

class Staff {
  public:
    void printOut();
};

void Staff::printOut() { // Definisi fungsi dari class Staff
  Student student;
  student.setGender("M");
  cout << "Your gender is " << student.getGender() << endl;
}

int main() {
  Staff staff;
  staff.printOut();
  return 0;
}

Pada kasus yang kedua kelas “Student” mendapat perbaikan dengan penambahan enkapsulasi pada data member “gender”. dan jika dilakukan analisa pada fungsi “printOut” dikelas “Staff” terdapat kode student.setGender("M"); dalam hal ini terdapat perbedaan yang jelas antara kasus pertama dengan kasus yang kedua.

Perbedaannya dalam kasus yang kedua kelas “Staff” tidak melakukan perubahan terhadap data member pada kelas “Student” melainkan, kelas “Staff” hanya melakukan proses request (meminta) kepada kelas “Student” untuk melakukan perubahan pada data member “gender” menjadi bernilai “M”. Hal ini dapat dibuktikan dengan melihat dimana operator penugasan diletakkan yaitu pada potongan kode berikut : gender = cGender; // Operator (=) tetap berada pada class Student

Jika dilihat kembali pada kedua kasus diatas, dapat disimpulkan bahwa proses enkapsulasi bisa menyebabkan kelas “Student” dapat mengontrol semua aktifitas yang melibatkan data membernya meskipun data member tersebut sedang digunakan (diakses) oleh kelas lain. dan dengan diberikannya akses private pada data membernya, maka kelas “Student” dapat menjaga data membernya secara pribadi dari gangguan yang mungkin dilakukan oleh kelas yang lain baik disengaja maupun tidak disengaja.


Perhatikan kode program dibawah ini
/* Berkas Student.cpp */
#include <iostream>
using namespace std;

class Student {
  private:
    string sId;
    string name;
    string gender;
  public:
    // Enkapsulasi
    string getSId() {return sId;}
    void setSId(string cSId) {sId = cSId;} 
    string getName() {return name;}
    void setName(string cName) {name = cName;} 
    string getGender() {return gender;}
    void setGender(string cGender) {
      if(cGender == "M" || cGender == "m") {
        gender = cGender; // Operator (=) tetap berada pada class Student
      } else if(cGender == "F" || cGender == "f") {
        gender = cGender; 
      } else {
        gender = "";
      }
    }
};

class Staff {
  public:
    void printOut();
};

void Staff::printOut() { // Definisi fungsi dari class Staff    
  Student student;

  student.setSId("09.51.0045");
  student.setName("Fairul Fiza");
  /* 
  *  Setelah ada enkapsulasi maka class Staff hanya boleh meminta 
  *  nilai antara “M” atau “F” jika diluar itu maka gender akan diset 
  *  kembali ke nilai awal yaitu “” 
  */
  student.setGender("M");

  cout << "Hello... " << student.getName() << endl;
   cout << "Your gender is " << student.getGender() << endl;
  cout << "Student Id " << student.getSId() << endl;
}

int main() {
  Staff staff;
  staff.printOut();
  return 0;
}

Pada contoh diatas dapat disimpulkan bagaimana kelas “Student” mengatur data membernya sehingga dalam proses manipulasinya, kelas “Student” mampu memberikan validasi terhadap setiap masukan yang terjadi pada data membernya. Dalam hal ini data member “gender” hanya bisa diisikan dengan nilai “M” atau “F”. Apabila “gender” menerima inputan selain itu, maka kelas “Student” selaku pemilik data member “gender” akan mengembalikan nilainya menjadi nilai awal (“”), karena masukan selain dari apa yang sudah ditentukan dianggap tidak valid.
Load Comments

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel