Programming Language Concept Session 8

Programming Language Concept Session 8


  • Abstraksi merupakan suatu pandangan atau representasi dari suatu entitas yang didalamnya hanya mengandung atribut paling signifikan. Dua macam abstraksi fundamental di bahasa pemrograman kontemporer adalah abstraksi proses dan abstraksi data. Semua subprogram merupakan abstraksi proses karena ia menyediakan suatu jalan bagi suatu program untuk menjelaskan suatu proses, tanpa menyediakan detail bagaimana cara melakukan tugas tersebut.
  • Secara sintaksis, tipe data abstrak merupakan suatu penutup(enclosure) yang didalamnya hanya terdapat representasi data dari satu tipe data spesifik dan subprogram yang menyediakan operasi untuk tipe tersebut. Detail yang tidak berguna dari tipe tersebut akan disembunyikan dari unit yang berada di luar enclosure. Unit program yang menggunakan suatu tipe data abstak dapat mendeklarasi variable dari tipe tersebut, walau representasi sebenarnya disembunyikan dari mereka. Instansi dari suatu tipe data abstrak disebut objek (object).

User-Defined ADT


Berikut karakteristik dari User-Defined ADT:

  • Suatu definisi tipe yang memperbolehkan unit program untuk mendeklrasi variable dari tipe tersebut, namun menyembunyikan representasi objek dari tipe tersebut
  • Suatu kumpulan operasi untuk memanipulasi objek dari tipe tersebut

Suatu tipe data abstrak merupakan user defined data type yang memiliki kondisi berikut:

  • Representasi objek dari tipe tersebut disembunyikan dari unit progam yang menggunakan objek tadi, sehingga operasi yang mungkin terjadi hanyalah operasi yang disediakan di definisi tipe
  • Deklarasi dari tipe dan protocol dari operasi pada objek berada dalam satu unit sintaksis. Unit program lain diperbolehkan untuk membuat variable dari tipe yang didefinisikan.

Keuntungan information hiding:

  • Meningkatkan reliability
  • Mengurangi cakupan code dan banyak variable yang harus diperhatikan programmer saat menulis atau membaca bagian dari suatu program
  • Mengurangi peluang konflik nama karena scope dari variable lebih kecil

Walau define dari tipe data abstrak menjelaskan bahwa anggota data dari objek harus disembunyikan dari client, namun dalam beberapa kasus yang muncul, client membutuhkan akses anggota data tadi. Maka dari itu, solusi umum yang digunakan adalah menggunakan metode accessor, atau biasa dikenal dengan getter dan setter, yang memperbolehkan client secara tidak langsung mengakses data yang disembunyikan.

Berikut tiga alasan accessor lebih baik dari membuat data menjadi public:

  • Akses read-only dapat diberlakukan
  • Constraint (batasan) dapat dimasukkan dalam setter
  • Implementasi sebenarnya dari anggota data dapat diubah tanpa mempengaruhi client

ADT di C++


C++ menyediakan dua construct yang sangat identik satu sama lain, class dan struct. Class di C++ merupakan sebuah tipe. Unit program di C++ yang mendeklarasi suatu instansi dari suatu kelas dapat juga mengakses entitas public manapun di kelas tersebut, namun hanya melalui instansi dari kelas tadi.

Data yang di-define di kelas C++ dikenal dengan data member, sedangkan fungsi (method) yang di-define di keals disebut member function. Data member dan member function muncul dalam dua kategori, kelas dan instansi. Semua instansi dari suatu kelas berbagi satu set member function, namun tiap instansi memiliki data member kelasnya sendiri. Instansi kelas dapat berupa stack, stack dynamic, atau heap dynamic. Static atau stack dynamic direfenresikan langsung dengan nilai variable, sedangkan heap dynamic direferensikan lewat pointer.

C++ juga memperbolehkan fungsi constructor di definisi kelas, yang biasa digunakan untuk menginisialisasi data member dari objek yang baru saja dibuat. Constructor secara implisit dipanggil ketika sebuah objek dari tipe kelas tersebut dibuat. Selain constructor, kelas di C++ juga memiliki sebuah fungsi bernama destructor, yang secara implisit dipanggil ketika lifetime dari suatu instansi dari kelas berakhir. Nama dari destructor sama dengan nama kelasnya, didahului dengan sebuah tilde (~). Constructor dan destructor tidak memiliki return tipe, dan juga tidak menggunakan pernyataan return.

ADT di Java


ADT di Java hamper sama dengan C++, kecuali;

  • Semua objek dialokasi dari heap dan diakses lewat referensi variable
  • Semua tipe user-defined merupakan kelas
  • Entitas individual di kelas memiliki access control modifier (private atau public), bukan klausa
  • Java memiliki mekanisme scoping cadangan, package scope

ADT dengan Parameter


Salah satu bahasa yang mendukung ADT berparameter adalah C++. Kelas dapat menjadi generic dengan menulis fungsi constructor menjadi:

