Framework Design Guidelines Bagian 08 – Prinsip #5: Aggregate Component 15 Mei 2008
Posted by firstyuyu in Prinsip Dasar.trackback
Aggregate Component menggabungkan berbagai macam entity pada level yang lebih rendah menjadi sebuah komponen yang mempunyai abstraksi lebih tinggi untuk mendukung skenario utama. Sebagai contoh adalah komponen email yang menggabungkan SMTP, socket, encoding, dll. Poin utamanya adalah sebuah aggregate component menyediakan level abstraksi yang lebih tinggi, bukan sekedar cara lain mengerjakan sesuatu.
Menyederhanakan operasi pada lebel abstraksi yang lebih tinggi sangat penting, terutama bagi mereka yang tidak ingin mempelajari semua fitur yang disediakan oleh sebuah framework atau bagi mereka yang sekedar ingin agar masalah yang sedang mereka hadapi (sering kali sangat sederhana) bisa terselesaikan.
Aggregate Component sebagai high level API harus diimplementasikan harus diimplementasikan sedemikian rupa hingga ia bisa begitu saja berjalan tanpa haru membuat developer sadar tentang hal-hal rumit yang mungkin terjadi di belakang layar. Konsep ini biasa disetu It-Just-Works. Misalnya untuk membaca seluruh baris file kita bisa menggunakan aggregate component yaitu kelas File yang akan menyembunyikan detail operasi seperti membuka file, membaca baris per baris, menutup file. Kita bisa menulisnya dalam satu baris kode seperti berikut:
string[] lines = File.ReadAllLines(@”C:\Data.txt”);
Pengguna aggregate component seharusnya tidak perlu mengimplementasikan interface apapun, memodifikasi file konfigurasi, dll. Desainer framework harus sudah menyediakan implementasi default untuk interface yang ada serta semua setting konfigurasi harus bersifat opsional karena telah disediakan nilai default yang tepat. Aggregate Component pada umumnya terintegrasi dengan IDE sehingga ia bisa di drag and drop ke area desain dan dimanipulasi melalui jendela property milis IDE.
Aggregate Component menerapkan Component-Oriented Design dengan penambahan sbb:
- Aggregate Component harus mempunyai konstruktor default
- Semua parameter yang terdapat di konstruktornya berkorelasi dengan property yang ada dan sekaligus menginisialisasinya.
- Semua property yang dimilikinya biasanya mempunyai getter dan setter.
- Semua property yang dimilikinya mempunyai nilai default yang tepat.
- Jika parameter sebuah method nilainya tetap setiap pemanggilan method pada skenario paling utama, maka parameter tersebut sebaiknya dijadikan parameter yang akan diinisialisasi di awal oleh developer.
- Method tidak ada yang meminta delegate sebagai parameternya. Implementasi callback semuanya dilakukan via event bukan delegate.
Berikut ini adalah panduan untuk prisip Aggregate Component:
Pertimbangkan:
untuk menyediakan aggregate component untuk fitur-fitur (skenario) yang paling sering digunakan.
Lakukan:
Modelkan aggregate component sebagai high level concept (obyek fisik), bukan detail operasi sistem. Misalnya, sebuah aggregate component seharusnya memodelkan file, directory, atau drive, bukan stream, formatter, atau comparer.
Lakukan:
Tingkatkan visibility dari aggregate component dengan memberikan mereka nama yang berkorelasi dengan entity yang sudah dikenal, misalnya File atau Printer daripada NtfsFile atau PrintQueue.
Lakukan:
Desainlah aggregate component sehingga mereka bisa digunakan dengan inisialisasi yang sangat sederhana.
Jangan:
membuat pengguna aggregate component harus menginstansiasi beberapa obyek secara eksplisit dalam sebuah skenario. Ada sebuah hukum di dunia framework design, yaitu jumlah pengguna framework berbanding terbalik dengan jumlah pernyataan new yang harus ditulis dalam skenario utama.
Lakukan:
Pastikan bahwa aggregate component mendukung pattern Create-Set-Call.
Lakukan:
Sediakan konstruktor default atau konstruktor yang sangat sederhana untuk setiap aggregate component.
Lakukan:
Sediakan property dengan getter dan setter yang berkorelasi dengan semua parameter yang ada di konstruktor.
Kita harus mendesain aggregate component agar dimungkinkan untuk memanggil konstruktor default lalu mengeset property yang diperlukan tanpa perlu memanggil konstruktor berparameter. Contohnya adalaah kelas MessageQueue:
Lakukan:
Gunakan event untuk implementasi callback. Jangan gunakan delegate.
Jangan:
membuat pengguna aggregate component harus mewarisi, meng-override method, atau mengimplementasi interface pada skenario utama.
Jangan:
membuat pengguna aggregate component harus menulis kode selain kode yang dibutuhkan pada skenario utama. Misalnya, jangan membuat pengguna aggregate component harus memodifikasi setting di file konfigurasi atau membuat file resources, dll.
Pertimbangkan:
untuk mengintegrasikan aggregate component yang kita buat dengan IDE yang ada.

Komentar»
No comments yet — be the first.