解耦设计手法小结(转)

 

 

设计是一个平衡的产物,需要在各个约束条件下(组织目标,业务目标,开发流程,技术能力,学习及维护成本等)不断地进行演进。 我们虽然不提倡做大而全的设计,但会坚持进行基础性设计,以保证我们的设计一直在正确的方向上演进。

设计演进的过程既可以是自上而下的,也可以是自下而上的。

 

基本设计原则

 

业界普遍被接受的设计原则不再赘述。这里特别针对基于开源项目的软件,其总体主旋律将是:跟随,扩展,贡献,其中跟随将是一个基本能力,反观深度定制的方式会遭遇越来越多的尴尬。落实在设计上,其最核心的设计原则:隔离自有业务。相较于模块化的低耦合、高内聚的原则,这里的要求会更高。

先从模块上考虑应用的层次,依次考虑:

  • 应用层
  • 开源项目本身的定制或移植机制
  • 新增的接口层
  • 新增的适配层或业务层
  • 既有的接口层
  • 既有的实现

设计本身还要保证业务的完整性,以及对性能、系统开销、卡顿和稳定性的要求。

解耦的设计实践

以下为关于解耦的设计方法总结,以及应用要点便于在设计时评估。
解耦是隔离变化和降低复杂度的重要手段,这里以解耦代言隔离变化,其思想就是以分工协作代替全面控制,接口的定义大于业务逻辑的定义。
其思考路径是:分不分?如何分?

如何分是具体形式的问题,下面详述。分不分则取决于功能需求, 常见分离的需求有:

  • 功能强内聚
    . 这没什么好说的, 最常见的理由。
  • 功能的整合和转换
    . 就是为了整合某些功能或者达到某种切换的目的,向上提供一个更为标准统计的接口。内部可能会进行一些业务逻辑处理,数据、状态转换之类的操作。如编译器分出前后端也是这样的概念。
  • 降低复杂度

接口的定义至关重要,接口本身不能绑定业务约束或者流程。整体交互上是面向无状态的接口,而不是面向过程。过程的合理性,即业务流程则由不同的单元内部保障,再通过接口交互。

而向约束的编程也是在函数内进行约束的判断,间接达到带状态接口。

在手法上可以概括为从宏观到微观的四个层次:

  • 进程
    . 也可以是物理空间上的分离
  • 模块化/分层
  • 代码

    如下图:

进程

 

以分进程的方法来进行协作是Unix世界的传统,即KISS原则。Unix下有各式小工具,这些工具之间通过管道连结起来达到强大的功能。
另外以服务的方式隔离业务也很常见。如Windows中COM+的架构,甚至是HTTP Server等。
分进程的特点在于不同进程间的功能高度独立,并行处理的情况较多,服务提供者能够按需布署,存在一对多的情况,或有额外的安全性考虑。

而挑战在于性能、系统开销,需要熟悉IPC以及共享内存的知识。

 

分库

 

这是一个重要的模块化手法,主要是以动态库和脚本的形式, 甚至是独立的程序提供扩展。其核心思想是以插件的形式完成功能组装,以物理分离的形式提供出来。
插件本身实现一套标准的接口,包括:参数配置,接收输入,状态输出,数据输出等。
如Windows的核心驱动模块,Photoshop/GIMP中的图像处理功能,Matlab以及R语言中的函数库等等,不胜枚举。
以静态库形式提供出来的模块,更接近于代码级或者分层级别的体现,无法直接达到按需布署的能力。
分库要求各个独立库的接口层比较单一,特别适用于业务逻辑强内聚的场景。同时插件的功能将直接影响主程序的稳定性。

 

分层

 

就是将某一类功能的类和代码集中起来,向外提供特定接口或若干接口类,这个逻辑上的集合,就是层(layer)或者模块(module),也有叫unit或者API之类的。与分库、分进程本质区别就在于它是一个逻辑集合,优势在于可以更灵活的与不同模块交互,因为接口可以多样化(支持代码级的交互),这也同样是它的劣势,有时导致它形同虚设,丧失了解耦的能力。

所以分层成功与否,关键在于接口(含接口类)的定义和控制。

常见的一些手法,如MVC, 胶合层(glue),适配层(port),WebKit和Chrome中也有应用。

 

代码

 

这是一个最为微观,最为复杂的层次。但是到了这层,并不表示必然存在耦合问题。如果一些架构在设定上考虑到了扩展和适配的需求,在这个级别进行解耦反而最为自然。

WebKit的port方案

以Image类为例,它的一个函数与平台相关,于是类的实现被放在了三个文件中Image.cpp, ImageMac.mm和ImageWin.cpp中。Image.cpp中实现了公共的部分,而ImageMac.mm中实现了Mac OS版本,而ImageWin.cpp则实现了Windows版本。

另一种实现方式,如多媒体元素的播放控件。首先是MediaPlayer提供了一部分公共的逻辑,对于与平台相关实现的部分,定义了一个MediaPlayerPrivateInterface,各平台继承自这个接口实现各自的逻辑。

 

当我们解决了架构上的解耦后,在模块内部引入一定的耦合度就不是问题了。可供选择的方法就太多了。

 

Helper Class

 

Helper Class已经为一个类添加一个友类,执行一些差异化的业务。
Helper Class可以使用类似WebKit Port的机制为不同的系统提供不同的实现,也可以配合工厂模式,实现更为弹性的选择。

分散的逻辑判断就可以转为函数调用。

关于helper的使用一直是有争议,网上也有很多避免使用helper class的讨论。 主要论调在于认为helper class是过程化的产物,思考时是考虑的是流程上的逻辑补充。

转载请注明出处: http://blog.csdn.net/horkychen

http://blog.csdn.net/HorkyChen/article/details/41780553

时间: 2024-08-22 10:02:02

解耦设计手法小结(转)的相关文章

解耦设计手法小结

设计是一个平衡的产物,需要在各个约束条件下(组织目标,业务目标,开发流程,技术能力,学习及维护成本等)不断地进行演进. 我们虽然不提倡做大而全的设计,但会坚持进行基础性设计,以保证我们的设计一直在正确的方向上演进. 设计演进的过程既可以是自上而下的,也可以是自下而上的. 基本设计原则 业界普遍被接受的设计原则不再赘述.这里特别针对基于开源项目的软件,其总体主旋律将是:跟随,扩展,贡献,其中跟随将是一个基本能力,反观深度定制的方式会遭遇越来越多的尴尬.落实在设计上,其最核心的设计原则:隔离自有业务

视觉画面设计手法:绘画与设计中层的理解

文章描述:从绘画看设计"层"的概念. 在历代的视觉风潮中,绘画与设计在方方面面有着关联("设计"为外来词,在传统中国中,对应的词是"经营"),很多时候都是你中有我我中有你的局面,西方美术史上的文艺复兴.新艺术运动就是其中最好的例子.身为插画师以及设计师,在这两者之间游走,有着许多体会.其中对于画面"层"的认知,尤为深刻. 一般在视觉中"层"无论在画面抑或设计手法上都呈现出明显而重要的作用,用"层&

《AutoCAD 2016中文版室内装潢设计从入门到精通》——1.4 室内装饰设计手法

1.4 室内装饰设计手法 室内设计要美化环境是无可置疑的,但如何达到美化的目的,有许多不同的方法. 1.现代室内设计方法该方法就是在满足功能要求的情况下,利用材料.色彩.质感.光影等有序地布置并创造美感. 2.空间分割方法组织和划分平面与空间,这是室内设计的一个主要方法.利用该设计方法,巧妙地布置平面和利用空间,有时可以突破原有的建筑平面.空间的限制,满足室内需要.在另一种情况下,设计又能使室内空间流通.平面灵活多变. 3.民族特色方法在表达民族特色方面,应采用设计方法,使室内充满民族韵味,而不

新人的交互设计实习小结

  难怪很多一直坚持写文章的朋友在工作后就慢慢放弃了原来的公众号或者博客,可能就是因为初来乍到,实在太忙了吧.开始实习之后,遇到了令我欣喜的团队,遇到了超级 nice 的主管和师姐,短短几天也得到了不少的经历,所以我想这段时间会经常以小故事或者关键词的形式在这里写写实习中的感悟.当然,我可能没办法透露具体做的业务,但是对于设计本身,却可以提炼出很多让人思考的东西. 关键词一:执行思维与创造思维 初到公司工作的体验,有点让我想起了刚开始学设计的时候,是有一种类似的路径. 学习设计,有一个从底层到上

从用户出发解析移动设计原则小结

一.充分考虑用户的使用习惯 比如大多数人拿手机的时候是双手握还是单手握,单手握的时候是右手操作还是左手操作,操作的时候用哪个手指就能进行操作.考虑到用户的使用习惯有助于在设计时避开手指的触碰盲区. 二.充分考虑用户的使用场景和干扰源 用户使用产品是在什么时间,什么地点,什么环境下使用?譬如,用户经常在嘈杂的环境中使用自己的产品,这时候的干扰源就是噪音,产品设计时应避免使用语音技术;用户经常在拥挤的环境中使用产品,则产品设计时应避免用户过多地进行输入操作;用户经常在地铁等网络环境不好的场所使用产品

交互设计实习小结

难怪很多一直坚持写文章的朋友在工作后就慢慢放弃了原来的公众号或者博客,可能就是因为初来乍到,实在太忙了吧.开始实习之后,遇到了令我欣喜的团队,遇到了超级 nice 的主管和师姐,短短几天也得到了不少的经历,所以我想这段时间会经常以小故事或者关键词的形式在这里写写实习中的感悟.当然,我可能没办法透露具体做的业务,但是对于设计本身,却可以提炼出很多让人思考的东西. 关键词一:执行思维与创造思维 初到公司工作的体验,有点让我想起了刚开始学设计的时候,是有一种类似的路径. 学习设计,有一个从底层到上层的

《Oracle性能优化求生指南》-第四章:数据库逻辑设计和物理设计-学习小结-1

1.建立逻辑数据模型为第一阶段,包括对应用程序需要处理和存储的信息进行建模,并确保所有必要的数据都能够正确.完整且无歧义地表示.在关系数据库的实现中,这通常是指构造一个标准化的实体-关系(E-R)模型. 2.将逻辑数据模型映射为物理数据模型为第二阶段.对关系数据库来讲,物理数据模型描述的是表.索引.视图.键和其他一些数据库特性. 3.第三范式: 实体(表)的所有数据完全依赖于主键. 不能有重复的属性(列)或属性组. 不存在仅依赖部分主键的实体数据. 不存在依赖于其他非主键的实体数据. 用一条格言

在网页设计中对称手法使用技巧

文章描述:在网页设计中,对称/不对称的有效运用可以达到非常与众不同的效果. 在设计中,对称创造了平衡,平衡了创造和谐.秩序和审美.自然界中对称无处不在,也许正是这种无处不在的状态让我们发现对称的美.形态学的基本原则之一就是对称,它是一套人类形为理论,形态学认为人类对看到和遇到的事物本能的产生出秩序和完整性. However, symmetry can get boring. Asymmetry is a break in symmetry, which when used effectively

界面设计中的视觉隐喻手法

什么概念? 在我们做界面设计时,如果使用用户熟悉的来自真实世界的物体的图案来作为界面元素,用户会比较容易地学会产品的使用,这种手法就是视觉隐喻(metaphoric). 隐喻范围可以从整个界面到工具栏上的一颗小按钮. 几种类型?1 整体隐喻 整个界面都用隐喻的设计方法,最典型的例子就是游戏,整个现实的场景搬到游戏里面,用户一看就知道, 自己是在街上还是海上,房子是可以进去的,路人是可以问话的... 另外还有一些工具类.索引类的整体隐喻界面,比如日历.时间显示.播放器.手写板.阅读器.名片夹等.