Saturday, December 31, 2011

Cohesion (Kohesi) & Coupling (Kopling)

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

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

Saturday, December 10, 2011

How Select Statement SQL Works

Berikut adalah cara kerja SELECT statement pada Query SQL (setidaknya secara teori):
  1. 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.

  2. 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.

  3. 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.

  4. Menuju ke HAVING clause (jika ada) dan menerapkannya terhadap grouping table yang sudah terbentuk. Jika tidak ada, maka dianggap keseluruhan table sebagai satu grup.

  5. 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.

  6. 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.
Ex: Select Id, name, category, (Select name from Supplier As sup Where prodid.sup = id.Prod) as SupplierName
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.
    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