Wednesday, April 22, 2009

Transaformasi kepada Single Responsibility Principal

Post aku sebelum nie ada menyentuh tentang kepentingan pattern SRP dan OCP dalam mencorakkan design domain dan sewaktu coding. Tapi bila aku bercerita tentang kepentingan pattern jika tidak diterjemahkan kedalam code dan real implemantation agak payah hendak mendapat gambaran yang jelas dan kebaikan pattern tersebut. Aku ada berbincang dengan kawan seangkatan berkaitan kedua-dua pattern dan apa yang pasti SRP merupakan pattern yang agak tricky. Jadi aku cuba terangkan dengan layman word dan code.

Aku tiada banyak idea nak bagi contoh dan aku pun tak pasti contoh yang aku bawa ini bagus atau tidak, ini juga menjadi kayu pengukur untuk aku mengetahui kefahaman aku dalam pattern2 ini.

Apa dia SRP?..

Single Responsibility Principle

Mengikut tuan empunya diri yang memperkenalkan pattern ini, SRP ialah
Sesuatu class/object hanya ada satu sebab sahaja untuk diubah..

Aku bawah contoh code dibawah :


    public class Report
{
public void Print()
{
//
}

public IList GetData()
{
return null;
}

public void FormatReport()
{
//
}
}


Kenapa code ini melanggar principle SRP. Kalau dilihat code tersebut ada berapa kerja code Report itu boleh buat? Ada 3, iaitu dia boleh melakukan tugas Print(), tugas untuk Formatting FormatReport() dan tugas untuk mendapatkan data GetData(). Oleh kerana itu code tersebut ada 3 sebab utama jika kita hendak buat perubahan.

Jadi adakah setiap class/object hanya boleh melakukan satu tugas sahaja bagi memenuhi SRP? Jawapannya sudah tentulah tidak. Kena faham maksud responsibility (tanggungjawab). Ok seorang bapa mempunyai banyak tanggungjawab, salah satu ialah menyara anak-anak. Jika beliau mempunyai 3 orang anak adakah perlu diwujudkan 3 class berkaitan saraan? Jawapan ialah tidak. Object saraan hanyalah satu tapi tugasnya boleh ada banyak selagi mana ianya berada dalam lingkungan makna saraan.

Caranya ialah dengan groupkan mana-mana tugas yang related dengan responsibility class tersebut dan refactorkan.

Contoh:

public class Bapa
{
public void Bekerja()
{
}

public void SaraanAnak1()
{
}

public void SaraanAnak2()
{
}

public void SaraanAnak3()
{
}

public void SaraanIbuBapa()
{
}

}


Jadi berdasarkan code diatas ini class bapa coupling direct dengan tugas-tugas tersebut, aku boleh bahagikan kepada 3 responsiblity disini seperti berikut.
1. Bekerja
2. Saraan Anak
3. Saraan IbuBapa (Bapa/Ibu kepada bapa tersebut)

Jadi bila refactor dia akan menjadi:

public class Bapa
{

public void Tugas()
{
new SaraanIbuBapa();
new SaraanAnak();
new Kerja();
}
}

public class Kerja
{
public Kerja()
{
Bekerja();
}

public void Bekerja()
{
}
}

public class SaraanAnak
{
public SaraanAnak()
{
SaraanAnak1();
SaraanAnak2();
SaraanAnak3();
}

public void SaraanAnak1()
{
}

public void SaraanAnak2()
{
}

public void SaraanAnak3()
{
}
}

public class SaraanIbuBapa
{
public SaraanIbuBapa()
{
SaraanIbuBapaSendiri();
SaraanIbuBapaMertua();
}

public void SaraanIbuBapaSendiri()
{
}

public void SaraanIbuBapaMertua()
{
}
}


So dari class Bapa yang sarat dgn tugas kita dah menjadikan class Bapa untuk follow SRP. Ini adalah secara basic, class SaraanAnak sendiri adalah grouping tugas secara highlevel kemungkinan juga akan ada refactor di class tersebut tetap ada. Aku cuba buat sesimple yang boleh

Cuba-cubalah memahami, ada yang nak bagi comment dipersilakan.

0 comments: