Cohesion dan Coupling merupakan konsep dasar dalam perancangan dan rekayasa perangkat lunak.
Membagi software/perangkat lunak menjadi modul-modul yang kecil bukan sekedar memisahkan kumpulan kode dari kumpulan kode lainnya. Tetapi memastikan bahwa modul yang dirancang menganut prinsip
"Loose Coupling, High Cohesion"
Coupling adalah ketergantungan antar modul satu dengan modul lainnya. Bayangkan jika anda mengubah 1 modul A tapi karena modul lain memiliki ketergantungan terhadap modul A, maka efek perubahan ini mungkin saja punya impact terhadap modul lain. Karena itu loose coupling sangat penting dalam perancangan software.
Cohesion adalah keterikatan fungsi-fungsi di dalam suatu modul. Maksudnya adalah modul yang dibuat memiliki fungsi-fungsi yang serupa untuk 1 tanggung jawab. Karena itu high cohesion sangat penting dalam perancangan software.
Contoh coupling -> Terdapat 1 modul Transaksi untuk Penjualan dan Pembelian. Karena Pembelian dan Penjualan bisa dipisahkan (Pembelian adalah transaksi ke supplier, sedangkan Penjualan adalah transaksi ke Customer) adalah suatu hal yang terpisah, maka modul Transaksi dapat dibagi menjadi 2 modul terpisah yaitu modul Pembelian dan modul Penjualan. Sehingga perubahan terhadapa Penjualan tidak mempengaruhi Pembelian.
Contoh cohesion -> 1 class Lampu memiliki 1 tanggung jawab untuk Lampu saja. Fungsi-fungsi seperti turningOn, turningOff, changeColour, dll harus identik dengan tanggung jawab terhadap prilaku lampu secara umum.
Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D
Just a collection of notes (documentation purpose) that past over in my life.. I just want to shared what I've got and pour it on this blog ^^
Saturday, December 31, 2011
Sunday, December 25, 2011
Mutable, Immutable, Thread Safe, Not-Thread Safe
Just notes:
Mutable adalah objek yang ketika dibuat (instantiate), dapat dirubah isinya.
Immutable adalah kebalikan dari Mutable, ketika sudah di instantiated maka objek tersebut tidak dapat dirubah isinya. Contoh paling umum adalah objek String.
Contoh pada Java, kita harus berhati-hati dalam menggunakan String karena objek ini sifatnya immutable. Pada saat anda mendeklarasikan String kata = "Saya immutable", JVM akan membuat 1 objek immutable.
Ketika anda melakukan perubahan: kata = "Saya mutable" anda sebenarnya melakukan pembuatan objek baru lagi dengan variable "kata" dan isi "Saya mutable" namun pada alokasi memori yang berbeda dari variable sebelumnya. Jika terlalu banyak operasi seperti itu, dapat mempengaruhi performance.
Jika anda akan melakukan banyak perubahan atau penambahan kalimat pada String objek, biasakan menggunakan class StringBuilder atau StringBuffer, lalu pada akhir manipulasi tersebut ubah menjadi String.
Perbedaan StringBuilder dan StringBuffer hanya pada Thread Safe (String Buffer) dan Not-Thread Safe (String Builder).
Thread Safe adalah konsep yang menjelaskan jika terdapat 1 resource yang digunakan bersama pada satu waktu (shared resource) tidak memberikan hasil yang berbeda / tidak sinkron. Thread Safe dapat diartikan dengan synchronization. Sehingga terdapat aksi wait() terhadap resource yang dipegang oleh banyak thread.
Not-Thread Safe adalah kebalikan dari Thread Safe, jika ada 2 thread yang menggunakan 1 resource (shared resource) maka hasil/value yang diberikan bisa berbeda/tidak sinkron, tergantung siapa yang lebih dahulu mememegang resource tsb (hold / lock the resource).
Contoh kasus seperti ini:
Misal ada Objek X, resource A, resource B, perintah 1-2 pada Objek X.
1. Objek X di akses oleh dua thread A dan B
2. Objek X dipegang oleh A, melakukan 1 perintah terhadapa objek X, ketika selesai nilai Objek X berubah.
3. Objek X kemudian diakses oleh B setelah setelah perintah 1 diekseskusi A, objek X nilainya akan berubah setelah dieksekusi oleh B (perintah 1 diekseskusi oleh B).
4. Karena thread A agak lama, maka B tetap mengakses objek X dan mengeksekusi perintah 2 terhadap objek X, nilai objek X berubah.
5. Objek X kemudian diakses kembali oleh thread A untuk mengeksekusi perintah 2, value apa yang diperoleh oleh A pada saat diakses kali ini?
- Jawaban tergantung pada Thread Safe dan Not Thread Safe.
Karena alokasi objek X terdapat pada alamat memori yang sama, maka pada langkah 5 nilai sebenarnya adalah: objek X setelah diekseskusi oleh B.
Jika Thread Safe, maka A akan membaca nilai objek X dimana dia terakhir diubah oleh B.
Jika, Not Thread Safe maka nilai objek X yang dibaca adalah nilai objek X yang terakhir diubah oleh A.
Semoga penjelasan ini bisa dimengerti.
Sebenarnya lebih enak pakai gambar :D
Jika ada salah, mohon koreksinya :) Maksud hati hanya mao sharing yang saya tau kok :D
Mutable adalah objek yang ketika dibuat (instantiate), dapat dirubah isinya.
Immutable adalah kebalikan dari Mutable, ketika sudah di instantiated maka objek tersebut tidak dapat dirubah isinya. Contoh paling umum adalah objek String.
Contoh pada Java, kita harus berhati-hati dalam menggunakan String karena objek ini sifatnya immutable. Pada saat anda mendeklarasikan String kata = "Saya immutable", JVM akan membuat 1 objek immutable.
Ketika anda melakukan perubahan: kata = "Saya mutable" anda sebenarnya melakukan pembuatan objek baru lagi dengan variable "kata" dan isi "Saya mutable" namun pada alokasi memori yang berbeda dari variable sebelumnya. Jika terlalu banyak operasi seperti itu, dapat mempengaruhi performance.
Jika anda akan melakukan banyak perubahan atau penambahan kalimat pada String objek, biasakan menggunakan class StringBuilder atau StringBuffer, lalu pada akhir manipulasi tersebut ubah menjadi String.
Perbedaan StringBuilder dan StringBuffer hanya pada Thread Safe (String Buffer) dan Not-Thread Safe (String Builder).
Thread Safe adalah konsep yang menjelaskan jika terdapat 1 resource yang digunakan bersama pada satu waktu (shared resource) tidak memberikan hasil yang berbeda / tidak sinkron. Thread Safe dapat diartikan dengan synchronization. Sehingga terdapat aksi wait() terhadap resource yang dipegang oleh banyak thread.
Not-Thread Safe adalah kebalikan dari Thread Safe, jika ada 2 thread yang menggunakan 1 resource (shared resource) maka hasil/value yang diberikan bisa berbeda/tidak sinkron, tergantung siapa yang lebih dahulu mememegang resource tsb (hold / lock the resource).
Contoh kasus seperti ini:
Misal ada Objek X, resource A, resource B, perintah 1-2 pada Objek X.
1. Objek X di akses oleh dua thread A dan B
2. Objek X dipegang oleh A, melakukan 1 perintah terhadapa objek X, ketika selesai nilai Objek X berubah.
3. Objek X kemudian diakses oleh B setelah setelah perintah 1 diekseskusi A, objek X nilainya akan berubah setelah dieksekusi oleh B (perintah 1 diekseskusi oleh B).
4. Karena thread A agak lama, maka B tetap mengakses objek X dan mengeksekusi perintah 2 terhadap objek X, nilai objek X berubah.
5. Objek X kemudian diakses kembali oleh thread A untuk mengeksekusi perintah 2, value apa yang diperoleh oleh A pada saat diakses kali ini?
- Jawaban tergantung pada Thread Safe dan Not Thread Safe.
Karena alokasi objek X terdapat pada alamat memori yang sama, maka pada langkah 5 nilai sebenarnya adalah: objek X setelah diekseskusi oleh B.
Jika Thread Safe, maka A akan membaca nilai objek X dimana dia terakhir diubah oleh B.
Jika, Not Thread Safe maka nilai objek X yang dibaca adalah nilai objek X yang terakhir diubah oleh A.
Semoga penjelasan ini bisa dimengerti.
Sebenarnya lebih enak pakai gambar :D
Jika ada salah, mohon koreksinya :) Maksud hati hanya mao sharing yang saya tau kok :D
Saturday, December 10, 2011
How Select Statement SQL Works
Berikut adalah cara kerja SELECT statement pada Query SQL (setidaknya secara teori):
From Products prod
- Dimulai dari FROM clause dan membuat sebuah table dari semua join, union, intersection dan apapun itu pada FROM clause. Pada momen ini diijinkan untuk membuat alias pada table ( AS
) yang akan digunakan untuk query statement berikutnya.
- Menuju ke WHERE clause dan membuang semua row/record yang tidak masuk kriteria; selalu menolak suatu kondisi yang unknown dan false. WHERE clause berkaitan dengan proses kerja dari FROM clause.
- Menuju ke GROUP BY clause (jika ada), melakukan grouping dan mengurangi tiap group yang ada menjadi single row, me-replace working table yang ada dengan grup table yang didefinisikan. Row/record yang akan di grouping harus memenuhi karakteristik: (1) kolom table (2) Perhitungan terhadap grouping tsb (cth, aggregate functions) (3) function atau (4) suatu ekspresi yang dibuat dari no 1, 2 dan 3.
- Menuju ke HAVING clause (jika ada) dan menerapkannya terhadap grouping table yang sudah terbentuk. Jika tidak ada, maka dianggap keseluruhan table sebagai satu grup.
- Menuju ke SELECT clause dan mengkonstruksi/menggabungkan ekspresi yang terdapat di SELECT clause. Ini berarti semua scalar subqueries, function calls dan expression yang terdapat pada SELECT dijalankan ketika semua clause selesai dieksekusi. "AS" operator pada SELECT statement yang berfungsi sebagai pemberi nama/alias juga dieksekusi sebagai satu kesatuan, karena itu ia tidak dapat digunakan pada WHERE clause ataupun SELECT list yang lain.
- Untuk nested query atau query rangkap mengikuti aturan umum yang terdapat pada bahasa pemograman seperti C, VB, Java, dll. Yaitu cakupan/scopes pada referensi kolom atau table yang digunakan. Contohnya: table atau kolom pada nested query hanya dikenal dari nested query yang dicakupnya, namun ia bisa menggunakan reference table atau kolom diluarnya dimana nested query itu digunakan.
From Products prod
- Note: SELECT tidak dapat memiliki lebih banyak kolom daripada GROUP BY, tetapi dapat memiliki lebih sedikit kolom dibanding GROUP BY.
Jika ada salah, mohon koreksinya :) Maksud hati hanya mao sharing yang saya tau kok :D
Saturday, December 3, 2011
Calendar dan Date (Part 1)
Tanggal merupakan hal sangat penting dalam aplikasi-aplikasi bisnis. Java menyediakan Calendar class sebagai utilitas untuk memanipulasi tanggal. Date class telah ditinggalkan oleh Java karena banyak mengandung bug, walaupun begitu Calendar class juga memiliki beberapa bug namun nampaknya sudah diperbaiki pada Java 7.
Saya masih sangat lemah dalam manipulasi tanggal, karena itu saya mencoba untuk merangkum beberapa snippet code yang mungkin membantu mengingat memory saya (walaupun dapat dilakukan dengan googling dan search ke oracle java docs)
Hirarki Class :
java.lang.Object
java.util.Calendar
java.lang.Object
java.text.Format
java.text.DateFormat
java.text.SimpleDateFormat
Menampilkan tanggal hari ini:
public static void main (String [] args) {
//menginisialisasi calendar dan mendapatkan tanggal dan waktu berdasarkan default locale dan timezone.
String datestring = df.format(date).toString().toUpper();
System.out.println (datestring);
date = df.parse("15-Feb-2012"); // return date object
System.out.println (df.format(date).toString() );
}
Akan show (tanggal hari ini) contohnya : 11-NOV-2011 dan 15-Feb-2012
Keterangan:
date-pattern :
"dd.mm.yyyy", "mm/dd/yyyy",
"E, dd MMM yyyy HH:mm:ss Z" (Tue, 03 Jan 2012 21:30:45 +0153), "EEEE, dd MMMM yyyy HH:mm:ss zzzz" (Tue, 03 Jan 2012 15:30:45 India Standard Time),
dll. Lihat JavaDoc untuk lengkapnya.
Snippet diatas hanya secara sederhana menjelaskan konversi Date menjadi String dan String menjadi date berdasarkan format pattern yang telah sesuai. Mungkin berikutnya adalah manipulasi tanggal dengan Calendar class.
To be continued
Java Doc reference:
http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D
Saya masih sangat lemah dalam manipulasi tanggal, karena itu saya mencoba untuk merangkum beberapa snippet code yang mungkin membantu mengingat memory saya (walaupun dapat dilakukan dengan googling dan search ke oracle java docs)
Hirarki Class :
java.lang.Object
java.util.Calendar
java.lang.Object
java.text.Format
java.text.DateFormat
java.text.SimpleDateFormat
Menampilkan tanggal hari ini:
public static void main (String [] args) {
//menginisialisasi calendar dan mendapatkan tanggal dan waktu berdasarkan default locale dan timezone.
Calendar now = Calendar.getInstance();
// return Date object dari Calendar yang di instantiate, ini berguna untuk manipulasi ke String
Date date = now.getTime();
// dahulu anda dapat menginisialisasi seperti ini, namun tidak disarankan karena Date Class di Java sudah ditinggalkan, sebagai gantinya menggunakan Calendar.
// date = date.now();
// melakukan inisialisasi dan memberi date pattern, hanya date pattern yang didefinisikan yang akan dikenal oleh SimpleDateFormat.
DateFormat df= new SimpleDateFormat("dd-mmm-yyyy");
// df.format(date) akan me-return StringBuffer, karena itu harus diubah menjadi String
String datestring = df.format(date).toString().toUpper();
System.out.println (datestring);
date = df.parse("15-Feb-2012"); // return date object
System.out.println (df.format(date).toString() );
}
Akan show (tanggal hari ini) contohnya : 11-NOV-2011 dan 15-Feb-2012
Keterangan:
date-pattern :
"dd.mm.yyyy", "mm/dd/yyyy",
"E, dd MMM yyyy HH:mm:ss Z" (Tue, 03 Jan 2012 21:30:45 +0153), "EEEE, dd MMMM yyyy HH:mm:ss zzzz" (Tue, 03 Jan 2012 15:30:45 India Standard Time),
dll. Lihat JavaDoc untuk lengkapnya.
Snippet diatas hanya secara sederhana menjelaskan konversi Date menjadi String dan String menjadi date berdasarkan format pattern yang telah sesuai. Mungkin berikutnya adalah manipulasi tanggal dengan Calendar class.
To be continued
Java Doc reference:
http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D
Subscribe to:
Posts (Atom)