Stack(int size) {

stackPtr = new int [size];

maxLen = size – 1;

topSub = -1;

}

Deklarasi:

Stack stk(150);

Tipe elemen dari stack tersebut dapat dibuat menjadi generic dengan membuat suatu templated class. Lalu, tipe elemen tadi dapat menjadi sebuah template parameter. Berikut contohnya:

#include <iostream.h>

template <typename Type> // Type is the template parameter

class Stack {

private:

Type *stackPtr;

int maxLen;

int topSub;

public:

// A constructor for 100 element stacks

Stack() {

stackPtr = new Type [100];

maxLen = 99;

topSub = -1;

}

// A constructor for a given number of elements

Stack(int size) {

stackPtr = new Type [size];

maxLen = size – 1;

topSub = -1;

}

~Stack() {delete stackPtr;}; // A destructor

void push(Type number) {

if (topSub == maxLen)

cout << “Error in push—stack is full\n”;

else stackPtr[++ topSub] = number;

}

void pop() {

if (empty())

cout << “Error in pop—stack is empty\n”;

else topSub –;

}

Type top() {

if (empty())

cerr << “Error in top–stack is empty\n”;

else

return (stackPtr[topSub]);

}

int empty() {return (topSub == -1);}

}

Instansi dari templated kelas Stack dapat dibuat dengan deklarasi berikut:

Stack<int> myIntStack;

Encapsulation Construct


Ketika ukuran dari suatu program telah melebihi beberapa ribu baris, munculah dua tuntutan:

  • Pengorganisasian, selain hanya membaginya menjadi subprogram
  • Partial kompilasi (unit kompilasi yang lebih kecil dari program secara keseluruhan)

Solusi yang paling konkrit untuk kedua masalah diatas adalah dengan mengatur program menjadi collection code dan data yang berhubungan secara logis sehingga dapat di compile secara terpisah. Collection semacam itu disebut encapsulation.

Encapsulation di C


Di c, sebuah collection dari definisi data dan function yang berhubungan dapat diletakkan di suatu file, yang dapat di compile secara independen. Interface dari file semacam itu, berisi data, type, dan deklarasi fungsi, diletakkan di file yang berbeda yang dikenal dengan header file. Untuk memasukkan file header di aplikasi, maka digunakanlah spesifikasi preprosesor #include.

Encapsulation di C dapat menimbulkan beberapa ketidakamanan. Misal, seorang user dapat saja meng-cut dan paste definisi dari file header ke program client tanpa menggunakan spesifikasi preprosesor #include. Hal ini dapat saja bekerja, namun ada dua masalah yang akan muncul. Pertama, dokumentasi dari ketergantungan program client di library (dan file headernya) hilang. Kedua, author dapat mencoba untuk menggunakan implementasi file baru (tanpa sadar telah diubah) namun dengan file header yang lama, yang telah disalin user tersebut ke program clientnya. Misal, suatu variable x dapat didefinisikan bertipe int di file header lama, yang mana masih digunakan oleh client code, walau implementation code telah dikompilasi ulang dengan file header baru, yang mendefinisikan x menjadi float. Hal ini menyebabkan implementation code dikompilasi dengan x sebagai int tetapi client code dikompilasi dengan x sebagai float.

Encapsulation di C++


C++ menyediakan dua macam encapsulation yang berbeda, header dan file implementasi seperti di C, atau mengunakan kelas. Kelas digunakan sebagai interface (prototype) dan anggta definisi didefinisikan di file yang berbeda. Di C++, juga terdapat istilah “friends.” Fungsi friend memiliki akses ke entitas private dari kelas dimana mereka dideklarasi menjadi friends. Berikut contohnya:

class Matrix; //** A class declaration

class Vector {

friend Vector multiply(const Matrix&, const Vector&);

. . .

};

class Matrix { //** The class definition

friend Vector multiply(const Matrix&, const Vector&);

. . .

};

//** The function that uses both Matrix and Vector objects

Vector multiply(const Matrix& m1, const Vector& v1) {

. . .

}

Naming Encapsulation


C++ Namespace

C++ memiliki suatu spesifikasi, namespace, yang membantu program untuk mengelola masalah banyaknya nama global. Kita dapat meletakkan tiap library di namespacenya sendiri dan meng-qualify nama di program dengan nama dari namespace ketika nama tersebut dignakan diluar namespace. Contohnya, misalkan ada suatu ADT header file yang mengimplementasi stack. Jika terdapat keraguan bahwa file library lain mungkin mendefinisikan suatu nama yang telah digunakan  di ADT stack tersebut, file yang mendefinisikannya dapat diletakkan di namespacenya sendiri.

namespace myStackSpace {

// Stack declarations

}

Implementasi file untuk ADT stack tersebut dapat mereferensikan nama yang dideklarasi di header file dengan operator scope resolution (::), seperti di:

myStackSpace::topSub


Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 11)
  • Abstract Data Type/ Binus Powerpoint Presentation

This entry was posted in Computer Science, Programming Language Concept and tagged , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *