认识软件框架的设计原则-- 变与不变分离,创造简美之序_设计原则认识软件框架的设计原则-- 变与不变分离,创造简美之序_基本原则_02

ee                                                                        ee

欢迎访问 ==>高老师的博客网页

高焕堂:MISOO(大数据.大思考)联盟.台北中心和东京(日本)分社.总教练


EE                                                                        EE

认识软件框架(Framework)的设计原则

n变与不变分离,创造简美之序(Order)

by高煥堂2013/10/13


变与不变的分离(Separatecodethatchangesfromthecodethatdoesn’t)是设计应用和平台框架之基本原则和手艺。大文豪苏东坡在其赤壁赋中写道:「盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎?」。其说明了,人们可兼具多种观点,可同时看出同一个系统中的变与不变之相貌。大科学家爱因斯坦在其相对论里也告诉我们:表面上看来相对的外貌下,可能蕴藏着不变的特性。例如,物质与能量从外貌看来是相对的(即变的),但其背后蕴含着某种不变。虽然苏东坡和爱因斯坦所观察的对象都是自然物,而不是像软件、桌子、车子等人造物;但是在人们心灵深处,其心智的运用是一致的,当我们观察人造物而能区分出变与不变的部份时,就能将之分离开来,而获得优越之设计。

完美的变与不变分离,得到完美的接口(Interface),替将来强龙与地头蛇双方智慧的完美结合,建立了美好的基础。接口是一种规范(Specification),表达两种事物(或智慧)之间互相沟通、接合的一种共识(Agreement)。例如十字路口的「红绿灯与斑马线」,就是行人与汽车双方的接口;当此接口发挥其权威时,整个社会呈现出井然有「序」(Order);反之,当接口失去权威时,整体系统就可能发生「失序」的状态了。简而言之,框架设计之原则,不外乎三个焦点:

l----即简单之序,或有机次序(Order)

l----以序来包容(Accommodate),有容乃大。

l----复杂多变(Change),无尽繁荣。


包容繁杂多变是一件美的表现。序(即接口)是手段,包容繁杂才是(框架设计的)目标。序呈现美,繁杂带来活泼之力。易经干卦:天的多变。坤挂:大地的繁杂。唯有多变和繁(即复杂)荣,才孕育出多采多姿的大自然。繁杂本身是好事,是生命力的表现。无论是.NETAndroid的框架之美都来自于:包容复杂而呈现简单的序,支持无尽繁荣。

因之,接口设计是缔造系统整合架构之美的基础;也是框架设计的核心。例如,.NET框架里提供了一个IEnumeraor接口。强龙将易变部份抽离了,而得到上图里的接口,成为框架里的主要元素。强龙推出.NET框架之后,全球各区域的地头蛇就能将其各自善变的部份,结合到框架里。例如,地头蛇撰写AP,以C#代码表示如下:


classmyAP{

//………

int[]values=newint[]{1,2,3,4,5};

IEnumeratore=(IEnumerable)values).GetEnumerator();

while(e.MoveNext()){

Console.Write(e.Current.ToString()+"");

}

//………

}


其中,呈现了:

序:IEnumerator

变:values

再如,.NET框架里所供的StreamFactory基类:


publicclassabstractclassStreamFactory{

publicStreamCreateStream();

//……..

}


强龙推出.NET框架之后,全球各区域的地头蛇就能将其各自善变的部份,结合到框架里。例如,地头蛇撰写应用子类如下:


publicclassmyStreamFactory:StreamFactory{

publicStreamCreateStream(){

//………

}}


接口(Interface)和基类(BaseClass)都是序之实践手段,而应用子类则是繁荣多变的实践手段。框架设计是基于特定领域的知识(DomainKnowledge)。然而知识有许多种,其变化的来源和时间经常是不一致的。例如,一家餐厅,其基本菜色、材料大多能天天相同,其知识并不会随着客人的不同而改变,我们称它为不变的。但是有些酸、甜程度等知识,就随着客人而异了,而且在时间上必须等到客人来到时才知道,我们称它为会变的。所以,有关于客人的酸、甜程度等知识,与基本菜色、材料等知识的变化上是不一致的,其获得的时间点也是不一致的。我们必须将两者分离开来,并将其不变部份纳入框架里,则应用框架就于焉而成了。

在进行「变与不变之分离」时,必须秉持「知之为知之,不知为不知」的原则,明确叙述那些是已知的知识、那些是未知的知识、那些是善变的知识。设计师就依据这些叙述而决定那些部份应该留空白(就如杯子内挖空才能装饮料),那些类应该分离,并定义接口,让它们未来能随时组合起来。

其实,这种设计原则也蛮简单的,在数千年前的老子已经使用过了,他曾说:畚箕中间必须「挖空」才有用!虽然简单,却是千年不朽的设计手艺。而「变与不变之分离」就是这个简单的设计原则罢了。

~~老子.道德经:有之以为利,无之以为用~~

说明:畚箕必须先挖空(无之)才能拿来装东西(有之)

所以先无之而后始能有之。

挖出来的会变部份成为元素,但有趣的是:挖出之后留下的空间才是重点,它能容纳原来被挖出的元素,也能容纳未来的其它元素。依据老子的思维,这个挖空的喜帖组件看似「无用」,其实是「为用大矣」!


DDD&& 參考文章(请点选) &&DDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDD

1. 智能家庭的软硬整合<A段架构设计>_案例解说

2. <家庭物联网><移动互联网>衔接的案例&实践代码

3. 智能&大数据时代,架构师思维的十个步骤和演练

4. <基于框架(Framework)的平台开发技>百篇文章

5. 高焕堂的9eBooks(可下载)

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD