解耦设计手法小结

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

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

基本设计原则

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

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

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

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

解耦的设计实践

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

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

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

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

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

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

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

    如下图:

进程

以分进程的方法来进行协作是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

参考:  优化解耦的设计思考

自然而然的设计

WebKit模块化分析

Unix设计哲学

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

时间: 2024-08-05 15:09:02

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

OO虚函数的一些设计手法

1. 抽象类法(VCL不推荐):第一,允许创建抽象类对象,因为语法没问题,但允许其错误.第二,接口更好.第三,如果是混合抽象类,则推荐Place Holder方法2. Place Holder(占位):父类虚拟函数为空白函数,但不是抽象方法.例如TCanvas.避免了抽象类的缺点3. 逐渐增加法:子类使用inherited调用父类的实现,并加入派生类的实现4. 三明治手法:5. 覆盖父类实现法:子类的函数使用virtual覆盖,使用Windows消息覆盖6. BootStrap设计法:父类定义各

课程设计每日小结0902

今日完成: 1.初步实现同数据库的连接 2.实现了各网页的连接 明日预计完成: 1.修改同数据库连接的相关代码 2.修改前段使其更加美观 今日小结: 1.经过了极大的努力,终于将网页同数据库的连接建立起来了,不过只是进行了简单的测试,预计明天进行更详尽的测试,并计划更正其中的错误代码 2.我们对于网页的设计比较简单,之后一定要加以修改 原文地址:https://www.cnblogs.com/wccsksjdtl/p/11448915.html

产品UI设计排版的四个基本原则

相信很多初学UI设计的设计师,或者一些刚一边从事UI设计岗位,一边学习UI的,刚开始的时候都会遇到UI设计的规范,下面介绍四个基础的UI设计原则. 一.轴 轴在UI设计中是最基本.最常见的概念,也是用来组织界面结构的重要核心.简单说来,轴是在设计的时候组织一系列元素的假象线,在下面的设计图中,轴以虚线的方式被标注出来. 1.对齐 轴最常见于对称元素的使用,当元素被布置成轴对称的布局的时候,会给人有序感.就像生活中绝大多数的事情一样,我们更倾向于享受有序的的东西,它们令人感觉平稳.舒适.平易近人.

 实用10大原则:网页UI设计全适用!

本文和大家分享的主要是网页ui设计中的10大原则,一起来看看吧,希望对大家设计中有所帮助和启发. 1.纠结的时候,让自然为你做决定! 遵循自然规律的设计总是因为贴近万物本源而受到更多人的宠爱,因此,当你举棋不定的时候,你可以选择将设计代入大自然定律中,让自然为你做出最好的决定.比如,现实和自然告诉我们,光源来自天空,在人们也已经习惯了这种由上至下光线来源的时候,设计师需要做的应该是能顺应用户视线的光线设计. 2.脱离色彩诱惑,能真正看清布局设计 色彩对人类视觉的冲击力能产生最大的效果:一个网页的

组件接口(API)设计指南[2]-类接口(class interface)

*返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 类接口(class interface) 你能够參考MGTileMenu的接口文件. 我们之前谈论了一些接口的细节,这里,例举几个通用规则: 规则1:使用当前平台的描写叙述用语或构架 一个最常见的API错误设计是使用外来的规则,API属于一个特定的平台和相关开发人员生态系统. 你不能使用不论什么其它不同平台的描写叙述用语或构架,这会污染你当前的代码库,并破坏

web设计经验<八>20个设计新手常犯的排版设计误区

很多同学问设哥,为什么别人字体就那么随意放一下就辣么好看,其实排版可有大学问,不是随意放就好看.这就如同配色一样,也有千变万化的学问.相信大家看完Designschool这篇头条热文,一定倍有收获. 排版是设计中最重要的组成部分之一,它绝不仅仅是将漂亮的字体放在帅气的背景上这么简单.然而,制作优秀的排版并不容易,雷区遍布,稍不注意就流于平庸.过于抠细节容易忽略整体的设计,过于强调视觉又容易忽视功能性,日常的误区之多难以想象.所以,今天我们总结了排版设计中常见的20个误区,帮你逐个梳理日常设计中容

ASP.NET性能优化小结(ASP.NET&C#)

ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不

天津华信智原UI设计培训直达高薪企业

天津华信智原科技技术公司隶属于北京华信智原教育技术有限公司,成立于2005年,总部位于北京海淀中关村高新技术开发区. 公司现已在16个省市成立分.子公司,并联合国内外知名软件.互联网.大数据等高科技企业,在全国建立了60多个高端人才培养基地和"DT卓越工程师培养基地",承担了多项国家部委和行业协会委托的专项工程和项目,取得了优异成绩,赢得了社会及业内的广泛好评. 天津华信智原UI设计培训课程详解:(提前预约有好礼哦!预约热线:022-58151212或87081819) 第一阶段::视

UI设计趋势:渐变设计风格重新回归主流

在扁平化设计刚刚兴起之时,渐变是设计师们避之不及的设计手法,然而今天它已经正式回归.几乎是在一夜之间,无数的网站开始使用渐变色. 从背景到图片上的色彩叠加,包括UI元素上所遮盖的色彩,所有的这一切都表明渐变以一种微妙的方式回归了.不过和以往的我们所看到的渐变不同,重新回归的渐变色设计有着不一样的使用技巧和特色,更加贴合这个时代的风格和需求了.如果你也想使用,不妨从今天的设计示例中学习一下“全新”的渐变设计. 潮流的引领者 在今年早些时候,Spotify 开始在自家网站上大量使用双色调设计,将双色