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

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.


Demo nie dalam ASP.Net MVC3. Aku create simple web solution dan didalam folder Models aku perlu create 6 folder iaiatu:

1. Commands
2. Domains
3. EventHandlers
4. Events
5. Reports
6. RoleHandlers

Imej seperti dibawah ini.





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, ini adalah penting untuk framework execute function replay apabila load object dari storage. So convention ini juga menunjukkan Customer adalah AggregateRoot dan aku juga perlu implement IRolePlayer untuk membolehkan Customer untuk host apa-apa role yang diberi semasa runtime execution selagi mengikut role contract, very flexible dan dynamic.

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.

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 :)

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

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.

Thursday, March 10, 2011

CQRS

Salam 1Malaysia

CQRS Architecture pattern, agak complex jika pertama kali membaca artikel atau mendengar mana-mana presentation berkaitan.

Objektif utama ialah untuk membezakan antara (read) dan (write) domain object. Itu sahaja, cuma untuk mencapai objektif tersebut terdapat beberapa cara penyelesaian yang boleh diguna pakai.

Penyelesaian yang paling umum ialah dengan membezakan proces (write domain object) dan proces (read domain object) menggunakan component yang berlainan.

Ok sebelum itu image dibawah adalah contoh architecture design yang biasa digunakan



Jika diperhatikan process write dan read mengunakan component yang sama dan melalui process yang sama dari client hingga ke server.

Masalah utama ialah untuk ialah scalability dan performance. Umum mengetahui write process adalah lebih lama dari read process, tetapi apabila satu domain digunakan untuk read dan juiga write, ini akan memberikan penalti dari segi performance.

Dari segi database, apabila write dilakukan, sql server akan lock row sehingga process write tadi selesai dan jika pada masa yang sama terdapat client yang ingin membaca data tersebut, client tersebut perlulah menunggu sehingga process tersebut selesai. Untuk sistem yang trafiknya adalah kecil, keadaan ini tidak mengganggu performance tetapi bagi trafik yang besar,peratusan kemungkinan sistem akan crash adalah besar.

So untuk next coretan, insyAllah akan bawa contoh penyelesaian yang boleh digunakan.

Salam 2Malaysia :)

Wednesday, February 02, 2011

Rewrite NerdDinner + DCI + SisoDB

Salam -1Malaysia

Antara cara untuk cepat memahami dan belajar sesuatu teknik dalam programming ialah dengan rewrite existing open source application kepada teknik baru yang hendak dikuasai.Cara sebegini agak berkesan kerana bahagian UI tidak perlu dibina, boleh menggunkan UI yang dah ada, apa yang penting ialah mengubah code dibahagian belakang (backend).

Untuk itu aku akan tunjukkan cara macam maner aku rewrite + refactor existing nerddiner code kepada teknik DCI.InsyAllah aku akan bahagikan artikel nie kepada beberapa bahagian.

Untuk mereka yang tak tahu apa itu NerdDinner, boleh baca kat sini NerdDinner Codeplex.

First sekali aku perlu kenal pasti which part/code yang aku ingin rewrite.Jadi dalam nerddinner application bahagian yang aku kenal pasti pertama sekali ialah bahagian register sebagai user. NerdDinner menggunakan Membership provider which is pada aku provider yang okay bagi normal developer, tetapi tidak bagi experiance developer.

Okay first sekali tengok dalam orginal code di controller



Pada line no 8, controller akan call Membership service untuk create User. Aku rewrite code di contoller dan mengantikan Membership service kepada DCI context.



Code diatas ialah code di controller apabila ditukar untuk connect ke DCI context. Perhatikan pada line 13 iaitu RegisterAccountContext. RegisterAccountContext bertanggungjawab untuk run process mendaftarkan user.

Project Solution
Sebelum start dengan lebih detail, disini aku tunjukkan beberapa perubahan yang dilakukan tetapi tidak terlalu ekstrim, pada project solution aku tambah another 2 folder dalam project yang sama (Aku tak buat dlm project yang lain untuk tujuan demo ini). Dua folder yang baru ditambah ialah Contexts dan juga Domains folder didalam folder Model seperti ini :


Domains
Orginal nerddiner menggunakan Entity Framework Codegen, tetapi disini aku akan guna normal POCO plus SisoDB. Untuk mereka yang tidak tahu apa itu SisoDb boleh baca disini SisoDb.

Untuk first domain aku akan buat ialah UserAccount. Aku akan tunjukkan sesimple yang boleh untuk rewrite aplikasi ini.



Interface IRolePlayer hanyalah marker interface, manakala IUserAccount ialah role interface, nanti akan diterangkan secara detail.

Context

Context ialah object yang akan implement use case. Kebiasaannya nama context similar kepada nama use cases. Jadi disini aku akan create satu context yang dipanggil RegisterAccountContext.



Okay pada line 9, aku declare role interface, dimana role interface ini hanyalah available digunakan hanya dlm context register account.

Pada line 30, role akan diinject dengan RoleMethod (RegisterAccountRole) class

this.IUserAccount.PlayRole()
.Register(userName, passWord, email);


Business interaction akan berlaku didalam class RegisterAccountRole, lihat line 42.

Okay rasa setakat ini untuk bahagian 1.

Hantar email untuk sample complete code

Tuesday, February 01, 2011

Pengundi Melayu kurang ilmu demand time pilihanraya

Pengundi melayu pada umumnya masih kurang ilmu nak demand undi time pilihanraya.. pilihanraya kat malaysia sebenarnya adalah perniagaan yang menguntungkan pada mereka yang arif

sepatutnya time nie jika mereka benar2 nakkan undi..anda sepatutnya demand hak-hak dan apa-apa yang berkaitan keperluan hidup pada masa itu juga... pada penyokong pembangkang jgn hanya terlibat dalam kempen pembangkang , join sekali event bik mama yang tiada unsur maksiat lah.. so masa tu anda mintalah mereka tunai kan keperluan anda sebagai rakyat/pengundi jika mereka memerlukan undi anda.. serius...nie rahsia hidup senang bila pilihanraya.

demand sikit, jika tak bagi..undi anda pergi ke pembangkang..ada berani??.. tapi oleh kerana sifat bertolak ansur dan lembut hati ada pada pengundi melayu menyebabkan mereka ditipu hidup2 macam sekarang nie, sampai bila perlu ditipu macam nie. walaupun anda memang karat biru, salah ke nak demand?? takut?? ..anda rugi.. walaupun anda dah tekad dlm hati nak mengundi dacing so kalau anda demand sikit adakah kemelayuan anda akan hilang?

pada pembangkang pun satu, kalau kawasan tu memang dah agak pekat % < 50 untuk menang ..mereka sepatutnya tak perlu bersusah payah berkempen mengeluarkan belanja yang banyak, sekadar buat satu kain rentang muka calon dah lah, lepas tu buat kempen kerumah sampaikan maklumat, bukan suruh undi pembangkang, tapi bagi tahu pengundi untuk demand hak mereka..

Ubah sikit cara, dah memang tahu susah nak sampaikan maklumat kerakusan pihak berkuasa, nak cerita pasal rasuah kat orang kampung apa mereka nak peduli, kehidupan mereka tak terasa sangat. so cara lain ialah kempen mereka untuk dapatkan peruntukan

guna psycho cara lain, keras jgn dilawan dgn keras, serap je..oleh kerana puak2 tu suka sgt buat project segera, so galakkan supaya lebih bnyk project segera, pada masa tu kena ajar pengundi untuk bersifat tamak dengan demand yang lebih2 sikit..pembangkang kena raikan apabila mereka tawarkan sesuatu pada pengundi...hadir press conference bila ada apa-apa project yang dibuat..

Wednesday, December 08, 2010

Finding object role

Salam

Aku baru je bagi light talk sambil makan tentang kepentingan role dalam team aku, tak tahu la dia org faham ke tak..sebab tak de slide presentation..tak de white board .. yang ada hanyalah lauk pauk :)

Aku nampak keberkesanan apabila dah setkan dlm minda apabila modelkan design antara element penting ialah mendefina role yang terlibat dalam sesuatu context. Pengalaman yang cukup beharga ialah di fasa kedua consultation project aku.Easy for me to write unit test dan easy untuk patch bugs. Walau dalam agreement aku hanyalah consultant tetapi ntah macam maner aku juga terpaksa menjadi developer apabila, beberapa developer lain dapat offer yang lagi bagus.Dalam fasa kedua approach aku ialah Role menjadi first class citizen.Tiada context jika kita tak berupaya mencari Role.

Imbasan sejarah. Aku tahu tentang penggunaan/kepentingan role dahulu sebelum Melaka diiktiraf sebagai negeri Maju iaitu sebelum 20/10/2010 jam 2010. Pada zaman tu Melaka belum ada lagi Eye on Melaka (Skrg nie dah bangkrap dan kena saman), aku pun masa tu programmer biasa naik motosikal 110cc je. Bila aku diperkenalkan dengan buku Java Color Modeling oleh Mr Hamdi <- bukan lagenda kung fu tapi rasa boleh berkungfu hujah le kot :)

Baca first time satu hapah pun aku tak faham..macam baca buka language makhluk asing. So bila benda yang macam nie kena cari penterjemahnya, so aku cari balik yang empunya buku tu Mr Hamdi, so tanya lah sikit lebih kurang sebab nak tanya lebih-lebih aku pun tak tahu nak tanya apa, so kebanyakkan peristiwa berlaku (moment-interval) dalam forum je. Aku join dalam forum color modeling, cuba beberapa model dan minta dia orang comment model aku.. nie 5/6 thn yang lepas, selepas beberapa lama mengodek-godel pasal color modeling dan ada kefahaman sedikit datang pula ajaran baru Domain Driven Design, aku tak ingat macam maner aku leh tahu pasal ajaran nie, so masa nie taraf dah naik sikit so ada kelebihan duit boleh le beli buku DDD.

Setiap kali berubah ajaran, aku akan cuba sesuaikan ajaran lama dengan ajaran baru, dimana ada kelemahan yang dapat ditampung oleh ajaran baru dan fokuskan juga dimana kekuatan ajaran tersebut.So selama lebih kurang 4-5 thn nie bnyk teknik aku gabungkan dimana asas untuk modelkan domain dtg dari color modeling dicantikkan bentuknya dengan DDD.

Tapi masa tu aku masih lagi kurang tumpukan Role sebaliknya Moment-Interval menjadi pilihan. Setelah jatuh dan bangun hasilkan beberapa project yang berscala sederhana ke besar aku dapati key dalam membina domain yang flexible ada di role dan ini terjadi apabila bertemu dengan ajaran DCI.

Role dalam DCI berbeza dengan role dalam color modeling, Role name dia kemungkinan adalah sama cuma perbezaan nya role dalam DCI fully behaviour sahaja dan stateless manakala dalam color modeling role kemungkinan persisted dan bukan stateless.

Aku diberi satu context untuk change status dari satu state ke state yang lain. Pada dasarnya aku boleh define lagi context tu.. as generic context atau concrete context. Kalau generic context ianya seperti menukar sesuatu state dari satu status ke status yang lain, dan jika concrete context ialah menukar status application form dari satu status ke status yang lain. Ada different context - context tersebut.

Generic Context

