Agungnya pemandangan itu. Seorang pemimpin turun dan turut sama menggali parit bersama semua kaum muslimin. Baginda membahagikan para sahabatnya kepada kumpulan-kumpulan yang setiapnya dianggotai sepuluh orang bagi menggali parit. Peristiwa ini berlaku pada perang Khandaq apabila Rasulullah menerima strategi perang yang dicadangkan oleh Salman Al-Farisi radhiyallahu anhu.Seluruh muslimin bekerja penuh cergas meskipun dalam keadaan amat kelaparan. Mereka tidak mahu dikalahkan oleh rasa lapar yang mencengkam walaupun mereka terpaksa mengalas perut mereka dengan ketul-ketul batu. Ini kerana mereka merasa malu kepada Rasulullah SAW, kerana Baginda sendiri mengalas perut baginda dengan dua ketul batu sebagaimana yang diriwayatkan oleh Abu Talhah radhiyallahu anhu.
يا رب لولا أنت ما اهتدينا
Wahai Tuhanku, kalau bukan kerana MU nescaya kami tidak akan mendapat hidayah
ولا تصدَّقنا ولا صلينا
Tidaklah kami bersedekah dan tidak kami mengerjakan solat
فأنزلن سكينة علينا
Turunkanlah ketenangan ke atas kami
وثبت الأقدام إن لاقينا
Tetapkan kaki kami ketika musuh datang menggempur kami
إن الذين قد بغوا علينا
Mereka (musyrikin) telah melampaui batas terhadap kami
إذا أرادوا فتنة أبينا
Jika mereka ingin mengganggu, pasti akan kamitolak dan kami tentang
Bibir Rasulullah yang kering kerana keletihan dan dek musim dingin yang menggigit hingga ke tulang, masih mampu melakar senyum sambil melantunkan bait-bait syair kegemaran Baginda. Syair yang pernah dikumandangkan oleh salah seorang penyair kesayangan Baginda SAW. Melihatkan wajah baginda yang sentiasa bersemangat, dan syair yang baginda perdengarkan, para sahabat seakan mendapat kekuatan. Tiada seorang pun yang mengeluh. Siapakah gerangannya sahabat agung itu? Yang syairnya menjadi dendangan bibir semulia-mulia manusia penghulu seluruh alam?
Mari kita tinggalkan parit Khandaq dan melangkah ke pentas hidup insan hebat bernama Abdullah bin Rawahah.
Pada musim haji tahun ke-12 kerasulan Baginda, beliau adalah antara 12 orang utusan suku-suku daripada Madinah (yang kemudian dikenal dengan nama Kaum Anshar.) yang membai'ah atau mengikat janji sumpah setia kepada RasulullahSAW untuk membela Baginda. Sumpah ini terkenal dengan nama Bai’ah Al-Aqabah al-Ula (Aqabah pertama). Merekalah pembawa dan penyebar ajaran IsIam pertama ke kota Madinah, dan bai’at merekalah yang membuka jalan bagi hijrah Nabi beserta pengikut beliau, yang kemudian, membawa kepada penyebaran Islam yang begitu pesat sebelum Rasulullah berhijrah ke Madinah.
Pada tahun berikutnya, Rasululloh Shallallaahu ‘alaihi wa Sallam dibai’ah 73 orang Anshar dari penduduk Madinah pada Bai’atul ‘Aqabah Al-Thani (kedua), dimana Abdullah Ibnu Rawahah ini pun termasuk salah seorang utusan yang dibai’at itu.
Kemudian sesudah Rasulullah Sallallaahu ‘alaihi wa Sallam bersama shahabatnya hijrah ke Madinah dan menetap di sana, maka Abdullah bin Rawahah jualah antara yang paling banyak berusaha membela agama Allah. Beliau mengawasi tipu muslihat Abdullah bin Ubay (pemimpin golongan munafik). Ketua munafiq itu menyusun pelbagai rencana menjatuhkan Rasulullah kerana dia telah terlepas satu peluang yang begitu diidamkannya. Sebenarnya dia telah dipersiapkan untuk diangkat menjadi raja sebelum Baginda berhijrah ke sana. Sebab itulah dia tak putus-putus berusaha menjatuhkan Islam dengan tidak menyia-nyiakan setiap kesempatan yang ada. Berkat kehebatan Abdullah bin Rawahah yang terus-menerus mengikuti gerak-gerik Abdullah bin Ubay dengan cermat, maka gagallah usahanya, dan maksud-maksud jahatnya terhadap Islam dapat dipatahkan.
Pada zaman tersebut, bukan semua orang mendapat peluang menuntut ilmu. Tetapi Allah telah memilih Ibnu Rawahah untuk lahir di suatu lingkungan yang mahir degan kepandaian menulis dan membaca. Lantas dia membesar menjadi seorang penulis yang hebat. Ia juga seorang penyair yang fasih, untaian syair-syairnya meluncur dari lidahnya begitu indah didengar. Orang-orang Islam pun sering mengulang-ulangi syair-syairnya yang indah.
Penyair Rawahah ini pernah dirundung kesedihan amat sangat sewaktu turun ayat 224 surah Al-Syu'ara' :
“Dan para penyair, banyak pengikut mereka orang-orang sesat”
Tetapi kedukaan hatinya dirawat oleh Rasulullah dengan senyuman. Baginda membacakan ayat yang waktu turun pula ayat lainnya : “Kecuali orang-orang(penyair) yang beriman dan beramal shaleh dan banyak ingat kepada Allah, dan menuntut bela sesudah mereka dianiaya”. (Q.S. Asy-syu’ara : 227)
Semenjak ia memeluk Islam, dipergunakan bakat bersyairnya itu untuk kejayaan Islam. Di sebalik syair-syair yang dilontarkan, ditebarkannya roh-roh jihad, semangat persaudaraan serta cintakan Islam ke dalam diri para sahabat dan semua tentera muslimin di medan-medan perang. Dan RasulullohShallallaahu ‘alaihi wa Sallam amat menyukai dan menikmati syair-syairnya dan sering beliau diminta untuk lebih bersungguh-sungguh lagi membuat syair.
Perang Mu'tah dan Tangisan Ibnu Rawahah
فلما ودع عبد الله بن رواحة مع من ودع بكى فقيل له ما يبكيك يا ابن رواحة فقال "والله ما بي حب الدنيا وصبابة ولكن سمعت رسول الله صلى الله عليه وسلم يقرأ آية من كتاب الله يذكر فيها النار { وإن منكم إلا واردها كان على ربك حتما مقضيا } فلست أدري كيف لي بالصدر بعد الورود
Apabila kaum muslimin mengucapkan selamat jalan kepada para tentera Mu'tah, tiba-tiba Abdullah bin Rawahah menangis. Maka ditanya; apa yang membuatmu menangis wahai Ibnu Rawahah? Maka jawab beliau:
"Demi Allah aku menangis ini bukan kerana cintakan dunia atau pilu meninggalkan kalian, tapi kerana teringat aku pernah mendengar Rasulullah SAW membaca sepotong ayat Quran yang menyebut tentang neraka; "Tiada seorang pun di antara kamu kecuali akan mendatangi neraka,demikian itu satu ketetapan daripada Tuhanmu" (surah Maryam:71) Maka aku tidak tahu bagaimana aku akan melepasinya setelah mendatanginya."
Maka jawab para muslimin; صحبكم الله ، ودفع عنكم ، وردكم إلينا صالحين " Semoga Allah mengiringimu dengan kesejahteraan, mempertahankan kamu dan mengembalikan kamu kepada kami sebagai golongan solihin"
Tapi tahukah kita apa jawapan Ibnu Rawahah? Dengan air mata yang masih membasahi pipi, beliau bermadah;
لكنني أسأل الرحمن مغفرة
Tapi kupohon dari Allah Ar-Rahman keampunan
وضربة ذات فرع تقذف الزبدا
Dan pukulan yang bertubi-tubi
أو طعنة بيدي حران مجهزة
Dan tusukan di kota Harran itu telah tersedia
بحربة تنفذ الأحشاء والكبــدا
Dengan peperangan yang menembuskan tali perut dan hati
حتى يقال إذا مروا على جدثي
Hingga dikatakan apabila mereka melewati jasadku yang telah syahid itu
يا أرشد الله من غاز وقد رشدا
Dialah pejuang berani yang mendapat bimbingan Ilahi
Bala tentara Islam pun maju bergerak ke medan perang Mu'tah. Sewaktu orang-orang Islam dari kejauhan telah dapat melihat musuh-musuh mereka, mereka terasa gerun melihat besarnya balatentara Romawi yang disebutkan sekitar 200,000 orang! Kerana menurut kenyataan barisan tentara mereka seakan tidak tahu di man hujungnya perbarisan mereka. Seolah-olah tidak terhitung banyaknya!
Melihat jumlah mereka yang cuma 3000, tentera muslimin benar-benar terkesima. dan sebagian ada yang berkata: “Baiknya kita kirim utusan kepada Rasulullah Sallallaahu ‘alaihi wa Sallam, memberitakan jumlah musuh yang besar. Mungkin kita dapat bantuan tambahan pasukan, atau jika diperintahkan tetap maju maka kita patuhi”.
Tetapi Ibnu Rawahah, bagaikan datangnya siang bangun berdiri di antara barisan pasukan-pasukannya lalu berucap dengan lantang. Satu ucapan yang menggegarkan dan tercatat harum dalam lipatan sejarah:
يا قوم و الله إن الذي تكرهون للذي خرجتم له- تطلبو ا الشهادة
“Wahai kaumku! Demi Allah apa yang tidak kamu sukai itulah sebenarnya yang kamu keluar kerananya iaitu kita memburu syahid
و ما نقاتل الناس بعدد و لا قوة و لا كثرة
sesungguhnya kita berperang menentang musuh kita bukan bersandar pada bilangan, kekuatan atau banyaknya jumlah!
إنما نقاتلهم بهذا الدين الذي أكرمنا الله به
Kita tidak memerangi memerangi mereka, melainkan berbekalkan agama kita ini, yang dengan memeluknya kita telah dimuliakan Allah!
فانطلقوا فانما هي إحدى الحسنيين:
Ayuh mara ke hadapan mengejar salah satu dari dua kebaikan yang pasti kita capai
اما الظهور واما الشهادة
Sama ada menang atau syahid !”
Bergema suara kaum Muslimin yang sedikit bilangannya tetapi besar imannya itu menyatakan persetujuan. Mereka berteriak: “Sungguh, demi Allah, benar apa yang dikatakan oleh Ibnu Rawahah!”
Pasukan berani mati itupun terus ke tujuannya, dengan bilangan yang jauh lebih sedikit menghadapi musuh yang berjumlah 200,000 yang berhasil dihimpun orang Romawi untuk menghadapi suatu peperangan dahsyat yang belum ada taranya. Kedua balatentara pun bertemu, lalu berkecamuklah pertempuran di antara keduanya.
Pemimpin yang pertama Zaid bin Haritsah gugur sebagai syahid yang mulia, disusul oleh pemimpin yang kedua Ja’far bin Abi Thalib, hingga ia juga memperoleh syahidnya setelah kedua tangannya telah kudung mempertahankan bendera Islam, sehingga digelar zul janahain (yang mempunyai dua sayap) kerana Allah telah menggantikannya dengan dua sayap di syurga yang membolehkan beliau terbang ke mana saja yang beliau sukai. Dan sebahagian sahabat menggelarnya Jaa'far at-Toyyaar (yang terbang).
Setelah itulah Abdullah ibn Rawahahmenyusul sebagai pemimpin bala tentera muslimin yang ketiga. Dikala itu ia menyambut panji perang dari tangan kanannya Ja’far, sementara peperangan sudah mencapai puncaknya. Hampir-hampirlah pasukan Islam yang kecil itu kucar-kacir diantara pasukan Romawi yang datang membanjir laksana air bah, yang berhasil dihimpun oleh Heraklius untuk maksud ini. Tetapi Abdullah mengembalikan semngat mereka dengan menggantikan tampuk kepimpinan tentera ketika saat genting itu. Beliau berseru :
أقسمت يا نفس لتنزلن_ لتنزلنه أو لتكرهنه
“Bukankah kau telah bersumpah wahai diri untuk maju ke medan perang walaupun kau membencinya
إن أجلب الناس وشدوا الرنة_ ما لي أراك تكرهين الجنة
Apabila manusia berhimpun untuk berperang dan teriakan serta jerit tangis kian memuncak.
Tapi mengapa kulihat engkau seolah bencikan kematian dan menolak syurga?
قد طال ما قد كنت مطمئنة_ هل أنت إلا نطفة في شنة
Telah lama kau tinggal dalam suasana tenang
Bukankah kau itu cuma setitis air mani yang hina?"
Berangkat Menuju Redha NYA.
Ia pun maju menyerbu orang-orang Romawi dengan tabah. Kalau tidaklah taqdir Allah Subhanahu wa Ta’ala yang menentukan, bahwa hari itu adalah saat janjinya akan ke syurga, niscaya ia akan terus menebas musuh dengan pedangnya, hingga dapat menewaskan sejumlah besar dari mereka.Tetapi waktu keberangkatan sudah tiba, yang memberitahukan awal perjalananya pulang ke hadirat Allah, maka naiklah ia sebagai syahid.
Jasadnya jatuh terkapar, tapi roh perwira itu naik menghadap Zat Yang Maha Pengasih lagi Maha Tinggi, dan tercapailah impian yang didendangkan dalam syairnya selama ini:
حتى يقولوا إذا مروا على جدثي أرشده الله من غاز وقد رشدا
“Hingga dikatakan, iaitu bila mereka melewati mayatku: Wahai prajurit perang yang dipimpin Allah" Ya Allah. Benar, ia telah terpimpin!” “Benar dikau, ya Ibnu Rawahah! Anda memang prajurit yang telah dipimpin oleh Allah!”
Selagi pertempuran sengit sedang berkecamuk di bumi Balqa’ di Syam, Rasululloh Sallallohu alaihi wa Sallam sedang duduk beserta para sahabat di Madinah berbicara dengan mereka. Tiba-tiba percakapan yang berjalan dengan tenang tenteram, Nabi terdiam, kedua matanya basah berkaca-kaca. Beliau mengangkatkan wajahnya dengan mengedipkan kedua matanya, untuk melepas air mata yang jatuh!
Seraya memandang berkeliling ke wajah para sahabatnya dengan pandangan haru, beliau berkata: “Panji perang dipegang oleh Zaid bin Haritsah, ia bertempur bersamanya hingga ia gugur sebagai syahid. Kemudian diambil alih oleh Ja’far, dan ia bertempur pula bersamanya sampai syahid pula. Baginda berdiam sebentar, lain diteruskannya ucapannya: “Kemudian panji itu dipegang oleh Abdulah bin Rawahah dan ia bertempur bersama panji itu, sampai akhirnya ia·pun turut syahid."
Di masa itu, seperti yang diceritakan dalam buku sirah ini, Raheeq Makhtum- Rasulullah berlinangan air mata, menyambung; "Selanjutnya disambut oleh salah satu pedang daripada pedang Allah (Khalid Al-Walid) sehingga Allah memberi kemenangan.”
Kemudian Rasul diam lagi seketika, sementara mata beliau bercahaya, menyinarkan kegembiraan, ketenteraman dan kerinduan, lalu katanya pula : “Mereka bertiga diangkatkan ke tempatku ke syurga …”
Subhanallah!
Ibnu Rawahah telah berjaya!
Oh ya, apakata kita semua baca tentang perang Mu'tah ini. Sangat penting untuk kita semua tahu. Cuba bayangkan kehebatan tentera Rasulullah 3000 vs. 200,000 hanya 12 tentera muslimin yang syahid! Tentera Rom pula dianggarkan mengalami kerugian nyawa yang besar. Cuba antum cari apakah taktik yang telah diguna pakai oleh saifullah al-maslul (pedang Allah yang terhunus-gelaran Khalid) sehingga tentera Rom tertipu dengan taktik perang itu dan berasa gerun lalu berundur???
Masha Allah!
Perang Mu'tah ini juga telah memberi kesan besar membawa kemasyhuran tentera Islam harum ke Rom dan seluruh arab. Impak besarnya termasuklah
~kuasa Rom menjadi cuak dengan ancaman tentera Islam dan perang ini merupakan permulaan kepada pertarungan2 berdarah dengan Rom di masa2 seterusnya sehingga akhirnya membawa kepada kemenangan dan pembukaan Islam di negeri2 Rom
~Qabilah-qabilah arab yang sebelum ini menjadi musuh ketat Islam telah mengubah pendirian dan ramai-ramai menganut agama Islam termasuk Bani Salim, Asyja', Ghatfaan, Zibyaan, Fazarah, dan lain-lain.
Ini kerana sebelum ini mereka mempersendakan keberangkatan tentera Islam. Mereka mendakwa tentera muslimin ibarat menghantar ekspedisi membunuh diri kerana jumlah mereka yang kecil itu menentang ratusan ribu tentera Rom. Tambahan pula, kuasa Rom ketika itu adalah bangsa yang paling digeruni, kuasa gergasi (mungkin seperti Amerika hari ini). Tetapi sebaliknya tentera Islam kembali ke Madinah tanpa kerigian besar. Ini benar-benar membuktikan kehebatan Islam. Tetapi ini juga membuktikan mereka sememangnya dibantu dan disokong oleh Allah SWT !!!
Membaca sirah benar-benar membuatkan saya kagum akan kehebatan para sahabat dari segi keimanan mereka yang tidak berbelah bagi. Mereka tidak pernah mempersoalkan tindakan Rasulullah Sallallahu Alayhi Wasallam. Tetapi keimanan mereka bulat. Tidak bersandar pada logik akal, tapi logik Allah. Kalau Allah kata jadi, maka jadi. Islam yang menang. Bagaimana imanku ya Allah ? (~.~) Masih banyak yang perlu diperbaiki untuk menyandang gelaran Syabab Muhammad !!!
Rujukan:
-Karakteristik Perihidup 60 sahabat Rasulullah SAW (Khalid Muhd Khalid)
-Al-Raheeq Al-Makhtum- Sirah Rasulullah Sallalahu Alayhi wasallam (Syeikh Sofiy Ar-Rahman Al-Mubarakfuri)
-Riwayat hidup Rasulullah Sallallahu alayhi wasallam (Abul Hasan Ali Al-Hasani An-Nadwi)
نسأل الله ان نسير علي دربهم ونلتحق بركبهم في الجنة ان شاء الله
الله ينور قلوينا وقلوبكم وقلوب جميع المسلمين بالعلم والدين والهدي واليقين ويرفع مقامنا ومقامكم ومقام جميع المسلمين في الفردوس الأعلي ويحشرنا ويحشركم بجوار النبي الأمين
Kredit
http://ibnufathani.blogspot.com/2011/05/perang-mutah-air-mata-penyair.html
Monday, June 20, 2011
Perang Mu'tah & Air Mata Penyair Kesayangan Rasulullah Sallallahu 'Alayhi Wasallam
Posted by ryzam at 3:32 PM 0 comments
Monday, April 18, 2011
Exercise
Salam
Last week terdapat perbincangan yang panjang berkaitan domain design dan bagaimana cara untuk membolehkan sesuatu design itu fleksible untuk reusable.
Sebelum nie terdapat banyak teknik untuk hasilkan design yang fleksible antaranya ialah dengan mengambil kehendak apa yang perlu diuji untuk dijadikan panduan untuk mancapai objektif. Cara ini dikenali sebagai Test Driven Design (TDD). Kemudian ada juga cara lain seperti Domain Driven Design (DDD) dan normal OOAD.
Okay untuk exercise apa kata kalau kita cuba untuk selesaikan satu requirement yang sebegini.
Satu company menyelia 2 jenis perkhidmatan, dimana setiap perkhidmatan memerlukan operator untuk merekodkan docket.
Docket ini mengandungi maklumat satu atau lebih SubDocket dan SubDocket pula boleh mengandungi satu atau lebih DocketItem.
Maklumat DocketItem pada perkhidmatan yang ditawarkan mempunyai persamaan pada sesetengah property dan mempunyai maklumat yang berlainan pada property yang lain dan dockeitem tersebut mempunyai relation ke product atau service mengikut jenis perkhidmatan. Selain dari itu docketitemB juga memerlukan pengiraan DiscountPercentage.
Saya bagi contoh domain dalam image dibawah. Apa yang penting ialah bagaimana kita boleh menggunakan object yang sama untuk handle requirement sebegini. Dan kemudian kita akana tambah requirement baru dari masa kesemasa. Ada sesiapa yang hendak suggest atau mencuba?
Posted by ryzam at 12:31 AM 1 comments
Friday, March 25, 2011
vaccine framework example - preview 3 (create order)
Salam
Adad beberapa minor changes dlm codebase vaccine framework, yang utama sekali ialah macam maner aku nak handle part read side iaitu reporting.Aku akan sentuh part nie nanti. Tetapi untuk sekarang nie aku nak tunjukkan bagaimana aku pecahkan relation Customer dari Order dan pecahkan relation OrderLine dari Product.
Kalau tengok balik domain diagram yang sebelum nie, domain diagram ini adalah cara design yang kebiasaan dari kita akan buat apabila menggunakan cara n-tier, dimana dlm domain tersebut kita ubah, dalam domain tersebut juga kita baca latest state object tersebut untuk kita tunjukkan kepada client balik dan kebiasaan juga, process ini akan melibatkan kita map dengan class Data Transfer Object untuk reshape maklumat kepada UI screen di client.
Selepas tu aku cakap jika menggunakan DCI+CQSR+Event Sourcing, kita boleh pecahkan relation tadi dan letakkan reference tersebut berada dalam Role, dan relation ini bersifat sementara.Kenapa Role penting? Ini adalah kerana kita boleh share role diantara aggregateroot object yang lain dengan syarat aggregateroot object tersebut juga perlulah memenuhi contract Role yang didefine. Dan di dalam Role jugalah berlaku interaction antara object, sebagai contoh jika condition ini berlaku, execute object yang itu, etc.
Berbalik pada demo code yang aku nak tunjuk, sebelum nie aku dah tunjukkan bagaimana nak create Customer, tetapi ada beberapa code penting aku terlupa nak cerita, menyebabkan terdapat beberapa kekeliruan.InsyAllah aku cuba terangkan dengan lebih lengkap dalam n3 kali ini.
Untuk create Order bagi specific Customer, kita perlu lah juga ada Product, so process untuk create Product adalah lebih kurang macam mana nak create Customer.
Jadi sekarang nie aku dah adalah list Customer dan aku juga dah ada list Product. UI dia ada seperti ini:
Langkah seterunya ialah aku define object Order, dan class code dia adalah seperti ini. Code dalam class Order sebenarnya dibina secara incremental tapi payah nak tunjuk satu-satu, so aku show complete class Order.
Line 5 , menunjukkan Order mengandungi OrderLine dan object OrderLine nie ialah child object bagi Order. Line 52, ialah complete OrderLine, dan lihatlah berapa simple class tersebut.
Line 11 dan 12 pula, kita perlu registerkan event handler yang akan execute apabila kita replay balik semula event2 tersebut.Ok buat masa nie, kita tingglkan sekejap class Order nie.
Next, aku perlu define pula apa Command yang perlu dibuat untuk melakukan Order bagi Customer. So disini aku define Command - MakeNewOrderCommand
Code yang ini pun cukup straight forward, cuma aku define dictionar collection ialah bagi aku combinekan selection product dan juga berapa quantity.
Seterusnya ialah dengan define Role, apa Role yang akan memainkan peranan dalam melakukan Order dan siapa AggregateRoot yang akan menjadi RolePlayer?
Aku memilih Order object sebagai AggregateRoot dan juga menjadi RolePlayer untuk Role MakeNewOrderRole.
Ok jom kena tengok apa yang menarik didalam Role ini. Line 5, aku perlu mapkan apa command yang akan digunakan dalam Role ini.
Beri perhatian pada Line 7.Pada Line 7 ini, aku akan load AggregateRoot Customer hanya dengan Id, apa yang berlaku dibelakang scene ialah, vaccine framework akan baca setiap event dalam eventsnapshot source untuk aggregateroot customer dan akan replay event-event tersebut.
Okay lihat semula pada code Customer, sebelum ini kita dah registerkan Customer tersebut untuk terima 2 jenis event iaitu event NewCustomerCreatedEvent dan CashBalanceDecreasedEvent. Line 25, OnNewCustomerCreated ini lah vaccine framework akan trigger semula apabila direplay jika ada event NewCustomerCreatedEvent, dari situ kita dapat lihat bagaimana sesuatu AggregateRoot object dibina state2 object tersebut.
Ambil masa dan kaji macam maner interaction between object berlaku didalam Role dan bagaimana juga Role ini nanti boleh dishare dengan AggregateRoot object yang lain sebagai RolePalyer. Kalau sekarang nie RolePlayer ialah Order, ada kemungkinan process Order ini tetapi aku nak menggunkan keatas AggregateRoot object yang lain seperti Sale etc? Cuma sekarang nie mengambil konsep "YAGNI", kita hanya concentrate pada objective yang hendak dicapai, jika ada keperluan untuk dishare pada masa tu kita akan buat minor refactor.
Line 14 kita akan replay event untuk Product pula, process sama macam yang diterangkan, manakala Line 22,23,24 ketiga3 AggregateRoot akan memainkan peranan untuk execute method2 bagi menjayakan hasrat Role itu tadi.
Okay Line 23, customer.DecreaseCashBalance(totalAmount), singkap balik code dalam Customer dimana method DecreaseCashBalance dan lihat apa yang berlaku.
public void DecreaseCashBalance(decimal totalAmount)
{
if (cashBalance >= totalAmount)
{
cashBalance -= totalAmount;
var e = new CashBalanceDecreasedEvent { CashBalance = cashBalance };
Apply(e)
.UpdateReport(r => r.cashBalance = cashBalance);
}
else
{
throw new Exception("Insufficent amount to deduct");
}
}
Okay yang ini pula ialah code di client
private ActionResult MakeAnOrderComplete(CustomerOrderViewModel model)
{
try
{
var cmd = new MakeNewOrderCommand { CustomerId = new Guid(Request.Params["CustomerId"]) };
foreach (var item in model.OrderItems)
{
cmd.Quantities.Add(item.ProductId, item.Quantity);
}
using (var s = UnitOfWork)
{
var ctx = new ContextHandler(repo);
ctx.Bind(cmd)
.Execute();
s.Commit();
}
return MakeAnOrder();
}
catch(Exception err)
{
throw err;
}
}
Ada beberapa, part yang aku belum sentuh, insyAllah dalam n3 yang lain, n3 nie pun dah agak panjang.
https://github.com/ryzam/VaccineWeb-Preview - Code
Posted by ryzam at 8:39 AM 0 comments
Wednesday, March 23, 2011
vaccine framework example - preview 2 (create customer)
Salam kepada Datuk T :) sempena hari porno se1Malaysia
Ok untuk meneruskan kerja jahat, opps kerja baik dari entry part 1 , saya akan tunjukkan contoh dan bukti bagaimana hendak menggunakan vaccine framework dimana anda akan start dengan pengalaman baru cara DCI + CQRS + ES(Event Sourcing) di combinekan.
1. Create Customer class object
Aku akan tulis first code iaitu customer class didalam folder Domains/Customers
Perhatikan ada beberapa perkara penting aku perlu letak didalam class Customer. Pertama aku perlu extends AggregateRoot
2. Create command
Berikutnya, aku perlu tulis command class untuk digunakan sebagai message dari client ke server seperti ini. Tiada yang istimewa cuma perlu di extends ke command. Command akan digunakan di client sebagai mapping user mental model yang mengandungi maklumat dan operation yang hendak dilakukan.
3. Create Role
Selepas aku dah create domain(aggregateroot) dan juga command, seterusnya aku kena define Role. Role antara element yang penting/core dlm vaccine framework, dimana Role ini boleh sahaja dishare antara domain object yang lain dengan syarat domain object yang lain memenuhi contract RoleMethod. Contoh Role dalam demo app nie seperti berikut ini.
Self ialah keyword yang akan map balik kepada AggregateRoot so dalam kes ini Self ialah Customer.Self akan ada method CreateNewCustomer(c.Name,c.CashBalance), then perhatikan balik dalam code Customer diatas, dimana dalam method tersebut, kita hanya akan hasilkan event apabila method tersebut berlaku. Event tersebut akan diletakkan dalam method Apply iaitu salah satu method dalm vaccine framework berfungsi untuk store event kedalam event source dan eventsnapshot source, selain dari itu reporting component juga berada dalam Apply method. Event yang dihasilkan dalam process CreateNewCustomer ialah NewCustomerCreatedEvent. Code NewCustomerCreatedEvent adalah seperti ini.
4. Masukkan reporting
Seterusnya, apabila event tadi terhasil, selain dari disimpan kedalam event source dan juga eventsnapshot source, bahagian report juga untuk read process akan juga berlaku. Aku perlu create bagaimana report yang aku ingin keluarkan, report boleh digunakan untuk view di screen. So aku tidak perlu lagi ada join table, sebalinya setiap view UI akan ada report masing-masing.
EventHandler yang mengawal samaada update atau create new report ialah seperti ini
Aku akan tunjuk, rupa eventsnapshot source dan customerreport datasource.
EventSnapshotSource
CustomerDetailReport
Ringkasan
Ini adalah preview simple bagaimana menggunakan vaccine framework. InsyAllah akan buat demo dengan scenario yang lagi complex selepas ini.
Posted by ryzam at 3:35 PM 0 comments
Tuesday, March 22, 2011
vaccine framework example - preview 1
Salam
Ok, just nak tunjuk simple example macam maner vaccine framework berfungsi. So example yang paling mudah ialah classic example customer order product. Rules yang perlu ada ialah order mestilah tak lebih dari balance amount yang ada pada customer dan juga quantiti order product mestilah kurang atau sama dari available quantiti stock pada setiap product yang dipilih.
So, langkah pertama macam maner kita nak design domain model dia? Kalau normal domain model design kita akan hasilkan design seperti ini
Domain diatas digunakan untuk write dan read, so akan ada join table sana dan sini untuk hasilkan maklumat tertentu ke screen atau apa-apa bentuk reporting.
Domain design menggunakan vaccine framework pula akan hasilkan design sebegini
Hasilnya tiada lagi reference order ke customer dan tiada lagi reference orderline ke product. So mana perginya reference ini. Kalau dilihat dalam image reference tu sekarang berada dalam makeorderrole tetapi ianya hanyalah short term reference, hanya berlaku apabila role tersebut digunakan. Maklumat reference disimpan didalam event untuk read model.
Oleh kerana ini adalah preview untuk vaccine framework, so untuk detail pasal architecture akan dibincang di lain kali.
Antara konsep yang penting dalam cqrs ialah messaging. Message terbahagi kepada 2 bahagian, command dan juga event.
Command dimap kepada verb dan dalam bentuk "present tense" seperti RegisterNewCourse etc.
Manakala event pula ialah sesuatu yang telah berlaku hasil dari process dari command. Name convention untk map ialah seperti berikut NewCourseRegistered ianya juga map kan verb dalam bentuk "past tense".
Okay cukup serba sedikit pasal command dan event, berbalik semula kepada macam maner hendak hasilkan solution kepada user story yang kat atas berserta rules yang perlu dipenuhi.
Apabila menggunakan vaccine framework, ada 3 object penting perlu di kenal pasti sebelum pergi ke step seterusnya. Pertama sekali kena kenal pasti
1. RolePlayer - Object yang akan menggunakan Role didalam berkomunikasi dengan object2 yang lain.
2. Command Message - Ialah intention/mental model dari user kepada system untuk buat sesuatu.
3. RoleMethod - Fungsi role dan boleh dikongsi fungsi ini dengan RolePlayer yang lain yang ada contract Role yang sama.
Habis preview 1 :)
Posted by ryzam at 8:59 PM 0 comments
Sunday, March 20, 2011
DCI + CQRS = Vaccine Framework
Salam berapa Malaysia
Ok last 2 weeks , aku agak busy developed simple framework , yang aku panggil vaccine framework, apa itu vaccine framework? Vaccine framework mengandungi beberapa combination pattern diantaranya ialah DCI dan DDD-CQRS. Selain dari itu vaccine framework tidak meyimpan current state domain object sebaliknya menyimpan event dalam 2 jenis event, normal event dan snapshot event.
Read dan write totally diasingkan component2 nya. Tiada lagi reference antara aggregateroot ke aggregateroot yang lain sebaliknya reference ini berlaku secara sementara didalam role apabila command di execute. Jadi reference ini hanyalah berada di read domain dan dalam bentuk denormalized.
Terdapat perbezaan ketara antara vaccine framework dengan cqrs framework yg lain seperti ncqrs (.net) dan axonframework (java). First sekali sudah tentu framework tersebut tidak support cara DCI working secara default dan framework2 tersebut semuanya derive current state object dengan replay event, walaupun framework tersebut ada process untuk derive dari snapshot tetapi ianya bukan secara default. Sama ada perlu letakkan configuration berapa bilangan event berlaku dan buat snapshot atau run another thread untuk buat snapshot dan store dlm sequence of event.
Manakala dalam vaccine, setiap event of object akan disimpan hanya kepada 2 jenis table EventSource dan EventSourceSnapshot, dan main event yang akan direplay ialah di EventSnapshotSource.
Keseluruhan application kita akan hanya ada 2 table di write component dan pelbagai table report di read component berdasarkan bagaimana kita nak show information ke user sama ada paparan ke screen atau format percetakan.
InsyAllah, aku dah rewrite sikit mars application untuk POC, mcm maner vaccine framework ini bekerja. masih lagi baby framework, hopefully dapat support 1Malaysia hahahaha .. yeyeye
Posted by ryzam at 10:39 PM 0 comments
Monday, March 14, 2011
CQRS - Part 2
Salam 1Malaysia
Minggu lepas coretan pertama berkaitan CQRS dan serba sedikit pengenalan apa itu CQRS. Seperti yang diterangkan, asas paling utama dalam CQRS ialah membezakan process write dan read.
So kenapa perlukan CQRS. CQRS hanyalah pilihan dalam architecture design, bagi developer yang inginkan scalability, performance dan maintainability boleh mencuba CQRS dimana terdapat pelbagai versi CQRS yang boleh dipilih untuk dibuat guideline.
Sebelum diberi nama CQRS, architecture pattern ini dikenali sebagai CQS-DDD dan terdapat kekeliruan di antara CQS - Bertrand Meyer dan CQS-DDD dari DDD group. Walau objective kedua-dua pattern nie sama, dan tak dinafikan CQS-DDD menjadikan CQS - Bertrand Meyer sebagai asas pattern, tetapi CQS-DDD bergerak ke arah yang lebih besar iaitu architecture pattern.
CQS - Bertrand Meyer punya definisi :-
"every method should either be a command that performs an action, or a query that returns data to the caller, but not both"
Jadi CQS- Betrand Meyer punya target pada masa itu ialah supaya satu class/method tidak akan buat2 perkara write dan read dlm class/method yang sama.
CQRS juga mengambil prinsip yang sama, maka perkara pertama yang perlu dipastikan ialah design class/method yanag akan handle concrete kerja. Satau class akan buat command-(write) dan satu lagi class akan buat query-(read).
Begitu juga halnya pada code existing, apa yang boleh dibuat ialah cuba refactor dan pecahkan function2 tersebut ke dalam kategori masing-masing.
Posted by ryzam at 11:14 AM 0 comments