CQRS:CQRS + DDD + MDP 實現快速應用程序開發


背景

企業需要“快速的”和“高質量的”交付應用,采用傳統的三層架構+數據驅動開發可以帶來快速交付,但是高質量視乎無從保證,這篇文章我談談我准備如何應對這種需求。

思路

CQRS + DDD + MDP(元數據驅動編程)

看圖解說

從讀和寫的角度思考一些問題。

    1. UI層的編碼量占據了整體的50%-80%(我自己的經驗)之間。
    2. UI層的主要目的是展示,即讀取。
    3. UI層團隊的開發人數比例不符合他們的編碼量(企業應該加大對UI層人才的投資和引進)。
    4. UI層團隊的編碼水平相對較差(我自己的經驗,我見過好的UI人員,月薪2W)。
    5. UI層在代碼級別相對容易抽象和重用(企業應用)。
    6. UI是用戶關注的重點。
    7. 寫操作是實現讀取的前提,(數據不寫進去,無從讀取)。
    8. 寫操作是驅動業務流程的核心所在(業務模型的核心)。
    9. 寫操作在代碼級別不容易重用,在概念級別更加容易重用。

鑒於上邊的9條現狀,我決定采用如下開發模式。

    1. 整體系統采用CQRS架構。
    2. 使用MDP開發Q(讀取),保證快速。
    3. 使用DDD開發C(寫端),保證高質量。

簡單的示例

效果圖

Grid.js

 1 Ext.define('Demo.user.view.Grid', {
 2     extend: 'Happy.grid.Panel',
 3     alias: 'widget.user_grid',
 4     requires: [
 5         'Demo.user.metadata.Manager',
 6         'Demo.user.view.Form',
 7         'Happy.grid.action.Refresh',
 8         'Happy.grid.action.Edit'
 9     ],
10 
11     title: 'user grid',
12 
13     initComponent: function () {
14         var me = this;
15 
16         me.initTbar();
17 
18         me.callParent(arguments);
19     },
20 
21     initTbar: function () {
22         var me = this;
23 
24         me.tbar = [
25             Ext.create('Happy.grid.action.Refresh'),
26             Ext.create('Happy.grid.action.Edit', {
27                 formContainer: function () {
28                     return Ext.widget('window', {
29                         title: 'user form',
30                         items: {
31                             xtype: 'user_form'
32                         }
33                     });
34                 }
35             })
36         ];
37     },
38 
39     getMetadataManager: function () {
40         var me = this;
41 
42         return Demo.user.metadata.Manager;
43     }
44 });

Form.js

 1 Ext.define('Demo.user.view.Form', {
 2     extend: 'Happy.form.Panel',
 3     alias: 'widget.user_form',
 4     requires: [
 5         'Demo.user.metadata.Manager',
 6         'Happy.form.action.Close',
 7         'Happy.form.action.Save'
 8     ],
 9 
10     width: 500,
11 
12     initComponent: function () {
13         var me = this;
14 
15         me.initButtons();
16 
17         me.callParent(arguments);
18     },
19 
20     initButtons: function () {
21         var me = this;
22 
23         me.buttons = [
24             Ext.create('Happy.form.action.Save'),
25             Ext.create('Happy.form.action.Close')
26         ];
27     },
28 
29     getMetadataManager: function () {
30         var me = this;
31 
32         return Demo.user.metadata.Manager;
33     }
34 });

備注

我相信企業應用中UI層的編程可以趨於聲明式,聲明式本身就是一種元編程模式。不過有一點是需要注意的,本文說的這些概念,不足以真正實現快速的和高質量的產品開發,因為實現這個目的還依賴很多相關因素,如:團隊、文化和組織。

相關文章:元數據驅動界面,支持三級配置(生成期、運行期和開發期)。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM