বৃহস্পতিবার, ২০ ফেব্রুয়ারী, ২০১৪

Refactor MVC Music Store Application (An Introduction of DDD- Part-01)

আমরা যেহেতু আমাদের MVC Music Store application টি সম্পূর্ণরূপে Domain Driven Design(DDD) approach follow করে refactor করবো সেহেতু আমরা শুরুতে Domain Driven Design সম্পর্কে স্বল্প পরিসরে আলোচনা করবো-

        What is Domain Driven Design (DDD)?

    • Domain-Driven Design (DDD) একটি development philosophy যাহা Eric Evans তার Domain-Driven Design: Tackling Complexity in the Heart of Software বইতে define করেছেন।
    • DDD মূলত একটি software development approach যাহা complex large scale এর software সমূহ manage করার জন্য design করা হয়েছে।  
    • DDD approachDomain model কে core business concept এর সাথে deeply connecting এর মাধ্যমে complex problem সমূহ handle করা হয় আর এভাবে কোন Software develop করলে উক্ত Softwareটি Domain এর reflection হয়ে যায়।
উপরোক্ত definition Domain, Model, Domain Model কতিপয় buzz word use করা হয়েছে।
এখন আমরা উপরোক্ত buzz word সমূহ সম্পর্কে আলোচনা করবো।
What is a Domain?
যেই field এর জন্য software develop করা হবে উহাই Domain. অন্যভাবে বলা যায় real world এর যেকোনো কিছু যাহার উপর user program apply করে উহাই Software এর Domain.

What is a Model?
একটি abstraction system যাহা একটি domain এর selected aspect সমূহ describe করে এবং domain related problem সমূহ solve করতে use হয়।
Model সম্পর্কে details জানার জন্য আমরা নীচের example টি দেখি-
Employee class একটি model  যাহা programmatically  একজন real employee কে represent করবে। এক্ষেত্রে একটি model একজন real employee এর সকল কিছু capture না ও করতে পারে। ইহা শুধুমাত্র ততটুকুই capture করবে যতটুকু current context এর জন্য প্রয়োজন।
Same thing এর জন্য এক এক  domain এ এক এক ভাবে (আলাদা রকমের)  model create করা যায়। এই ক্ষেত্রে model creation completely উক্ত domain এর necessity এর উপর নির্ভরশীল। উদাহরন স্বরূপ Salary department Human Resource department একই Employee একই Employee এর model আলাদা রকম ভাবে create করতে পারে।

What is a Domain Model?
একটি specific domain এর জন্য যে model define করা হয় উহাই domain model.

Domain Driven Design এ একটি shared language creationfocus করা হয় যাহা Ubiquitous Language নামে পরিচিত। ইহার মাধ্যমে efficiently effectively domain problem সমূহ describe করা হয়। এখন আমরা Ubiquitous Language সম্পর্কে বিশদ আলোচনা করবো-
               
Ubiquitous Language:
Developer business people দের language ভিন্ন ধরণের হয়। তারা যদিও একই language use করে কথা বলে তথাপি তাদের কথার meaning ক্ষেত্র বিশেষে পুরোপুরি ভিন্ন হয়। Developer গন naturally technical হয় এবং তারা অভ্যাস বসত কথার মাঝে technical term সমূহ ব্যবহার করে যাহা অনেকক্ষেত্রেই Domain expert দের কাছে বোধগম্য নয়।
এই ধরণের সমস্যাবলী এড়ানোর জন্য Ubiquitous Language(UL) introduce করা হয়েছে।
DDD তে Ubiquitous Language মূলত Domain Expertstechnical guys দের জন্য একটি negotiated common language যাহা ব্যবহার করে উভয়ে same thing properly বুঝতে সক্ষম হয়। Ubiquitous Language মূলত business terminology based হয় এবং এক্ষেত্রে technical terminology avoid করা হয়।
Ubiquitous Language এর ক্ষেত্রে Domain expert lead দেন এবং technical people উহা follow করেন। কোন একটি Domain এর Ubiquitous language উন্নতির জন্য কয়েক সপ্তাহ থেক কয়েক মাস ও লেগে যেতে পারে। যত দিন যাবে তত ইহা refine হতে থাকবে।
Ubiquitous Language(UL) এর ক্ষেত্রে একটি ব্যপার খেয়াল রাখতে হবে তা হল Domain Expert User গন যেভাবে তাদের business concept সমূহ  explain করেন চেষ্টা করতে হবে সেভাবেই তাদের language এ উহা fit করতে।
Some example of Ubiquitous Language:
Ubiquitous Language সঠিক ভাবে বোঝার জন্য আমরা নিন্মে দুটি wrong correct example দেখব-
Example 01:
এই Example এ আমরা real life perspective WrongCorrect Ubiquitous Language কি রকম হতে পারে তা দেখব-

 

Wrong Language:


ছোট bed room সমূহের length width ratio 4:3 হবে।

Correct Language:

Children's bed room সমূহের length হবে 20 ft এবং width হবে 15 ft
Note: Building এর owner এর কাছে ছোট bed room, ratio ইত্যাদি technical term হতে পারে যাহা তার জন্য বুঝতে সমস্যা হতে পারে তাই যদি children's room, guest room, living room etc ব্যবহার করা হয় তবে সে খুব সহজেই বুঝতে পারবে।
এছাড়া ratio অনুযায়ী হিসাব এর থেকে explicit measurement তার জন্য খুবই meaningful হবে।


Example 02:
এই Example এ আমরা software perspective WrongCorrect Ubiquitous Language কি রকম হতে পারে তা দেখব-

Wrong language:

Search more relevant করার জন্য আমরা search functionalityতে sql server এর inflectional thesaurus feature consider করব। এছাড়া search more accurate করার জন্য stop word সমূহ exclude করে দেব।
যেহেতু অনেক ক্ষেত্রেই আমাদের domain expert একজন technical person না ও হতে পারেন সেক্ষেত্রে তার কাছে “Inflectional”, “Thesaurus”, “Stop word” ইত্যাদি শব্দ সমূহ বুঝতে সমস্যা হবে।

Correct language:

Search functionality তে আমরা search phrase এর synonyms সমূহ consider করবো যাহাতে searching এর সময় relevant results সমূহও exclude না হয়। এছাড়া আমরা search word সমুহকে ইহার number (singular বা plural), tense, participle etc দ্বারা differentiate করবো না ফলে result আরও accurate হবে। আমরা যেকোনো ধরণের noise words সমূহ search perspectiveএ যাহাদের কোন value নাই এই রকম word সমূহ আমরা ignore করব। “am”, “but”, “where”, “about” ইত্যাদি এই ধরণের noise word হতে পারে।
উপরোক্ত Example দ্বয় থেকে আমরা দেখতে পাই যে correct language এর মাধ্যমে Technical team domain experts গন খুব সহজেই same way তে একটি ব্যপার চিন্তা করতে ও বুঝতে পারেন।

বুধবার, ১৯ ফেব্রুয়ারী, ২০১৪

Refactor MVC Music Store Application

Dear All
Good day. I have decided to refactor MVC Music Store application in Asp.net MVC-5 with AngularJs. I shall refactor entire application by following Domain Driven Design (DDD) approach and make it Single Page Application(SPA) with AngularJS

I shall publish each step of my development in this site as tutorial and you will be able to get entire refactored code from https://github.com/mojamcpds/Music-Store-Application-With-AngularJS
after published the post.

I shall complete my series as follows:
1).  A brief overview of Domain Driven Design (DDD)
2). Introduction to Asp.Net MVC
3). A Basic guide to AngularJs

After discussing above I shall start refactor my code and explain each steps.

Hope everyone's help

Thanks and best regards
Md. Mojammel Haque

সোমবার, ২০ জানুয়ারী, ২০১৪

Single Page Application with CQRS-ES Architecture

Dear All
I have decided to create a single page application with CQRS-ES Architecture. In first step I completed CQRS-ES Architecture and published in Github.

You can download the Architecture from
https://github.com/mojamcpds/CQRSES-SPA

I used Asp.net MVC, MS SQL Server, Entity Framework

For Single page Application I shall work with
AngularJS
Twitter Bootstrap (For design purpose).


Hope everyone's cooperation

Thanks.

বুধবার, ২০ নভেম্বর, ২০১৩

Command Query Responsibility Segregation (CQRS)

  • CQRS Øviv †evSvq Command Query Responsibility Segregation
  •  A‡b‡KB g‡b K‡ib CQRS GKwU architecture.
  •  wKš‘ bv |
  • CQRS GKwU simple pattern hvnv architecture G A‡bK opportunities enable K‡i|
  •  Greg Young Ges Udi Dahan me©cÖ_g GB pattern introduce K‡ib| 
  • CQRS G command side I query side Gi method mg~n separate object G ivLv nq A_©vr command side Gi Rb¨ GKwU object Ges query side Gi Rb¨ Av‡iKwU object _vK‡e | 
  •  cÖkœ n‡jv command I query wK?
o   Command side:  †h mKj method mg~n object wKsev entire system Gi state change K‡i ZvnvB Command side method.  Save(), Update(), Delete() etc. Command side method Kvib Bnv‡`i Øviv object Gi state change Kiv nq|
o   Query side: †h mKj method mg~n Øviv ïaygvÎ results  return  Kiv‡bv nq Ges Dnv‡`i Øviv object wKsev entire system Gi state Gi †Kvb change nq bv Zvnviv Query side method. Get(), GetById() etc. Query side method Kvib Bnv‡`i Øviv ïaygvÎ results  return Kiv‡bv nq Ges object Gi state Gi †Kvb change nq bv|
  • mvavibZt Avgv‡`i Transactiona Class definition wb¤œiƒc nq-
EmployeeDataAccess
SaveEmployee(Employee employee)
UpdateEmployee(Employee employee)
DeleteEmployee(int employeeId)
PopulateEmployee()
PopulateEmployeeById(int employeeId)
  •  CQRS Pattern Abyhvqx  Dc‡iv³ EmployeeDataAccess class wU‡K Dnvi method mg~‡ni responsibility Abyhvqx  †f‡½ `yBwU fv‡M fvM Kiv n‡e-
  • Command Side Gi Rb¨ EmployeeCommandDataAccess  class hvnv wb‡¤œv³ method mg~n contain Ki‡e-
EmployeeCommandDataAccess 
SaveEmployee(Employee employee)
UpdateEmployee(Employee employee)
DeleteEmployee(int employeeId)
  •  Query Side Gi Rb¨ EmployeeQueryDataAccess  class hvnv wb‡¤œv³ method mg~n contain Ki‡e-
PopulateEmployee()
PopulateEmployeeById(int employeeId)
  • BnvB CQRS pattern.