ee                                                                        ee

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

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

EE                                                                        EE

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

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

by高煥堂2013/10/13

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

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

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

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

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

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

因之,接口设计是缔造系统整合架构之美的基础;也是框架设计的核心。例如,.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. 高焕堂的9本eBooks(可下载)

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

转载于:https://blog.51cto.com/8204129/1324156

认识软件框架的设计原则-- 变与不变分离,创造简美之序相关推荐

  1. 软件架构(软件体系结构)-设计原则篇(七大设计原则)

    软件架构(软件体系结构)-设计原则篇(七大设计原则) 1.软件架构设计原则概述 1.1.软件的可维护性 1.软件的维护 一个好的软件设计可维护性较好的系统,必须能够允许新的设计要求很容易地加入到已有的 ...

  2. 股票下单软件接口的设计原则是什么?

    股票下单软件接口的设计原则是什么?如果是后台开发的学生,往往需要实现后台微服务,提供相应的能力,完成业务功能.服务以接口的形式提供.在实现服务时,我们需要将大功能分为独立的子功能,每个子功能都是我们需 ...

  3. 软件7大设计原则(附案例所敲代码)

    目录 1 .开闭原则 2.单一职责原则 3.里氏替换原则 3.1 使用前 3.1.使用后 4.依赖倒转原则 4.1.使用前 4.2 .使用后 5.接口隔离原则 5.1.使用前 5.2.使用后 6.迪米 ...

  4. 引物设计软件primer_PCR-引物设计原则

    1.引物最好在模板cDNA的保守区内设计. DNA序列的保守区是通过物种间相似序列的比较确定的.在NCBI上搜索不同物种的同一基因,通过序列分析软件(比如DNAman)比对(Alignment),各基 ...

  5. 软件的六种设计原则一篇文章轻松Get

    文章目录 一. 开闭原则 二.里氏代换原则 三.依赖倒转原则 四.接口隔离原则 五.迪米特法则 六.合成复用原则 七.总结 妈妈,长大了我想学设计模式!

  6. HTML5的学习资料(开发设计原则)

    "Be conservative in what you send; be liberal in what you accept.   –The Robustness principle&q ...

  7. 《微服务实战》微服务设计原则

    微服务设计原则 文章目录 微服务设计原则 设计原则之分层架构 设计原则之统一通信协议 设计原则之单一职责 设计原则之服务拆分 设计原则之前后踹分离 设计原则之版本控制 设计原则之围绕业务构建 设计原则 ...

  8. 软件框架设计的艺术----读书总结

    总结 软件开发的艺术 理想主义,经验主义和无绪 文艺复兴时期,现代科学产生了两个重量级理论: 理性主义和经验主义. 理性主义认为理智是信息的首要来源.给出一个假设,只要通过思考就能理解和描述这个世界, ...

  9. 仅仅是又多了一本设计书吗 《软件框架设计的艺术》序

    读者也许会想:"在程序开发领域中,讲述软件设计的技术图书是不是太多 了?",的确如此,因而你有理由来质疑,为什么我还要写一本这样的书而你又凭什么还要再读这样一本书?说起软件设计的经 ...

最新文章

  1. JDBC操作步骤及数据库连接操作
  2. linux安装指定mysql版本安装,linux yum安装指定版本mysql
  3. 记录一次内网渗透试验
  4. Arrays类中的fill(用于填充数组)
  5. curl和file_get_contents 区别以及各自的优劣
  6. 【数学分析笔记05】数列极限的性质
  7. FasterRCNN之整体框架详解
  8. matlab aic sic,ADF检验的时候选用AIC和SIC得到的结论不一致应该如何选择?
  9. cba篮球暂停次数和时间_篮球比赛CBA中每节多长时间?每次暂停都分为多长
  10. 给予Java初学者的学习路线建议
  11. 三、外码、关系的完整性约束、关系代数
  12. 用c语言录入3组学生数据编程,学生信息管理系统C语言编程
  13. 监控Kafka(kafka_exporter)
  14. 数据结构 - 迭代、递归和分治思想
  15. linux mtr命令安装,如果mtr没在你的机子上安装
  16. 30多岁零基础想转行学编程,来得及吗?
  17. vue项目中使用ckplayer.js封装视频播放组件
  18. 微信小程序判断手机系统
  19. 10 款最好的远程桌面软件
  20. 计算机学生对未来的规划800,大学生规划书800字.doc

热门文章

  1. iso qemu 安装ubuntu_在 Ubuntu 6.06 上安装 qemu 和 kqemu(zz)
  2. python采集修改原创_python应用系列教程——python中ftp操作:连接、登录、获取目录,重定向、上传下载,删除更改...
  3. C语言 | 用51单片机实现公历与农历星期的转换(完整源代码)
  4. C语言 | 基于卡尔曼滤波器的角度测量仪(MPU6050)
  5. 百叶窗设计原理 html5,Html5百叶窗效果的示例代码_html5教程技巧
  6. C语言实现文件读取矩阵乘法
  7. 程序员硬核宝典(面试题集、在线免费工具箱)
  8. 【Python】8000字概括精髓,pandas必知必会50例
  9. 通俗讲解和学习SQL
  10. 【Python基础】解决matplotlib文字标签遮挡问题