博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
认识软件框架的设计原则-- 变与不变分离,创造简美之序
阅读量:6377 次
发布时间:2019-06-23

本文共 2379 字,大约阅读时间需要 7 分钟。

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.

2.

3.

4.

5.

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

转载地址:http://oevqa.baihongyu.com/

你可能感兴趣的文章
HDU 1231:最大连续子序列(DP)
查看>>
[java] java 中Unsafe类学习
查看>>
HDU 1231——最大连续子序列(DP)
查看>>
P1739 表达式括号匹配
查看>>
3.1.4 模板字符串
查看>>
redis 介绍和常用命令
查看>>
CPU的段寄存器
查看>>
linux 安装nginx
查看>>
Kettle的概念学习系列之Kettle是什么?(一)
查看>>
Qt 3D教程(二)初步显示3D的内容
查看>>
100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】
查看>>
compareTo返回值为-1 、 1 、 0 的排序问题
查看>>
Being a Good Boy in Spring Festival(杭电1850)(尼姆博弈)
查看>>
微服务间如何选择推送和拉取数据
查看>>
互联网+时代IT管理者的转型
查看>>
Linux系统调用--getrlimit()与setrlimit()函数详解【转】
查看>>
限制容器的 Block IO - 每天5分钟玩转 Docker 容器技术(29)
查看>>
cocos2dx下的A星算法
查看>>
RabbitMQ的应用场景以及基本原理介绍(转)
查看>>
Nginx:413 Request Entity Too Large解决
查看>>