Aug/091
Membangun Modul Yang Efektif
PENDAHULUAN
Manusia bila menghadapi permasalahan yang (cukup) besar langkah awal yang dilakukan adalah membagi/memecah permasalahan tersebut menjadi beberapa bagian yang lebih kecil. Selanjutnya menyelesaikan secara bertahap bagian demi bagian, baik secara sendiri maupun berkelompok, sehingga diperoleh solusi dari permasalahan yang besar tersebut. Sebagai gambaran, kita diminta untuk “menyelesaikan” (baca: memakan) buah semangka sampai habis. Langkah awal yang dilakukan adalah “mempartisi” (memotong) buah semangka menjadi beberapa bagian dan memakannya satu persatu, sendiri atau bersama-sama.
Dalam lingkup pengembangan perangkat lunak (program) analogi di atas harus dipakai, apabila akan menghasilkan perangkat lunak yang baik. Program yang besar harus dipartisi menjadi beberapa modul yang mudah diselesaikan. Modul program dapat berupa prosedur dan/atau fungsi.
Untuk mempartisi program menjadi beberapa bagian terdapat dua paradigma pokok, yaitu Structured Programming (SP) dan Object Oriented Programming (OOP). SP mempartisi program berdasarkan kata kerja (fungsi sistem) atau behavior sedangkan OOP mempartisi program berdasarkan kata benda (objek diskrit). Dalam SP, struktur data dan behavior terpisah, di sisi lain OOP mengenkapsulasi struktur data dan behavior dalam satu objek.
MENGUKUR MODUL PROGRAM YANG BAIK
Reusable adalah kunci pokok dalam pengembangan perangkat lunak, tema inilah yang mengilhami perancangan modul program dan perkembangan paradigma pengembangan perangkat lunak secara umum. Reusable bisa diperoleh bila menerapkan information hiding.
Yang dimaksud Information hiding adalah: [Presman 2000]
- Setiap modul tersembunyi dengan yang lain
- Modul harus dirancang agar informasi (prosedur dan data) yang berada di dalam modul tidak dapat diakses oleh oleh modul lain yang tidak memerlukan informasi tersebut.
Keuntungan modul yang efektif
- Mengurangi kompleksitas
- Mempermudah perubahan
- Lebih mudah diimplementasikan dan dapat dikerjakan secara paralel (Tim)
Dua Mekanisme pengaktifan modul:
- Diinvokasi by refference (statemen call)
- Dinvokasi oleh interupsi (banyak untuk sistem real-time)
Functional Independence merupakan kunci perancangan yang baik dan kunci kualitas program.
- Merupakan hasil pertumbuhan langsung konsep abstraksi dan information hiding.
- Memiliki subfungsi yang spesifik dan antarmuka yang sederhana apabila dipandang dari bagian lain dalam struktur program.
- Keuntungan Modul yang independen:
- mudah membagi dalam tim,
- mudah diubah,
- perambatan kesalahan berkurang, dan
- reusable bertambah.
Independensi diukur dengan dengan dua kriteria kualitatif, yaitu Cohesion dan Coupling.
- COHESION: mengukur kekuatan funmgsional relatif suatu modul.
- COUPLING: mengukur interdependensi relatif antar modul
Ciri Modul yang baik:
- High cohesion (functional cohesion): modul hanya melakukan satu tugas dan memerlukan sedikit interaksi dengan modul lain dalam satu program.
- Low coupling: modul memiliki kopling antar modul yang lemah atau sebebas mungkin dengan modul yang lain (independen). Kopling tergantung pada kompleksitas antarmuka modul.
STUDI KASUS
Pada halaman berikut diberikan contoh kasus penyelesaian program secara modular. Pada kolom sebelah kiri, program sudah terdiri dari beberapa modul tetapi masih memiliki kopling tinggi.
Kolom sebelah kanan merupakan hasil perbaikan yang menunjukkan kopling rendah. Kohesi tidak begitu tampak dalam kasus ini.
KESIMPULAN
Dalam menyusun program tidak sekedar memecah program menjadi beberapa modul, tetapi harus memperhatikan bagaimana kualitas modul tersebut. Modul yang baik adalah reusable. Reusable dalam program yang sama maupun reusable untuk program yang lain.
| PROGRAM TIDAK BAIK | PROGRAM LEBIH BAIK |
| Include # <stdio.h>Main (void)
{ int i, j, a, b, c; a = 5; b = 20; c = 10; b = hitung_loop(a,b); pangkat_tiga (b); j = proses(a,b,c); tampilkan_hasil(j); return (0); } void buat_garis (int x, char y) { for (i = 0; i <= x; x++) printf (y); printf (“\n”); } Void pangkat_tiga (int x) { int z; z := x * x * x; printf (”Hasil 1 = \n”, z); buat_garis (10,'='); } Int proses(int x, y, z) { int s; s := x + y - z; return s; End; Int hitung_loop(int x, y) { for (i=1; i== x; i++) y = y - i; return y; } Void tampilkan_hasil( int y) { printf (“Hasil 2 = “, y); printf (“\n”); buat_garis(20,'*'); } |
Include # <stdio.h>Main (void)
{ Int j, k, a, b, c; a = 5; b = 20; c = 10; b = hitung_loop(a,b); k = pangkat_tiga (b); j = proses(a,b,c); tampilkan_hasil(k,j); return (0); } void buat_garis (int x, char y) { int i; for (i = 0; i <= x; x++) printf (y); printf (“\n”); } Int pangkat_tiga (int x) { Int z; z := x * x * x; return z; } Int proses(int x, y, z) { Int s; s := x + y - z; return s; End; Int hitung_loop(int x, y) { int I; for (i=1; i== x; i++) y = y - i; return y; } Void tampilkan_hasil( int x, y) { printf (“Hasil 1 = “, x); printf (“\n”); buat_garis(20,'='); printf (“Hasil 2 = “, y); printf (“\n”); buat_garis(20,'*'); } // end procedure tampilkan hasil |
(Sumber dari modul dosen Priyanto-UNY)
Apr/091
RPL #2-Java Version
public class tgs2 {
public static void main(String[] args) {
int choise;
do {
choise= bacaInput("1.Proses Tegangan\n"+
"2.Proses Arus\n"+
"3.Proses Resistor");
} while((choise>3) || (choise<1));
switch(choise) {
case 1:
prosesTegangan();
break;
case 2:
prosesArus();
break;
case 3:
prosesResistor();
break;
}
}
public static void prosesTegangan() {
int r=bacaInput("Resistor?");
int i=bacaInput("Arus?");
int v=hitungTegangan(i,r);
tampilkan(v);
}
public static void prosesArus() {
int r=bacaInput("Resistor?");
int v=bacaInput("Tegangan?");
int i=hitungArus(v,r);
tampilkan(i);
}
public static void prosesResistor() {
int i=bacaInput("Arus?");
int v=bacaInput("Tegangan?");
int r=hitungResistor(v,i);
tampilkan(r);
}
Apr/090
RPL #2-Pseudo Code Version
main() {
int pilih;
ulangi {
pilih=bacaInput("1.Tegangan,2.Arus,3.Resistor");
} ketika (pilih>3) atau (pilih<1);
pemilihan(pilih) {
jika 1: prosesTegangan();
jika 2: prosesArus();
jika 3: prosesResistor();
}
}
void prosesTegangan() {
int r=bacaInput("Resistor");
int i=bacaInput("Arus");
int v=hitungTegangan(i,r);
tampilkan(v);
}
void prosesArus() {
int r=bacaInput("Resistor");
int v=bacaInput("Tegangan");
int i=hitungArus(v,r);
tampilkan(i);
}
void prosesResistor() {
int i=bacaInput("Arus");
int v=bacaInput("Tegangan");
int r=hitungResistor(v,i);
tampilkan(r);
}
Apr/090
RPL #1-Pascal Version
{Tugas Mata Kuliah Rekayasa Perangkat Lunak
Nama : xxx xxx (by taufik)
NIM : xx
Prodi: xxx
Kelas: x
Membuat program sederhana penghitung tegangan}
program rpl;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
i,r,v: Integer;
//Method baca Input
function bacaInput(teks:String): Integer;
var
x: Integer;
begin
write(teks+'=');
readln(x);
bacaInput:=x;
end;
Apr/090
RPL #1-C++ Version
/*Tugas Mata Kuliah Rekayasa Perangkat Lunak
Nama : xxx xxx (by taufik)
NIM : xxx
Prodi: xx
Kelas: x
Membuat program sederhana penghitung tegangan*/
#include <iostream.h>
#include <conio.h>
#include <cstring.h>
//method baca input
int bacaInput(string teks) {
int i;
cout << teks << "="; cin >> i;
return i;
}
//method menghitung tegangan
int hitung(int i,int r) {
return i*r;
}
//method menampilkan hasil
void tampilkan(int v) {
cout << "Nilai tegangan = " << v << " volt";
}
//method main
int main() {
int i, r, v; //deklarasi variabel
i=bacaInput("Nilai arus"); //membaca nilai arus
r=bacaInput("Nilai tegangan");//membaca nilai hambatan
v=hitung(i,r); //menghitung nilai tegangan
tampilkan(v); //menampilkan hasilnya
getch();
return 0;
}
Apr/090
RPL #1-Java Dialog Version
/*Tugas Mata Kuliah Rekayasa Perangkat Lunak
Nama : xxx xxx (by taufik)
NIM : xxxx
Prodi: xxx
Kelas: x
Membuat program sederhana penghitung tegangan*/
public class rpl {
public static void main(String[] args) {
int i=bacaInput("Nilai arus"); //panggil method input->i
int r=bacaInput("Nilai hambatan"); //panggil method input->r
int v=hitungTegangan(i,r); //hitung nilai tegangan->v
tampilkan(v); //tampilkan hasilnya<-v
}
//method baca input
public static int bacaInput(String teks) {
//returnkan(ubah ke betuk integer terlebih dahulu)
return Integer.parseInt(javax.swi
}
//method menghitung tegangan
public static int hitungTegangan(int i, int r) {
//return berupa hasil perkalian->tegangan
return i*r;
}
//method menampilkan hasilnya
public static void tampilkan(int v) {
//tampilkan dengan dialog
javax.swing.JOptionPane.showMessageDialog(null, "Nilai tegangan = "+v+" volt");
}
}
Apr/090
RPL #1-Java Version
/*Tugas Mata Kuliah Rekayasa Perangkat Lunak
Nama : xxx xxx (by Taufik)
NIM : xxx
Prodi: xxxxx
Kelas: x
Membuat program sederhana penghitung tegangan*/
public class rpl {
public static void main(String[] args) {
int i=bacaInput("Nilai arus"); //panggil method input->i
int r=bacaInput("Nilai hambatan"); //panggil method input->r
int v=hitungTegangan(i,r); //hitung nilai tegangan->v
tampilkan(v); //tampilkan hasilnya<-v
}
//method baca input
public static int bacaInput(String teks) {
//returnkan
System.out.print(teks+"=")
java.util.Scanner scanner=new java.util.Scanner(System.in);
return scanner.nextInt();
}
//method menghitung tegangan
public static int hitungTegangan(int i, int r) {
//return berupa hasil perkalian->tegangan
return i*r;
}
//method menampilkan hasilnya
public static void tampilkan(int v) {
//tampilkan dengan dialog
System.out.println("Nilai tegangan = "+v+" volt");
}
}