DESAIN SOFTRWARE
5.5 PENDEKATAN UNTUK DESAIN PERANGKAT LUNAK
Ada dua pendekatan yang berbeda secara mendasar untuk desain perangkat lunak yang digunakan saat ini — desain berorientasi fungsi, dan desain berorientasi objek. Meskipun kedua pendekatan desain ini sangat berbeda, keduanya saling melengkapi daripada teknik bersaing. Pendekatan berorientasi objek adalah teknologi yang relatif baru dan masih terus berkembang. Untuk pengembangan program besar, pendekatan berorientasi objek menjadi semakin populer karena keunggulan tertentu yang ditawarkannya. Di sisi lain, perancangan berorientasi fungsi adalah teknologi yang matang dan memiliki banyak pengikut. Fitur yang menonjol dari kedua pendekatan ini dibahas dalam sub-bagian 5.5.1 dan 5.5.2 masing-masing.
Desain berorientasi fungsi
Berikut ini adalah fitur yang menonjol dari pendekatan desain berorientasi fungsi:
Dekomposisi top-down: Sebuah sistem, untuk memulai, dipandang sebagai kotak hitam yang menyediakan layanan tertentu (juga dikenal sebagai fungsi tingkat tinggi) kepada pengguna sistem. Dalam dekomposisi top-down, mulai dari tampilan sistem tingkat tinggi, setiap fungsi tingkat tinggi secara berturut-turut disempurnakan menjadi fungsi yang lebih rinci.
Misalnya, pertimbangkan fungsi buat-anggota perpustakaan baru yang pada dasarnya membuat catatan untuk anggota baru, memberikan nomor keanggotaan unik kepadanya, dan mencetak tagihan untuk biaya keanggotaannya. Fungsi tingkat tinggi ini dapat disempurnakan menjadi subfungsi berikut:
• assign-membership-number
• buat-catatan-anggota
• tagihan cetak
Masing-masing subfungsi ini dapat dipecah menjadi subfungsi yang lebih rinci dan seterusnya.
Status sistem terpusat: Status sistem dapat didefinisikan sebagai nilai item data tertentu yang menentukan respons sistem terhadap tindakan pengguna atau peristiwa eksternal. Misalnya, kumpulan buku (yaitu apakah dipinjam oleh pengguna yang berbeda atau tersedia untuk diterbitkan) menentukan status sistem otomasi perpustakaan. Data tersebut dalam program prosedural biasanya memiliki cakupan global dan dibagi oleh banyak modul.
Status sistem terpusat dan dibagi di antara fungsi-fungsi yang berbeda. Misalnya, dalam sistem manajemen perpustakaan, beberapa fungsi seperti berbagi data berikut seperti catatan anggota untuk referensi dan pembaruan:
• buat-anggota baru
• hapus-anggota
• perbarui-catatan-anggota
Sejumlah besar pendekatan desain berorientasi fungsi telah diusulkan di masa lalu.
Beberapa pendekatan desain berorientasi fungsi yang mapan adalah sebagai berikut:
• Desain terstruktur oleh Constantine and Yourdon, [1979]
• Desain terstruktur Jackson oleh Jackson [1975]
• Metodologi Warnier-Orr [1977, 1981]
• Penyempurnaan bertahap oleh Wirth [1971]
• Metodologi Hatley dan Pirbhai [1987]
Desain berorientasi objek
Dalam pendekatan desain berorientasi objek (OOD), sebuah sistem dipandang sebagai terdiri dari kumpulan objek (yaitu entitas). Setiap objek diasosiasikan dengan sekumpulan fungsi yang disebut metodenya. Setiap objek berisi datanya sendiri dan bertanggung jawab untuk mengelolanya. Data internal ke suatu objek tidak dapat diakses secara langsung oleh objek lain dan hanya melalui pemanggilan metode objek. Status sistem terdesentralisasi karena tidak ada data yang dibagikan secara global dalam sistem dan data disimpan di setiap objek. Misalnya, dalam perangkat lunak otomatisasi perpustakaan, setiap anggota perpustakaan dapat menjadi objek terpisah dengan datanya sendiri dan berfungsi untuk beroperasi pada data yang disimpan. Metode yang didefinisikan untuk satu objek tidak dapat secara langsung merujuk atau mengubah data objek lain.
Paradigma desain berorientasi objek memanfaatkan secara ekstensif prinsip-prinsip abstraksi dan dekomposisi seperti yang dijelaskan di bawah ini. Objek menguraikan sistem menjadi modul fungsional independen. Objek juga dapat dianggap sebagai instance dari tipe data abstrak (ADT). Konsep ADT tidak berasal dari pendekatan berorientasi objek. Bahkan, konsep ADT banyak digunakan dalam bahasa pemrograman ADA yang diperkenalkan pada tahun 1970-an. ADT merupakan konsep penting yang membentuk pilar penting dari orientasi objek. Sekarang mari kita bahas konsep penting di balik ADT. Faktanya, ada tiga konsep penting yang terkait dengan ADT—abstraksi data, struktur data, tipe data:
Abstraksi data: Prinsip abstraksi data menyiratkan bahwa bagaimana data disimpan secara tepat diabstraksikan. Ini berarti bahwa setiap entitas di luar objek (yaitu, turunan dari ADT) tidak akan memiliki pengetahuan tentang bagaimana data secara tepat disimpan, diatur, dan dimanipulasi di dalam objek. Entitas eksternal ke objek dapat mengakses data interna l ke objek hanya dengan memanggil metode tertentu yang terdefinisi dengan baik yang didukung oleh objek. Pertimbangkan ADT seperti tumpukan. Data objek tumpukan dapat disimpan secara internal dalam larik, daftar tertaut linier, atau daftar tertaut dua arah. Entitas eksternal tidak memiliki pengetahuan tentang ini dan dapat mengakses data objek tumpukan hanya melalui operasi yang didukung seperti push dan pop.
Struktur data: Struktur data dibangun dari kumpulan item data primitif. Sama seperti seorang insinyur sipil membangun struktur teknik sipil yang besar dengan menggunakan bahan bangunan primitif seperti batu bata, batang besi, dan semen; seorang programmer dapat membangun struktur data sebagai kumpulan terorganisir dari item data primitif seperti integer, angka floating point, karakter, dll.
Tipe data: Tipe adalah terminologi bahasa pemrograman yang mengacu pada apa pun yang dapat dipakai. Misalnya, int, float, char, dll., adalah tipe data dasar yang didukung oleh bahasa pemrograman C. Dengan demikian, kita dapat mengatakan bahwa ADT adalah tipe data yang ditentukan pengguna.
Dalam orientasi objek, kelas adalah ADT. Tapi, apa keuntungan mengembangkan aplikasi menggunakan ADT? Mari kita periksa tiga keuntungan utama menggunakan ADT dalam program:
• Data objek dienkapsulasi dalam metode. Prinsip enkapsulasi juga dikenal sebagai penyembunyian data. Prinsip enkapsulasi mensyaratkan bahwa data dapat diakses dan dimanipulasi hanya melalui metode yang didukung oleh objek dan tidak secara langsung. Ini melokalisasi kesalahan. Alasannya adalah sebagai berikut. Tidak ada elemen program yang diizinkan untuk mengubah data, kecuali melalui pemanggilan salah satu metode. Jadi, kesalahan apa pun dapat dengan mudah dilacak ke segmen kode yang mengubah nilainya. Artinya, metode yang mengubah item data, membuatnya salah dapat dengan mudah diidentifikasi.
• Desain berbasis ADT menampilkan kohesi tinggi dan kopling rendah. Oleh karena itu, desain berorientasi objek sangat modular.
• Karena prinsip abstraksi digunakan, itu membuat solusi desain mudah dimengerti dan membantu mengelola kompleksitas.
Objek serupa membentuk kelas. Dengan kata lain, setiap objek adalah anggota dari beberapa kelas. Kelas dapat mewarisi fitur dari kelas super. Secara konseptual, objek berkomunikasi melalui pesan yang lewat. Objek memiliki data internalnya sendiri. Jadi suatu objek mungkin ada di negara bagian yang berbeda tergantung nilai data internal. Di negara bagian yang berbeda, suatu objek dapat berperilaku berbeda. Bagian ini akan diuraikan konsep-konsep ini di Bab 7 dan selanjutnya asdalah metodologi desain berorientasi objek di Bab 8.
Pendekatan desain berorientasi fungsi berorientasi objek
Berikut ini adalah beberapa perbedaan penting antara desain berorientasi fungsi dan berorientasi objek:
• Tidak seperti metode desain berorientasi fungsi dalam OOD, abstraksi dasar bukanlah layanan yang tersedia bagi pengguna sistem seperti buku terbitan, detail buku tampilan, buku yang diterbitkan, dll., tetapi entitas dunia nyata seperti anggota , buku, register buku, dll. Misalnya dalam OOD, perangkat lunak penggajian karyawan tidak dikembangkan dengan merancang fungsi seperti update-employee- record, get-employee-address, dll., tetapi dengan mendesain objek seperti karyawan , departemen, dll.
• Dalam OOD, informasi keadaan ada dalam bentuk data yang didistribusikan di antara beberapa objek sistem. Sebaliknya, dalam desain prosedural, informasi status tersedia di penyimpanan data bersama yang terpusat. Misalnya, saat mengembangkan sistem daftar gaji karyawan, data karyawan seperti nama karyawan, nomor kode, gaji pokok, dll., biasanya diimplementasikan sebagai data global dalam sistem pemrograman tradisional; sedangkan dalam desain berorientasi objek, data ini didistribusikan di antara objek karyawan yang berbeda dari sistem. Obyek berkomunikasi melalui message passing. Oleh karena itu, satu objek dapat menemukan informasi status objek lain dengan mengirimkan pesan ke objek tersebut. Tentu saja, di suatu tempat atau lainnya fungsi dunia nyata harus diimplementasikan.
• Teknik berorientasi fungsi mengelompokkan fungsi bersama-sama jika, sebagai sebuah kelompok, mereka membentuk fungsi tingkat yang lebih tinggi. Di sisi lain, teknik berorientasi objek mengelompokkan fungsi bersama berdasarkan data yang mereka operasikan.
Untuk mengilustrasikan perbedaan antara pendekatan desain berorientasi objek dan berorientasi fungsi, mari kita perhatikan sebuah contoh—sistem alarm kebakaran otomatis untuk bangunan besar.
Sistem alarm kebakaran otomatis—persyaratan pelanggan
Pemilik gedung bertingkat yang besar ingin memiliki sistem alarm kebakaran terkomputerisasi yang dirancang, dikembangkan, dan dipasang di gedungnya. Detektor asap dan alarm kebakaran akan ditempatkan di setiap ruangan gedung. Sistem alarm kebakaran akan memantau status detektor asap ini. Setiap kali kondisi kebakaran dilaporkan oleh salah satu detektor asap, sistem alarm kebakaran harus menentukan lokasi di mana api telah dirasakan dan kemudian membunyikan alarm hanya di lokasi tetangga. Sistem alarm kebakaran juga harus mem-flash pesan alarm di konsol komputer. Personel pemadam kebakaran akan menjaga konsol sepanjang waktu. Setelah kondisi kebakaran berhasil ditangani, sistem alarm kebakaran harus mendukung pengaturan ulang alarm oleh personel pemadam kebakaran.
Pendekatan berorientasi fungsi: Dalam pendekatan ini, fungsi tingkat tinggi yang berbeda pertama kali diidentifikasi, dan kemudian struktur data dirancang.
Fungsi-fungsi yang beroperasi pada status sistem adalah:
interrogate_detectors();
get_detector_location();
determine_neighbour_alarm();
determine_neighbour_sprinkler();
ring_alarm();
activate_sprinkler();
reset_alarm();
reset_sprinkler();
report_fire_location();
Pendekatan berorientasi objek: Dalam pendekatan berorientasi objek, kelas objek yang berbeda diidentifikasi. Selanjutnya, metode dan data untuk setiap objek diidentifikasi.
Akhirnya, jumlah instance yang sesuai dari setiap kelas dibuat.
class detector
attributes: status, location, neighbours
operations: create, sense-status, get-location, find-neighbours
class alarm
attributes: location, status
operations: create, ring-alarm, get_location, resetalarm class sprinkler
attributes: location, status
operations: create, activate-sprinkler, get_location, reset-sprinkler
Kita sekarang dapat membandingkan pendekatan berorientasi fungsi dan berorientasi objek berdasarkan dua contoh yang dibahas di atas, dan dengan mudah mengamati perbedaan utama berikut:
• Dalam program berorientasi fungsi, status sistem (data) terpusat dan beberapa fungsi mengakses dan memodifikasi data pusat ini. Dalam kasus program berorientasi objek, informasi status (data) didistribusikan di antara berbagai objek.
• Dalam desain berorientasi objek, data bersifat pribadi di objek yang berbeda dan ini tidak tersedia untuk objek lain untuk akses langsung dan modifikasi.
• Unit dasar merancang program berorientasi objek adalah objek, sedangkan fungsi dan modul dalam perancangan prosedural. Objek muncul sebagai kata benda dalam deskripsi masalah; sedangkan fungsi muncul sebagai kata kerja.
Pada titik ini, kita harus menekankan bahwa desain berorientasi objek tidak perlu diimplementasikan dengan menggunakan bahasa berorientasi objek saja. Namun, bahasa berorientasi objek seperti C++ dan Java mendukung definisi semua mekanisme dasar kelas, pewarisan, objek, metode, dll. dan juga mendukung semua konsep kunci berorientasi objek yang baru saja kita bahas. Dengan demikian, bahasa berorientasi objek memfasilitasi implementasi OOD. Namun, OOD juga dapat diimplementasikan menggunakan bahasa prosedural konvensional—meskipun mungkin memerlukan lebih banyak upaya untuk mengimplementasikan OOD menggunakan bahasa prosedural dibandingkan dengan upaya yang diperlukan untuk mengimplementasikan desain yang sama menggunakan bahasa berorientasi objek. Faktanya, kompiler C++ yang lebih lama pada dasarnya adalah pra- prosesor yang menerjemahkan kode C++ ke dalam kode C.
Meskipun teknik berorientasi objek dan berorientasi fungsi adalah pendekatan yang sangat berbeda untuk desain perangkat lunak, namun yang satu tidak menggantikan yang lain;
tetapi mereka saling melengkapi dalam beberapa hal. Misalnya, biasanya seseorang menerapkan teknik berorientasi fungsi top-down untuk merancang metode internal kelas, setelah kelas diidentifikasi. Dalam hal ini, meskipun secara lahiriah sistem tampaknya telah dikembangkan dalam orientasi objek mode, tetapi di dalam setiap kelas mungkin ada hierarki kecil fungsi yang dirancang secara top-down.