找回密码
 立即注册
首页 业界区 业界 循证架构--寻找最适合自己的架构

循证架构--寻找最适合自己的架构

连热 2025-5-29 20:32:39
没有最好的架构,只有最合适的架构。循证架构是《Expert One-on-One J2EE Development without EJB》一书中推崇的架构思路,用俺们的话说就是摸着石头过河,找最适合自己的架构。
俺现在soho,大活不多,小活不断。我的工作具备以下特点:
(1) 根本没摸清楚需求的时间。需求都是从原型到Demo到版本1到版本2探索出来的。经常需求变化非常大,因此,必须以敏捷方法为基础;
(2) 一般没多少数据需要存储,顶多百万级;
(3) 需要极度的压榨开发效率。一个工作,10天完成和20天完成,那收益前者就是后者的两倍。
在上面(1)-(3)驱动下,俺摸索出的架构见下图:
1.png

从下往上,简单说说:
(1) 数据库:db4o。谁用谁知道,哈哈,爽。什么ORM,SQL,DataSet,统统是过眼云烟了。一切都是普通对象。数据库几乎是0设计。数据接入也非常非常的简单。
(2) Db4o之上得有一个逻辑层,来应付需求变化。这一层主要就是各种实体对象,需要良好的设计,否则,应付不了需求的变化。这一块我一般要设计比较完备的event体系,便于后期修改与组合。
(3) 服务层:主要是RIA应用需要。如果是Winform程序,不用这一层。
(4) UI逻辑层:最开始没弄这一层,最后鉴于在界面那一块太耗时间,就加了这么一层。这一层主要是:
a) 对于单个控件,将控件的常用操作逻辑封装成扩展方法;
例子: Winform程序中的Invoke方法使用起来很烦人,涉及到多个线程,还要判断多次 IsHandleCreated == true(经常忘记,导致bug)。于是,需要将它封装成扩展方法。
代码如下:
2.gif
3.gif
Code
4.gif
    public class ControlFuncContext
5.gif
6.gif
    
7.png
{
8.gif
9.gif
        public Control Control 
10.png
{ get; private set; }
11.gif
12.gif
        public Delegate Delegate 
13.png
{ get; private set; }
14.gif

15.gif
        public ControlFuncContext(Control ctl, Delegate d)
16.gif
17.gif
        
18.png
{
19.gif
            this.Control = ctl;
20.gif
            this.Delegate = d;
21.gif
        }
22.gif

23.gif
        public void Invoke0()
24.gif
25.gif
        
26.png
{
27.gif
            if (Control.IsHandleCreated == true)
28.gif
29.gif
            
30.png
{
31.gif
                Delegate.DynamicInvoke();
32.gif
            }
33.gif
        }
34.gif

35.gif
        public void Invoke1(T obj)
36.gif
37.gif
        
38.png
{
39.gif
            if (Control.IsHandleCreated == true)
40.gif
41.gif
            
42.png
{
43.gif
                Delegate.DynamicInvoke(obj);
44.gif
            }
45.gif
        }
46.gif

47.gif
        public void Invoke2(T0 obj0, T1 obj1)
48.gif
49.gif
        
50.png
{
51.gif
            if (Control.IsHandleCreated == true)
52.gif
53.gif
            
54.png
{
55.gif
                Delegate.DynamicInvoke(obj0, obj1);
56.gif
            }
57.gif
        }
58.gif
    }
59.gif

60.gif
    public static class FormClassHelper
61.gif
62.gif
    
63.png
{
64.gif
        public static void InvokeFunc0(this Control ctl, Func0 func0)
65.gif
66.gif
        
67.png
{
68.gif
            if (ctl.IsHandleCreated == true)
69.gif
70.gif
            
71.png
{
72.gif
                ControlFuncContext fc = new ControlFuncContext(ctl, func0);
73.gif
                ctl.Invoke(new Func0(fc.Invoke0));
74.gif
            }
75.gif
        }
76.gif

77.gif
        public static void InvokeFunc1(this Control ctl, Func1 func1, T obj)
78.gif
79.gif
        
80.png
{
81.gif
            if (ctl.IsHandleCreated == true)
82.gif
83.gif
            
84.png
{
85.gif
                ControlFuncContext fc = new ControlFuncContext(ctl, func1);
86.gif
                ctl.Invoke(new Func1(fc.Invoke1), obj);
87.gif
            }
88.gif
        }
89.gif

90.gif
        public static void InvokeFunc2(this Control ctl, Func2 func2, T0 obj0, T1 obj1)
91.gif
92.gif
        
93.png
{
94.gif
            if (ctl.IsHandleCreated == true)
95.gif
96.gif
            
97.png
{
98.gif
                ControlFuncContext fc = new ControlFuncContext(ctl, func2);
99.gif
                ctl.Invoke(new Func2(fc.Invoke2), obj0, obj1);
100.gif
            }
101.gif
        }
102.gif
    } 

b) 对于多个控件,使用Mediator模式,将多个控件之间的组合抽象出Mediator类,方便重用。这一点我最开始是用户控件方式进行封装,结果发现太不灵活,最后改用Mediator,再配合扩展方法,开发速度biubiubiu的就上去了。
(5) UI:Html是万恶之源,能不用就不用。可以选择的话,我主要用Winform, Flex,SL作为前端。纯Web开发是不碰了(市面上做Web开发的太多,不趟这个混水了)。
以上架构,视项目而定。如果项目的数据部分比较关键,我现在还是保守的在用关系数据库。虽然db4o已经那么多年了,还是得保守一点用。
如果能完全按上面五点去做,那开发简直和在空中飞翔一样爽。
btw. 如果一切都OO起来,写程序真是享受,象写诗一样……
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册