ADT
adalah definisi TYPE dan sekumpulan PRIMITIF (operasi dasar) terhadap TYPE
tersebut. Selain itu, dalam sebuah ADT yang lengkap, disertakan pula definisi
invarian dari TYPE dan aksioma yang berlaku. ADT merupakan definisi statik. Definisi type dari sebuah ADT
dapat mengandung sebuah definisi ADT lain.
Misalnya
:
Ø ADT
Waktu yang terdiri dari ADT JAM dan ADT DATE
Ø GARIS
yang terdiri dari dua buah POINT
Ø SEGI4
yang terdiri dari pasangan dua buah POINT (Top, Left) dan (Bottom, Right)
Pentingnya
sebuah ADT (Abstract Data Type) :
Ø Struktur yang
besar memungkinkan sistem menjadi komponen berlapis.
Ø Memungkinkan
kode program menjadi lebih generik / reusable.
Ø Biarkan
fokus apa (spesifikasi) untuk dipisahkan dari bagaimana (implementasi)
Ø Digunakan
modularitas untuk perubahan lokal
Type
diterjemahkan menjadi type terdefinisi dalam bahasa yang bersangkutan, misalnya
menjadi record
dalam bahasa Ada/Pascal atau struct dalam bahasa C.
Dua jenis tipe data :
1. Opaque data types
Yaitu
di mana representasi tidak
diketahui pengguna.
2. Transparent data types
Yaitu
di mana representasi yang
menguntungkan diketahui pengguna: - yaitu encoding diakses secara langsung dan
/ atau dimodifikasi oleh pengguna.
Bagaimana
merancang sebuah data type :
Langkah
1 : Specification
Ø Buatlah daftar operasi (hanya sebuah nama) pikirkan apa
keperluannya. Meninjau dan memperbaiki daftar.
Ø Tentukan setiap konstanta yang mungkin diperlukan.
Ø Jelaskan parameter operasional
secara rinci.
Ø Jelaskan semantik operasi (apa yang akan dilakukan) setepat
mungkin.
Langkah
2 : Application
Ø Mengembangkan aplikasi nyata atau imajiner untuk menguji
spesifikasi.
Ø Hilang atau operasi lengkap yang ditemukan sebagai efek
samping mencoba untuk menggunakan spesifikasi.
Langkah
3 : Implementation
Ø Tentukan representasi yang sesuai.
Ø Melaksanakan operasi.
Ø Test, debug, dan merevisi.
Primitif,
dalam konteks prosedural, diterjemahkan menjadi fungsi atau prosedur. Primitif
dikelompokkan menjadi :
Ø Konstruktor/Kreator,
pembentuk nilai type. Semua objek
(variabel) bertype tersebut harus melalui konstruktor. Biasanya namanya diawali
Make.
Ø Selektor,
untuk mengakses komponen tye (biasanya namanya diawali dengan Get)
Ø Prosedur,
pengubah nilai komponen (biasanya namanya diawali Get)
Ø Validator
komponen type, yang dipakai untuk meng_test apakah dapat membentuk type sesuai
dengan batasan.
Ø Destruktor/Dealokator,
yaitu untuk “menghancurkan” nilai objek (sekaligus memori penyimpanannya)
Ø Baca/Tulis,
untuk interface dengan input/output device.
Ø Operator
relational, terhadap type tersebut untuk mendefinisikan lebih besar, lebih
kecil, sama dengan, dan sebagainya.
Ø Aritmatika,
terhadap type tersebut karena biasanya aritmatika dalam bahasa pemrograman
hanya terdefinisi untuk bilangan numerik.
Ø Konversi,
dari type tersebut ke type dasar dan sebaliknya.
ADT
biasanya diimplementasi menjadi dua buah modul, yaitu :
1. Definisi/Spesifikasi
Type dan Primitif.
a. Spesifikasi
type sesuai dengan bahasa yang bersangkutan.
b. Spesifikasi
dari primitif sesuai dengan kaidah dalam konteks prosedural, yaitu :
Ø Fungsi
: nama, domain, range dan prekondisi
jika ada.
Ø Prosedur
: Initial State, Final State dan Proses
yang dilakukan.
2. Body/realisasi
dari primitif, berupa kode program dalam bahasa yang bersangkutan. Realisasi
fungsi dan prosedur harus sedapat mungkin memanfaatkan selektor dan
konstruktor.
Supaya
ADT dapat di-test secara tuntas, maka dalam hal ini setiap kali membuat sebuah
ADT, harus disertai dengan sebuah program utama yang dibuat khusus untuk
meng_test ADT tersebut, yang minimal mengandung pemakaian (call) terhadap setiap fungsi dan prosedur dengan mencakup semua
kasus parameter. Program utama yang khusus dibuat untuk test ini disebut
sebagai driver. Urutan pemanggilan
harus diatur sehingga fungsi/prosedur yang memakai fungsi/prosedur lain harus
sudah ditest dan direalisasikan terlebih dulu.
Di
dalam modul ADT tidak terkandung definisi variabel. Modul ADT biasanya
dimanfaatkan oleh modul lain, yang akan mendeklarasikan variabel bertype ADT
tersebut dalam modulnya. Jadi ADT bertindak sebagai Supplier (penyedia type dan primitif), sedangkan modul pengguna
berperan sebagai Client (pengguna)
dari ADT tersebut. Biasanya ada sebuah pengguna yang khusus yang disebut
sebagai main program (program utama) yang memanfaatkan langsung type
tersebut.
Contoh
ADT :
Complex
Number
ADT
Example :
Class Complex
{
private …
minus(Complex
c); // this.minus(c) mutator
times(Complex
c); // this.times(c)
getImajiner();
// return this.i asseccor
}
|
Implementasi
ADT JAM dalam bahasa Algoritmik :
{
Definisi TYPE JAM <HH:MM:SS> }
TYPE Hour
: integer [0..23]
TYPE
Minute : integer [0..59]
TYPE
Second : integer [0..59]
TYPE JAM
: < HH: Hour, {Hour [0..23]}
MM: Minute, {Minute [0..59]}
SS: Second, {Second [0..59]} >
{*** **}
{DEFINISI PRIMITIF}
{*** **}
{
KELOMPOK VALIDASI TERHADAP TYPE }
{*** **}
Function IsJValid (H,M,S:integer)->boolean
{Mengirim true jika H,M,S dapat membentuk J yang
valid}
{Konstruktor: Membentuk sebuah JAM dari
Komponen-komponen}
Function MakeJam (HH:integer, MM:integer,
SS:integer)->JAM
{Membentuk sebuah JAM dari komponen-komponennya
yang valid}
{Pre cond: HH,MM,SS valid untuk membentuk JAM}
{**
Operasi terhadap komponen : selektor Get dan Set **}
{**
Selektor **}
Function
Hour(J:JAM)->integer
{Mengirimkan
bagian HH(Hour) dari JAM}
Function
Minute(J:JAM)->integer
{Mengirimkan
bagian MM(Minute) dari JAM}
Function
Second(J:JAM)->integer
{Mengirimkan
bagian SS(Second) dari JAM}
{**
Pengubah nilai komponen **}
Procedure
SetHH(Input/Output J:JAM, Input newHH:integer)
{Mengubah
nilai komponen HH dari J}
Procedure
SetMM(Input/Output J:JAM, Input newMM:integer)
{Mengubah
nilai komponen MM dari J}
Procedure
SetSS(Input/Output J:JAM, Input newSS:integer)
{Mengubah
nilai komponen SS dari J}
{*** **}
{ KELOMPOK
BACA/TULIS }
Procedure
BacaJam (Input/Output J:JAM)
{I.S.
: J tidak terdefinisi}
{F.S.
: J terdefinisi dan merupakan jam yang valid}
{Proses
: mengulangi membaca komponen H,M,S sehingga membentuk J yang valid}
{***
**}
Procedure
TulisJam (Input J:JAM)
{I.S.
: J sembarang}
{F.S.
: Nilai J ditulis dengan format HH:MM:SS}
{Proses
: menulis nilai ke layar}
{***
**}
{KELOMPOK
KONVERSI TERHADAP TYPE}
{*** **}
Function
JamToDetik (J:JAM)-> integer
{Diberikan
sebuah JAM, mengkonversi menjadi Detik}
{Rumus
: detik = 3600*hour+60*minute+second}
{nilai
maksimum = 3600*23+59*60+59*60}
{hati-hati
dengan representasi integer pada bahasa implementasi}
{kebanyakan
sistem mengimplementasi integer,bernilai maksimum kurang dari nilai maksimum
hasil konversi}
{***
**}
Function
DetikToJam (N:integer)-> JAM
{Mengirim
konversi detik ke JAM}
{pada
beberapa bahasa, representasi integer tidak cukup untuk menampung N}
{***
**}
{
KELOMPOK OPERASI TERHADAP TYPE }
{*** **}
{**
Kelompok Operator Relational }
Function
JEQ(J1:JAM, J2:JAM)-> boolean
{Mengirimkan
true jika J1=J2, false jika tidak}
Function
JNEQ(J1:JAM, J2:JAM)-> boolean
{Mengirimkan
true jika J1 tidak sama dengan J2}
Function
JLT(J1:JAM, J2:JAM)-> boolean
{Mengirimkan
true jika J1<J2, false jika tidak}
Function
JGT(J1:JAM, J2:JAM)-> boolean
{Mengirimkan
true jika J1>J2, false jika tidak}
{*****
Operator Aritmatika JAM *****}
Function
JPlus(J1:JAM, J2:JAM)-> JAM
{Menghasilkan
J1+J2, dalam bentuk JAM}
Function
JMinus(J1:JAM, J2:JAM)-> JAM
{Menghasilkan
J1-J2, dalam bentuk JAM}
{Precond
: J1>=J2}
Function
NextDetik(J:JAM)-> JAM
{Mengirim
1 detik setelah J dalam bentuk JAM}
Function
NextDetik(J:JAM, N:integer)-> JAM
{Mengirim
N detik setelah J dalam bentuk JAM}
Function
PrevDetik(J:JAM)-> JAM
{Mengirim
1 detik sebelum J dalam bentuk JAM}
Function
PrevDetik(J:JAM, N:integer)-> JAM
{Mengirim
N detik sebelum J dalam bentuk JAM}
Function
Durasi(Jaw:JAM, Jakh:JAM)-> integer
{Mengirim
Jakh-Jaw dalam Detik, dengan kalkulasi}
{Hasilnya
negatif jika Jaw > Jakh}
|
Catatan
Implementasi :
Di
dalam implementasi dengan bahasa C, di mana representasi integer ada
bermacam-macam, maka harus berhati-hati, misalnya :
1. Dalam
menentukan range dari fungsi Durasi,
karena nilai detik dalam dua puluh empat jam melebihi representasi int.
2. Representasi
Hour, Minute dan Second terpaksa harus dalam bentuk int dan tidak mungkin
dibatasi dengan angka yang persis. Itulah sebabnya fungsi validitas terhadap
type diperlukan.
Banyak
juga contoh ADT di dalam Data Structure :
-
ADT Integer
-
ADT Primitive
-
Linked
List ADT
-
Linked
List Iteration ADT
-
Ordered
List ADT
-
Sorted
List ADT
-
Double
Linked List ADT
-
Circular
Linked List ADT