jump to navigation

Component-Oriented Design 15 Mei 2008

Posted by firstyuyu in Misc.
trackback

Component-Oriented Design adalah sebuah desain dimana API diwujudkan dalam sebuah tipe yang mempunyai konstruktor, property, method, dan event. Cara penggunaan pada component-oriented design mengikuti sebuah pola, yaitu menginstansiasi sebuah tipe dengan default konstruktor atau konstruktor berparameter yang cukup sederhana, memberikan nilai kepada beberapa property, kemudian memanggil method yang sederhana. Pola ini disebut dengan Create-Set-Call pattern.

Contoh penggunaan pattern Create-Set-Call bisa kita lihat pada kelas MessageQueue sbb:

// Instansiasi (Create)
MessageQueue queue = new MessageQueue();
 
// Memberi nilai kepada
// property (Set)
queue.Path = queuePath;
queue.EncryptionRequired = EncryptionRequired.Body;
queue.Formatter = new BinaryMessageFormatter();
 
// Panggil method (Call)
queue.Send(“Halo”);
queue.Close();
 

Salah satu masalah yang mungkin timbul pada component-oriented design adalah suatu saat, sebuah komponent bisa berada pada state yang tidak valid. Sebagai contoh, konstruktor default mengizinkan developer untuk menginstansiasi kelas MessageQueue tanpa memberikan nilai path tujuan. Selain itu, property yang bisa diberikan nilai secara independen dan bersifat opsional, tidak bisa memaksa agar perubahan state sebuah obyek bersifat konsisten dan atomik. Namun masalah ini dibayar oleh kemudahan yang ditawarkan oleh component-oriented design terutama pada skenario utama dimana usability dari sebuah API menjadi prioritas utama.

 
 

 

Selain itu, masalah di atas juga bisa diatasi dengan pelaporan error yang jelas melalui exception. Ketika developer memanggil method yang tidak sah untuk state obyek saat ini, maka method tersebut harus melemparkan InvalidoperationException. Pesan yang ada di dalam exception tersebut harus menjelaskan property apa yang harus diberi nilai agar obyek berada pada state yang benar.

Sering kali desainer framework berusaha untuk mendesain agar sebuah obyek tidak bisa berada dalam state yang tidak valid. Hal ini dicapai dengan cara menempatkan semua setting yang dibutuhkan pada parameter konstruktor, property dibuat get-only untuk setting yang tidak bisa diubah setelah instansiasi, dan memecah fungsionalitas ke dalam beberapa tipe property dan method tidak mengalami overlap. Cara ini sangat disarankan untuk factored type tapi sangat tidak disarankan untuk aggregate component.

Untuk aggregate component, sangat disarankan menggunakan exception dengan pesan yang jelas untuk mengkomunikasikan kepada developer tentang state yang tidak valid. Exception seharusnya dilemparkan ketika sebuah operasi (method) sedang dijalankan, bukan pada saat komponen diinisialisasi (ketika pemanggilan konstruktor atau pemberian nilai pada property). Hal ini penting untuk menghindari situasi dimana state yang tidak valid hanya bersifat temporer yang akan dibenarkan pada baris berikutnya dari program, sebagaimana contoh berikut:

PerformanceCounter workingSet = new PerformanceCounter();
workingSet.InstanceName = process.ProcessName;
// exception tidak dilemparkan di sini
// meskipun counter berada pada state
// yang tidak valid (property Counter
// belum diberi nilai)
 
workingSet.CounterName = “Working Set”;
//state telah valid di sini
workingSet.CategoryName = “Process”;
Debug.WriteLine(workingSet.NextValue());

 

 

 

 

Komentar»

No comments yet — be the first.

Tinggalkan komentar