Priority Queue Modularitas dan Abstraksi Data

2008 | Direktorat Pembinaan SMK 515 berprioritas paling tinggi lah yang diperoleh. Dalam pengembangannya pertama kali adalah memformulasikan konsep abstraksnya tanpa harus memikirkan tipe datanya, apalagi implementasi rincinya. Implementasinya sendiri dapat dilakukan dalam dua representasi level bawah yang berbeda: array atau linked-list yang dapat belakangan kita buat. Banyak ditemukan dalam masalah-masalah penjadwalan, misalnya untuk sistem antrian untuk pelayanan pasien dalam ruang praktek dokter, penjadwalan pembayaran tagihan, dsb. Prioritas bisa didefinisikan dalam beberapa aspek. PQ dapat digunakan juga untuk pengurutan data kengan key data sebagai harga prioritas: sejumlah data tak terurut dimasukkan ke dalam PQ lalu setelah semua masuk satu demi satu data diambil dari PQ. Pada pengurutan menaik maka data yang diambil ditaruh dari kanan ke kiri elemen-elemen array. Pada pengurutan menurun harga key bisa kebalikan dari harga prioritas, alterntifnya data yang di ambil satu demi satu di taruh dari kiri ke kanan elemen-elemen array. Terdapat sejumlah metoda operasi yang menjadi interface: bagi pemakai kelas obyek ini.  mengkonstruksikan PQ yang diinisialisasi kosong PQ = new PriorityQueue;  mendapatkan ukuran jumlah item data dalam PQ, n = PQ.size;  menyisipkan item baru dalam PQ, PQ.insertX;  bila PQ tidak kosong, menghapus item dengan prioritas tertinggi dalam PQ X = PQ.remove; Secara sepintas bisa diketahui bahwa terdapat suatu proses internal yang tidak perlu diketahui oleh user di dalam skema ini yaitu pengurutan item data. Implementasi bagaimana pun user tidak perduli. Contoh penggunaan dalam metoda pengurutan data berdasarkan Priority Queue: Program 15.3 void priorityQueueSortComparisonKey[] A { int n = A.length; PriorityQueue PQ = new PriorityQueue; create inisialisasi PQ for int i = ; i n; i++ PQ.insertA[i]; mengisi PQ for int i = n‐ 1 ; i = ; i‐‐ A[i] = PQ.remove; mengambil satusatu } Selanjutnya contoh penggunaan PQ dengan tipe key integer ini dapat dilihat dalam program lebih lengkapnya. Pada saat ini definisi kelas PriorityQueue belum diimplementasikan. Sebelum mengimplementasikannya maka key data item yang sedang kerjakan ini dibungkus dalam tipe data yang generik yaitu: ComparisonKey sebagai suatu interface. 516 Direktorat Pembinaan SMK | 2008 interface ComparisonKey { int compareToComparisonKey value; String toString; } Selanjutnya ComparisonKey ini diimplementasikan sesuai dengan tipe data yang sedang digunakan, dalam hal ini misalnya kita menggunakan integer nanti kita lihat bila key bertipe String. Program 15.4 public class PQItem implements ComparisonKey { private int key; PQItemint value { key = value; } public String toString { return Integer.toStringkey; } public int compareToComparisonKey value { int a = this.key; int b = PQItem value.key; return a==b? : a b? 1 : ‐ 1 ; } } Pada level yang lebih rendah kelas priority queue ini dapat diimplementasikan baik dengan array atau dengan linked list, dimana hal tersebut dijelaskan sebagai berikut:  Versi Implementasi Unsorted Array berukuran dinamis PQ menyimpan item data dalam suatu array yang apabila penuh panjangnya dapat diperbesar secara otomatis. Item data masuk begitu saja di bagian belakang. Saat di-remove maka item data dengan key terbesar dicari dilakukan sequential search. Key yang diremove tempatnya digantikan oleh key yang paling belakang tidak melakukan pergeseran  Versi Implementasi Sorted Linked- list Saat item data masuk dalam PQ maka langsung ditempatkan pada posisi yang sesuai dalam urutan menurun dilakukan pencarian posisi terlebih dulu lalu dilakukan insert, dan saat di-remove maka cukup dilakukan delete-first node pertama yang diambil. Kedua implementasi tersebut berfungsi sama tapi dengan implementasi yang berbeda namun sekali lagi user melihatnya sesuai dengan abstraksi spesifikasi PQ yang ditentukan. Dalam prakteknya maka kedua versi itu bisa dipilih tanpa mengubah modul-modul pemakainya selama spesifikasinya ditaati. Selain implementasinya yang bisa berbeda tanpa mengubah rancangan modul tingkat di atasnya, representasi key data pun dapat diimplementasikan secara berbeda 2008 | Direktorat Pembinaan SMK 517 karena ComparisonKey yang didefinisikan abstraks tersebut. Dengan abstraksi ComparisonKey di atas maka key bertipe lain dapat menggantikan tipe key integer dalam contoh di atas.ComparisonKey ini memiliki konsep Representation Independent Module. Berikut ini representasi String untuk key. Program 15.5 class PQItem implements ComparisonKey { private String key; PQItemString value { key = value; } public String toString { return key; } public int compareToComparisonKey value { String a = this.key; String b = PQItemvalue.key; return a.compareTob; metoda compareTo dalam kelas String } } Dalam program aplikasinya perubahan terjadi pada bagian data, sementara sejumlah metoda tetap sama.

15.6. Modularitas dan Penyebunyian Informasi

Saat program menjadi semakin besar terjadi situasi berbahaya: rumit, sulit melakukan debug, dan hampir tidak mungkin di modifikasi kecuali dikembangkan dengan taat dan secara terstruktur. Penulisan program komputer dilakukan melalui medium yang memungkinkan bervariasinya cara penulisan ekspresi-ekspresi yang potensial dapat menyebabkan masalah yang besar. Dekomposisi ke dalam komponen-komponennya pun dapat bervariasi, bisa saling kait- mengkait secara kompleks atau teratur dalam layer-layer. Abstraksi prosedural: menyatakan fungsi apa what yang dilakukan suatu prosedur. Kita perlu mendefinisikan apa dari suatu prosedur terpisah dari bagaimana how cara yang dilakukan prosedur untuk mencapai fungsi tersebut. Setelah terdefinisi dengan baik abstraksi prosedur ini kemudian kita boleh menuliskan rincian bagaimana tersebut, bahkan suatu saat misalnya untuk peningkatan efisiensi maka metodologialgoritmanya dapat disubstitusikan tanpa mengubah abstraksi proseduralnya. Jadi pemisahan tersebut memberi manfaat: 518 Direktorat Pembinaan SMK | 2008  Memudahkan penggunaan -- hanya perlu tahu apa yang dilakukan oleh prosedur P  Memudahkan modifikasi -- rincian penulisan P dapat diubah tabpa mengganggu program secara keseluruhan di mana saja pada pemanggilan-pemanggian P. Secara umum pendefinisian abstraksi dengan baik pada perancangan program dapat mengendalikan kompleksitas program serta meningkatkan modifiabilitas. Penyembunyian informasi enkapsulasi baik variabel ataupun metoda dalam modul-modul bermanfaat dalam:  Menghindari interferensi entitas lokal dalam modul terhadap entitas bernama sama di luar modul  Menghindari interferensi entitas diluar modul terhadap entitas lokal dalam modul terhadap entitas bernama sama Bahasa berorientasi obyek semacam C++ atau Java mengakomodasikan enkapsulasi ini dengan baik dengan deklarasi private. Dalam Java terdapat tingkatan lebih lanjut sepain private, yaitu: package, protected, baru kemudian public. Istilah package dalam Java memiliki konsep yang sama dengan istilah unit atau module dalam bahasa pemrograman lain.

15.7. Interface

Interface adalah jenis khusus dari blok yang hanya berisi method signatureatau constant . Interface mendefinisikan sebuahsignature dari sebuah kumpulan method tanpa tubuh. Interface mendefinisikan sebuah cara stkitar dan umum dalam menetapkan sifat-sifat dari class- class. Mereka menyediakan class- class, tanpa memperhatikan lokasinya dalam hirarki class, untuk mengimplementasikan sifat-sifat yang umum. Dengan catatan bahwa interface-interface juga menunjukkan polimorfisme, dikarenakan program dapat memanggil method interface dan versi yang tepat dari method yang akan dieksekusi tergantung dari tipe object yang melewati pemanggil method interface. Kita akan menggunakan interface jika kita ingin class yang tidak berhubungan mengimplementasikan method yang sama. Melalui interface-interface, kita dapat menangkap kemiripan diantara class yang tidak berhubungan tanpa membuatnya seolah-olah class yang berhubungan.Mari kita ambil contoh class Line dimana berisi method yang menghitung panjang dari garis dan membandingkan object Line ke object dari class yang sama. Sekarang, misalkan kita punya class yang lain yaitu MyInteger dimana berisi method yang membandingkan object MyInteger ke object dari class yang sama. Seperti yang kita lihat disini, kedua class-class mempunyai method yang mirip dimana membandingkan mereka dari object lain dalam tipe yang sama, tetapi mereka tidak berhubungan sama sekali. Supaya dapat menjalankan cara untuk memastikan bahwa dua