. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Designing Class
Pemrograman 1
Rauhil Fahmi, [Link]., [Link].
1
Outline
◼ Cohesion
◼ Coupling
◼ Immutable Class
◼ Package
2
Menentukan Desain Class
◼ Aktor – Objek yang dapat melakukan sesuatu hal, atau
yang menjadi “korban” atau “pelaku”
◼ Utility Class – Tidak punya objek, hanya berupa static
dan konstanta
◼ Misal kelas Math
◼ Program utama – Yang punya main
◼ Jangan membuat aksi menjadi nama class
◼ Bukan MendaftarKuliah, tapi class Mahasiswa, Dosen,
dan MataKuliah
3
Kriteria Desain yang Baik
Kriteria yang digunakan untuk menilai sebuah desain kelas:
◼ Cohesion
◼ Internal sebuah kelas
◼ How a single class is designed.
◼ Coupling
◼ Hubungan antar kelas
◼ How classes interact with each other.
4
Cohesion
◼ Menggambarkan tingkat keterhubungan tiap bagian dalam objek
◼ Sebuah class harus merepresentasikan satu konsep yang
sama (high cohesion)
◼ Class tidak boleh merepresentasikan terlalu banyak hal (low cohesion)
◼ Pembagian yang lebih spesifik mempermudah pemanfaatan class
◼ Class harus dilengkapi dengan attribute dan method yang berhubungan
langsung
◼ Design goal: high cohesion
◼ Well-focused purpose
◼ Tidak merepresentasikan lebih dari satu konsep
◼ Bertanggung jawab untuk sebuah logical task
5
Cohesion
◼ Good test for cohesion:
◼ Bisakah kita deskripsikan kegunaan kelas hanya
dengan menggunakan pernyataan sederhana (tanpa
“dan”, “atau”, dsb) ?
◼ Keuntungan high cohesion:
◼ Fokus: dapat dimengerti dengan mudah kegunaan
kelas dan method-method yang ada di dalamnya.
◼ Mudah di-maintain
◼ Reuse classes and methods
◼ Less-frequently changed
6
Cohesion
Buat program sales report yang membuat laporan penjualan, menyimpan
di database, mencetak laporan, dsb.
class SalesReport {
public void connectToDatabase() {} public
void generateSalesReport() {} public void
saveAsFile() {}
public void printReport() {}
}
• Lack of cohesion ! Ada banyak konsep di kelas SalesReport.
• Tidak fokus !
• SalesReport : Class that does everything !
7
Cohesion
class printStuff {
public PrintOptions getPrintOptions () {}
}
class fileSaver {
public SaveOptions getFileSaveOptions() {}
}
Desain yang lebih kohesif. Kelas-kelas tersebut dapat digunakan
oleh kelas lain (reuse). Misal, mungkin ada kelas lain yang
mempunyai fungsionalitas untuk menyimpan file atau
mencetak file → tinggal pakai printStuff & fileSaver.
8
Cohesion
Kelas CashRegister berikut juga kurang kohesif.
public class CashRegister
{
public void enterPayment(int dollars, int
quarters, int dimes, int nickels, int pennies)
...
public static final double NICKEL_VALUE = 0.05;
public static final double DIME_VALUE = 0.1;
public static final double QUARTER_VALUE = 0.25;
...
}
CashRegister juga
mengelola Jenis-jenis koin.
9
Cohesion
• CashRegister, melibatkan 2 konsep : cash register and coin
• Solusi: Buat dua kelas:
public class Coin {
public Coin(double aValue, String aName) {}
public double getValue() { ... }
...
public class CashRegister {
public void enterPayment(int coinCount, Coin coinType) { ... }
...
Memisahkan tanggung jawab kelas Coin dengan kelas
CashRegis3t5er
10
Coupling
◼ Coupling: ketergantungan antara sebuah kelas dengan
kelas lain.
◼ Kelas A bergantung pada B, jika A:
◼ Berasosiasi dengan B (salah satu atribut A bertipe B)
◼ Melalui method:
• Mempunyai variabel lokal B
• Mempunyai parameter B
• Mempunyai tipe kembalian (return type) B
11
Coupling
Konsekuensi dari ketergantungan:
◼ Jika kelas A bergantung pada kelas B, dan kita ingin
membangun sistem yang menggunakan (reuse) kelas A,
maka kita juga harus ikutkan kelas B.
◼ Jika kelas A bergantung pada kelas B, dan kelas B
dimodifikasi, maka kelas A kemungkinan besar juga
perlu dimodifikasi.
12
Coupling
◼ Design goal: Low Coupling.
◼ Minimize coupling to minimize the impact of interface changes.
◼ Keuntungan Low Coupling:
◼ Memahami sebuah kelas tanpa perlu membaca kelas
lain.
◼ Memodifikasi sebuah kelas tanpa menyebabkan
banyak efek pada kelas lain.
◼ Meningkatkan maintainability.
13
Coupling
◼ CashRegister bergantung pada kelas Coin untuk
mendapatkan nilai pembayaran.
◼ Sebaliknya, kelas Coin tidak bergantung pada kelas
CashRegister
Notasi UML (Unified Modeling
Language): Notasi
untuk pemodelan Object- oriented
analysis and design
14
Coupling
◼ High and Low Coupling
15
Coupling
Meminimalisasi ketergantungan
Cara mencetak saldo bank:
[Link](“saldo : ” +
[Link]());
Mengapa menambahkan method di kelas BankAccount berikut kurang
baik ?
public void printBalance () { //tidak bagus
[Link](“saldo : ” + [Link]);
}
16
Coupling
Meminimalisasi ketergantungan
◼ Artinya, kelas BankAccount sekarang bergantung
pada kelas PrintStream karena menggunakan objek
[Link] di dalam salah satu method-nya.
◼ Tidak semua sistem mempunyai [Link].
Akibatnya, jika diimplementasikan di sistem lain,
kita perlu mengubah BankAccount !
17
Immutable Class
◼ Class yang tidak memiliki mutator
◼ Perubahan nilai hanya terjadi saat pemanggilan
constructor
◼ Memiliki tingkat keamanan yang lebih tinggi
dalam penyimpanan data
◼ Tidak memiliki toleransi jika terjadi kesalahan
assignment nilai pada pemanggilan constructor
18
Call by Value dan Call by
Reference
◼ Call by Value
◼ Nilai dari suatu variable dicopy sebagai masukan
dari method
◼ Apapun yang terjadi pada method tidak mengubah
nilai aslinya
◼ Call by Reference
◼ Alamat objek dicopy sebagai masukan dari method
◼ Perubahan pada objek dengan alamat tersebut
akan mempengaruhi nilai objek aslinya
19
Kesalahan Pemanggilan
Method
◼ Perhatikan method berikut
public int cekArray(int[] a, int index){
return a[index];
}
◼ Apakah yang menyebabkan error saat method dipanggil?
20
Kesalahan Pemanggilan
Method
◼ Perhatikan method berikut
public int cekArray(int[] a, int index){
return a[index];
}
◼ Apakah yang menyebabkan error saat method dipanggil?
◼ Array kosong
◼ Index out of bound
21
Precondition
◼ Kondisi yang harus dipenuhi pemanggil sebelum memanggil sebuah
method
◼ Berikan keterangan tentang precondition pada dokumentasi
/**
Mengecek elemen sebuah array
@param array
@param index
(Precondition: index < [Link])
*/
22
Precondition
◼ Biasa digunakan untuk
◼ Membatasi nilai parameter method
◼ Menjamin method baru boleh dipanggil jika objek telah
memenuhi persyaratan tertentu
◼ Jika precondition tidak terpenuhi berarti method tidak
akan berjalan baik
◼ Program dapat menentukan apa yang dilakukan
◼ Berbeda dengan Exception Handling !!
23
Precondition
◼ Method diperkenankan melempar exception jika
precondition dilanggar
if (amount < 0) throw new IllegalArgumentException();
balance = balance + amount;
◼ Method tidak wajib melakukan precondition
// kalau salah input resiko pemanggil
int jumlah = a + b;
24
Assertion
◼ Cara melakukan precondition secara lebih “elegan”
assert amount >= 0;
balance = balance + amount;
◼ Untuk menggunakan assertion checking
java -enableassertions MainClass
◼ Terjadi exception jika kondisi salah dan assertion menyala. Jika tidak
menyala, tidak terjadi apa-apa
25
Assertion
26
Postcondition
◼ Kondisi yang harus benar setelah pemanggilan method
◼ Kegunaan postcondition
◼ Menjamin hasil keluaran method benar
◼ Menjamin objek yang berubah tidak salah
◼ Contoh komentar program
/** Deposits money into this account.
(Postcondition: getBalance() >= 0)
@param amount the amount of money to deposit
(Precondition: amount >= 0)
*/
27
Postcondition
◼ Pembuatan postcondition sama dengan precondition
◼ Dapat menjadi pasangan blok kode pada beberapa program
penting
◼ Jika pemanggil memenuhi precondition, method harus
mengembalikan postcondition
28
Packages
◼ Kumpulan class yang memiliki kegunaan yang sama
◼ Bisa ditentukan java bisa ditentukan programmer
◼ Import library dengan menuliskan nama package dan kelas
import [Link];
◼ Kita dapat membuat package sendiri untuk program yang
kita buat
29
Java Packages
◼ Sekumpulan class pada java yang memiliki fungsi yang mirip
Package Purpose Sample Class
[Link] Language support Math
[Link] Utilities Random
[Link] Input and output PrintStream
[Link] Abstract Windowing Toolkit Color
[Link] Applets Applet
[Link] Networking Socket
[Link] Database Access ResultSet
[Link] Swing user interface JButton
Document Object Model for XML
[Link] Document
documents
30
Membuat Packages
◼ Memberikan kode package pada baris pertama dari kode
class
◼ package packageName;
◼ Mengumpulkan class yang memiliki fungsi mirip
◼ Memberikan nama yang tepat
◼ [Link]
31
Have fun and enjoy
in this class
32