context ChangeStatus
{
void Bind(I
}



//Thing-Role
role IStatusChangeAble : PlayedBy, PlayedBy
{
void ChangeStatus(self,fromStatus,toStatus);
}

//Party-Role
role IChangeStatus : PlayedBy, PlayedBy
{
void ChangeStatus(self,statusChangeAble);
}

Buat masa nie, nie je lah dulu, ada masa insyAllah aku sambung. Saper nak comment dipersilakan

# contoh code dalam pastie.org

http://www.pastie.org/1358380

Susahnya nak menulis

Salam

Ini adalah nota developer yang tidak boleh digunakan di mana-mana mahkamah di Malaysia.

Kenkadang bila anda menulis anda akan dapat lebih kefahaman, kerana menulis artikel/nota tentang pengalaman anda didalam menyelesaikan sesuatu masalah yang teknikal cukup payah. Pertama bahasa yang digunakan kalau boleh orang lain pun boleh faham, dan kedua penerangan pun begitu juga. Jadi ambil masa nak merealisasikan apa yang ada dlm kepala otak untuk diterjemahkan kepada susunan ayat yang santai. Dan ada ketika pada pertengahan tulisan anda akan dapati apa yang ada faham tu sebenarnya tak tepat. Adakala apa yang anda faham itu betul , tetapi tak tepat bila disampaikan dan adakala awal-awal lagi apa yang anda fahami tu tak betul dan for sure bila sampaikan tak betul juga hujahnya. Aku rasa ini berlaku bukan terhad pada bidang teknikal, pada mana-mana bidang pun mcm tu lebih2 lagi bidang politik hahaha.

Monday, November 01, 2010

Kenapa perlu elakkan Anemic Domain Model

Salam

Aku sebelum ini percaya Anemic Domain Model tidak bagus jika ada dalam sesuatu domain model design/code dan aku masih lagi percaya cuma kini terdapat sedikit perbezaan dengan apa yang aku buat dalam sotware project terbaru. Ianya berkisar kepada "What System DOES" dan "What system IS". So anemic domain model nie hampir definasi apa yang dikenali "What system IS". Daripada Martin Fowler, symptom Anemic Domain Model ialah

"The basic symptom of an Anemic Domain Model is that at first blush it looks like the real thing. There are objects, many named after the nouns in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is hardly any behavior on these objects, making them little more than bags of getters and setters. Indeed often these models come with design rules that say that you are not to put any domain logic in the the domain objects. Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data".

Aku semakin slow dalam coding dan semakin slow juga nak faham code, so kalau code yang terlalu banyak tempat business algorithm dimana aku kena refer pada object A dan kemudian pergi ke object B, menjadikan aku kurang efficient so tak 1Malaysia lah cam nie. 1Malaysia pencapaian diutama so begitu jugalah halnya dalam code, code yang senang dibaca dan efficient sangat2 diperlukan, tapi ini semua abstract. Mungkin senang bagi developer Najib (bukan nama sebenar) tidak mudah untuk developer bernama Anwar (pun bukan nama sebenar). Cuma kita boleh ambil tahap pertengahan dimana indicator yang dirasakan setiap developer tu boleh memahami at least 60%-70% code yang awal apabila diberi code untuk dibaca.

So aku sudah pun bermula dengan pecahkan object2 aku kepada 2 bahagian. Basic object ialah ada attribute dan ada behaviour. So sekarang object2 aku buat dah seakan kembali menjadi anemic domain model percayalah. Cuma perbezaan dengan symptom anemic domain model sebelum ini ialah object attribute dan behavior tidak akan bersatu dan sebaliknya object lain dikenali sebagai "services" yang akan memainkan peranan menGALAS tanggungjawab untuk melakukan perbuatan baik dan buruk (method/behaviour object ada buruk dan baik gak). So yang macam nie memang aku bangkang. Aku tak boleh terima sesorang yang ada maklumat tetapi yang akan buat kerja orang lain berdasarkan maklumat tersebut. Jadi apa yang aku perlukan ialah di masa design code aku dipecahkan tetapi pada masa runtime atau pada masa diperlukan aku boleh dapat behavior2 tersebut. Itulah bezanya "runtime".

So aku boleh reuse behavior tu kepada mana-mana object yang perlu. Ambil contoh mudah

Manusia (Person) ada Nama Rasmi dan Nama panggilan, so aku ada satu satu behaviour yang cantumkan nama rasmi dan nama panggilan untuk return string. Jadi behaviour tu aku boleh pakai re-use kembali pada mana-mana object yang mempunyai structure contract yang sama. Orang yang biasa dgn OOP maybe dah terbayang untuk membuat satu interface dan ada class yang implement tapi bagi aku yang macam nie susah. Aku inginkan cara yang lebih mudah dan fluent.


class Orang
{
string Nama;
string Panggilan;
}

class Kereta
{
string Name
string Code
string Panggilan;
}

Maybe ada suggestion untuk buat interface dan setiap object tu implement interface, tapi bagi aku cara nie panjang macam code kat bawah ni.

interface Cantum
{
string CantumNamaPanggilan(string name,string panggilan);
}

class Orang :Cantum
{
string CantumNamaPanggilan(string name,string panggilan)
{
///
}
}

class Kereta : Cantum
{
string CantumNamaPanggilan(string name,string panggilan)
{
///
}
}

Dan mungkin ada yang suruh letak implementation dalam abstract class, cuma bagi aku limitation class hanya boleh extend pada satu abstract class, kalau ada bnyk behavior takan nak letak semua dalam abstract class tu. Ada cara lain tak yang aku tak nampak sebelum aku bagi cara yang aku cuba nak buat (belum diuji tahan peluru dan api :)?

Sunday, October 31, 2010

Domain design, reuse and readable code

Aku plan nak invite rakan-rakan developer/solution/programmer etc yang berminat untuk bincang berkaitan domain design, re-useable dan readable code. Harap dapat sambutan dari pelbagai camp sama ada .Net C#, Java, Groovy, Python, Ruby, PHP.

Ok aku terangkan apa challenge project nie. Bina satu console application berdasarkan problem statement ini.

"Bina aplikasi yang dapat manage sesuatu Project dimana setiap project tersebut boleh mempunyai banyak task dan completion date/time task tersebut bergantung pada task-task yang yang ada dibawahnya. Task boleh mempunyai banyak task yang lain (child) atau juga dikenali sebagai aktivity. Compute the earliest start of every
activity given the start of the project. Setiap task ada estimation time"

Criterianya ialah
1. design yang flexible yang boleh digunakan, kemungkinan untuk any application yang hampir serupa processnya.

2. LOC yang pendek, code mudah dibaca, jika boleh system analyst/tester boleh semak pada first level tanpa perlu tulis test code.

3. Code yang boleh reuse

Ada sesiapa yang ingin mencuba?

Thursday, September 30, 2010

Idea kelebihan/bakat atau kesungguhan

Kebelakangan ini aku sering terfikir mencari sesuatu "benda" yang aku boleh buat berdasarkan kemahiran ilmu teknologi yang diberikan Allah pada aku. Tapi masih buntu. So disekeliling kita hari ini penuh dengan teknologi sama ada datang dari barat atau datang dari kelompok masyarakat kita. Penghasilan teknologi pun datang dari secebis idea yang dikembangkan dan kemudian menjadi realiti .Aku pernah terdengar yang kebanyakkan manusia hanya mengguna 10% dari kebolehan otak/akal yang Allah bagi pada kita. Lagi 90% masih tersimpan di cell-cell otak yang belum dirangsang.

Kalau kita dapat menggunakan atau meningkatkan penggunaan kelebihan tersebut kepada 20%, banyak idea yang kreatif boleh dibangunkan. Aku juga tak pasti adakah faktor bahasa mempengaruhi tahap idea seseorang? Orang yang kreatif yang banyak idea, otak kanan banyak memainkan peranan.

Wednesday, September 29, 2010

Versi mudah mendapatkan NHibernate session

Aku boleh dikategori sebagai developer yang percaya pada code mesti nampak mudah dari penglihatan dan mudah untuk ditulis dan kemudian mudah untuk difahami. Kenkadang aku terfikir kenapa perlu membina sesuatu yang komplex sekadar untuk nampak cantik dan tujuan tersebut boleh dicapai dengan cara lain walau tak se "stylish". Walau pun fungsi tersebut dibina didalam ertikata "framework", tetapi jika over engineered mengkibatkan framework tersebut susah untuk di extends untuk fungsi-fungsi yang lain. Aku ada rancangan nak tulis dalam entri yang lain berkaitan pendahaluan perenggan ini , kemungkinan bertajuk "Business logic algorithm tidak sepatutnya berselerak dimerata tempat dalam solution project anda", agak penjang rasanya tajuk tersebut. Ok anyway, kesinambungan dari itu aku nak cerita sedikit pasal pengawalan session didalam NHibernate dalam versi yang mudah.

NHibernate session amat penting apabila kita hendak melakukan sesuatu aktiviti berkaitan data dan objek.Objek dan data adalah dua benda yang berlainan walau nampak seakan sama. Boleh google untuk tahu perbezaan.

Untuk demo, aku akan tulis code yang akan digunakan didalam projek ASP.Net MVC. Ada 2 library penting yang diperlukan yang pertama library pakej NHibernate dan yang kedua library pakej FluentNHibernate. Tiada IoC dalam contoh ini, ini adalah bertujuan menunjukkan tanpa IoC, tujuan untuk mendapatkan NHibernate session tetap boleh dilakukan.

Sebaik anda berjaya create ASP.Net MVC Web solution, dan andaian bahawa semua library pakej tadi dah berjaya dimasukkan didalam solution tersebut, maka perkara yang pertama ialah dengan mengedit Global.asax.cs dan code akhirnya ialah seperti ini


Perhatikan pada line 21, aku declare ISessionFactory dan kemudian pada line 42 aku panggil method CreateSessionFactory(), code ini berada didalam method Application_Start, dan untuk pengetahuan Application_Start ini akan hanya execute sekali ianya seperti Singleton pattern, ianya hanya akan execute semula jika IIS web server di "restart" dan oleh sebab itu penghasilan SessionFactory sesuai berada didalam method ini.

Pada line 68, disini aku menggunakan FluentNHibernate untuk membina SessionFactory, dan pada line 72, kena tulis connection string dan maklumat tersebut di simpan didalam Web.config. Ini untuk memudahkan jika ada sebarang pertukaran, anda hanya perlu tukar di config file dan bukan didalam code. Lihat pula pada line 82, kita perlu setkan session tersebut digunakan dalam web process dan NHibernate ada mekanisma untuk simpan session yang akan digunakan dalam Http protokol.

Selanjutnya pada line 50, method Application_BeginRequest ini pula akan berfungsi hanya setiap kali terdapat page request dan ianya unik untuk setiap request. Dalam ertikata yang lain jika aku request dan pada masa yang sama terdapat sepuluh orang lain yang request aku akan dapat dapat session nhibernate yang berlainan dan unik tetapi SessionFactory yang sama. Pada line 54, kita perlu bind session kepada CurrentSessionContext dan berdasarkan configuration iaitu Web, maka NHibernate akan menggunakan web session mekanisma untuk simpan maklumat session yang telah di "open" maka apabila diperlukan pada component yang lain permintaan session tersebut akan di beri kepada peminta tersebut ialah session yang di simpan didalam web context.

Perhatikan pula pada line 57, method Application_EndRequest pula bertindak untuk tutup session dan membebaskan memory web context terhadap session seperti yang berlaku padal line 59.

Satu lagi method yang penting ialah GetCurrentSession yang terdapat pada line 45, method ini bertujuan untuk mendapatkan Session terkini yang berada dalam web context.

Penggunaan di Controller
Aku akan tulis base controller untuk semua controller lain inherits base controller ini.


Dan anda perlulah mempunyai domain, permulaan ini boleh tulis domain yang simple seperti ini


Untuk perhatian anda, line 27 untuk code diatas ialah class mapping, sebelum ini mapping dalam Nhibernate boleh dibuat melalui xml mapping dan juga code attribute mapping, tetapi 2 cara ini agak susah dan leceh berbanding dengan cara fluentnhibernate.

Code ini pula ialah code StudentController, lihat bagaimana mudah untuk menggunakan NHibernate Session


So diharap sedikit penerangan dapat membuka minda dan boleh menjadi pengerak untuk anda menggunakan NHibernate untuk project-project yang lain. InsyAllah jika diberi keizinan Allah saya akan lanjutkan lagi demo/contoh penggunaan NHibernate untuk tahap yang lagi advance.




Tuesday, September 21, 2010

UI ke Business Process - 60% project lewat

UI masih lagi menjadi masalah utama kalau tidak pada developer lain tapi pada diri aku sendiri. Walau ada pelbagai framework yang dikategorikan sebagai Rapid Applicaton Development, tapi aku masih lagi mengambil masa yang lama untuk membolehkan UI code work dengan back end code dgn lancar.Nie bukan bermaksud UI design tetapi lebih kepada UI funcionality, bagaimana UI kawal state dan sebagainya. Kalau setakat untuk look and feel memang tidak dinafikan banyak UI framework yang lain hasilkan look and feel yang awesome. Itu dari sudut layout dan color. Dari sudut application developer, anda masih lagi perlu menyentuh UI code setidak-tidaknya untuk sesuatu event itu trigger dari tindakan user, seperti click button untuk hantar maklumat ke database. Cuma jika fully plain html form, rasanya kurang sedikit masalah-masalah ini.


Kepopularan Ajax pun tidak banyak membantu, kenkadang lebih membebankan dgn ketiadaan IDE yang betul-betul WYSIWYG.

So apabila tiba pada level nak menghubungkan code-code ini ke business logic, pengalaman aku memang akan ada sedikit rintangan.

Aku tak berapa sure dari camp Ruby atau any Rails followers yang lain seperti grails etc. Masih lagi mencari UI framework yang seperti ASP.Net yang laju dari segi development dan laju dari segi performance loading.

Dicussion/pandangan aku dari context enterprise/product bukan pet project suka-suka, but something yang anda boleh jual dan customer boleh terima dari segi penampilan dan juga dari segi core business process.

Monday, September 20, 2010

Update

Kebelakangan nie sifat malas nak update web page nie semakin menjadi-jadi, kenkangan kerja dan sebagainya menjadi halangan kuat dan kekurangan idea, maybe otak kanan aku tak digunakan sepenuhnya untuk lebih kreatif.., sudah lebih 2 bulan aku tak menulis dalam blog.


Minggu lepas selepas seminggu cuti hari raya, aku mula bekerja tanpa kawan rapat aku, dimana selama lebih kurang 3 tahun banyak membantu dalam melicinkan proses soft dev di tempat kerja, seorang yang aku respect dari segi knowledge dan juga komitmen. InsyAllah semoga perpindahan ketempat lain lebih bermakna dan keberkatan Allah sentiasa ada bersama.

Walau kerja banyak tapi, masih slow bila nak mula buat soft dev, ntah le..hujung minggu lepas aku plan nak buat something berkaitan programming, tak juga menjadi, aku lebih bnyk browse web site kereta, agaknya minat aku dah kearah bidang kerata.. hahahah, minggu lpeas juga aku hantar kereta elysion aku tukar minyak, fikirkan nak tukar minyak fully synthetic biasa, sekali dah pergi kat After 12 Motorsport, mata dah rambang tgk bnyk sgt acessories kereta, pusing punya pusing..technician kat situ cucuk jarum ..suruh aku tukar minyak engine Mugen, aku pun memang dah ada plan nak tukar minyak, cuma minyak nie mahal sikit. Belakang kedai lagi satu tgk bebrapa technician tgh tune VW Golf GTI, perghh..dia nyer bunyi engine.. mak oii. Fikir punya fikir last last aku setuju tukar minyak engine mugen tu. Then dah beberapa hari pakai, Alhamdulillah terasa lagi lancar bila memecut yang best bila RPM cecah 3.5.. ivtec dia open ...warghh..

Malam tadi, dapat video VW Scirocco dari youtube, nie lagi satu penyakit.. aku dah terpaku depan komputer 2 jam, layan semua video Scirocco TSI Turbo.., bila kau nak start buat programming??????????? :(


Wednesday, July 07, 2010

DNC & DCI ?







Monday, May 31, 2010

OCP dan Double Dispatch

Salam ILuvIslam

Salah satu kerja yang aku kena buat ialah mencantikkan code. Aku nak shortcut terus kepada point. Code dibawah ada 2 version satu code yang tidak menggunakan OCP dan Double Dispatch, manakala yang satu lagi menggunakan cara yang aku mention.

Sebelum tu aku malas sikit nak beri penerangan OCP (Open Close Principle) dan Double Dispatch boleh search je.. InsyAllah banyak penerangan yang bagus. Cuma akau nak terangkan ialah jika aku tak guna cara OCP dan double dispatch code aku akan menjadi bloated macam ikan kembung.

Kali nie aku kena record transaction sama ada transaction tersebut ialah transaction cash atau cheque atau balance transfer atau atau atau. So atau atau atau lagi tu bermaksud ada kemungkinan lain penambahan jenis transaction. Setakat sebelum 1Malaysia bankrap ada 3 atau 4 transaction yang perlu di rekodkan.

Oleh kerana ada pelbagai transaction, maka user kata mereka hendak tahu total setiap amount apabila transaction itu berlaku di branch dan juga total amount harian untuk setiap transaction. So dengan yakin dan bergaya aku tulis code macam kat bawah nie.





Masalah disedari apabila user bagi tahu 1Malaysia dah bankrap, so ada penambahan transaction yang perlu direkodkan, seperti transaction LPO etc.

So jika dilihat pada code aku kena tambah AddReloadLPO(decimal amount). Ini bermakna aku kena buka file code yang diatas dan tambah, begitu juga pada code class BranchDailyReload aku kena tambah if else pada line 39 AddBranchDailyReload(...).

So macam maner aku tak nak ada penambahan code apada existing class dan juga penambahan if else lagi. Caranya ialah dengan menggunakan OCP dan double dispatch.

Aku refactor class jadi macam nie



Then aku kena tambah interface IReloadOCP dan class yang akan implement, sebagai contoh ReloadCash



Manakala class BranchDailyReload akan berubah menjadi simple macam nie, tiada lagi penggunaan if else, walaupun contoh BranchDailyReload tak follow OCP tetapi penggunaan function lebih explicit. Tiada masalah untuk refactor BranchDailyReload untuk buat fully OCP



Sesiapa ada lagi idea yang lagi okay, silakan.. nak kena submit kat lecturer :)

Thursday, May 27, 2010

Data,Context and Interaction

Salam 1Malaysiaaaaaaaaaaaaaaaaaaaaaaaaaa

Minggu lepas semasa membaca mailing list Domain Driven Design, salah seorang ahli group DDD (http://www.jroller.com/rickard/), bercerita serba sedikit tentang DCI . Aku tertarik dengan penerangan beliau dan cuba explore lebih detail, tetapi masih lagi kabur. So aku decide untuk buat code nak compare cara dalam DCI dengan cara yang aku biasa buat.

Tuesday, March 30, 2010

Pilihan untuk kemahiran

Pemilihan language,tools dan methodology/process sama seperti cara untuk buat pilihan pembelian hartanah (rumah/bangunan/tanah), jika pilihan anda tepat dan kena pada masa, insyAllah berbaloi-baloi.

Pemilihan dalam ertikata untuk anda betul-betul mahirkan diri dengan sesuatu yang dipilih, tetapi anda digalkkan untuk mengambil tahu secara asas saingan-saingan yang lain. Anda tidak pelulah terlalu ekstrim dengan sesuatu yang dipilih, tetapi perlulah mempunyai sikap terbuka dalam menerima kritikan terhadap sesuatu yang menjadi pilihan dalam kehidupan software developer.

Memilih untuk mahir sesuatu perkara adalah lebih bagus dari tahu semua benda tapi tiada kemahiran. Memang anda digalakkan untuk sentiasa mempunyai sikap ingin tahu, tapi dari segala keperluan dalam software developement pilihlah 1,2 atau 3 perkara yang anda betul2 mahir - timur barat utara dan selatan.

Untuk aku pula pada masa ini aku invest(masa dan tenaga) untuk mendapat skill dalam 3 perkara. Pemilihan aku ialah mahirkan Domain Driven Design, fahami NHibernate/FluentNhibernate dan juga C# .Net

So bila aku buat target apa yang menjadi keutamaan aku dalam software development aku akan beri tumpuan kepada ketiga-tiga perkara diatas. Jika orang bertanya aku tentang T-SQL aku sekadar boleh beri pendapat tetapi bukan sebagai best practices begitu juga bila ditanya tentang testing framework/approach aku juga boleh bercerita permukaan tetapi tidak mendalam.

Maka pada aku keperluan untuk setkan target dan keutamaan apabila memilih pelbagai technology adalah sama seperti cara apabila hendak buat pembelian hartanah. Buat survey dan research supaya pilihan anda tepat.