框架模块设计经验总结

转自:http://www.cnblogs.com/zgynhqf/archive/2011/07/15/2107593.html

这是原创,尊重原创、、、、、、、、、、、、

框架模块设计经验总结

三个月没写日志了,比较懒散……下半年准备做OEA 的 B/S 版本,比较复杂,需要从架构设计开始认真入手。正好今天到了部门反思的时间,今天先把原来的一些设计经验总结一下,以方便将来回顾。

直入主题,这篇日志主要用于总结一些框架级别的模块设计经验。

总述



一个大型的框架,必然由多个较独立的子系统/子模块构成。这些子模块如何交互,之间的接口如何定义,这是框架的架构设计的问题。而今天我主要要总结一下,针对其中的某一个子模块,应该如何进行设计。(例如,在 OEA 中有这些相对独立的模块:分布式框架、实体框架、界面生成框架、命令框架、产品线框架、分布式缓存框架、报表模块……)

我在对一个模块进行设计时,大致经过以下流程:预设计阶段、逻辑设计阶段、设计评审、设计调整阶段、设计实现阶段、模块整合阶段。在一次单独的设计中,并不是必须要经过以上每一个阶段。例如,当模块比较简单时,就不需要设计评审、设计调整等阶段了。以下我逐一描述。

预设计阶段



设计开始之前,我们需要为设计做很多工作。其主要的目标是收集并整理模块的需求,力求结构化地描述需求。这些需求主要包括:场景需求、质量属性要求、环境约束。这个过程对于之后的设计过程相当重要,原因也很明显,不再赘述。

场景需求包括:框架用户对模块的功能性需求、70%场景、20%场景、10%场景、API 需求。

质量属性:参考ISO 9126。这里要分析出关键质量属性。

环境约束:技术约束、系统环境等。比较常见的是对原有系统的兼容性。

根据模块的复杂度不同,这个阶段的时间长短可能会有很大区别。例如,界面生成框架在 OEA 框架中是核心模块,在它的 2.0 版本的设计之前,我们平时会不断地收集前一版本的缺点及不足,做整理并使这些杂乱的需求结构化,这个工作“非正式”地做了一年,这些时间都可以算是在预设计阶段中。

最后的交付物自然是:《模块需求规格说明书》。当然,文档这东西,主要用于沟通、传授。可以看情况而定,不一定有这个必要。但是,如果后面有正式的评审会议,这个文档最好还是准备一个正式的。

逻辑设计阶段



关键点:场景驱动设计、质量属性验证设计、环境约束验证设计。前者做加法,后两者做减法。

设计师的经验越丰富,在这个阶段成功的机会也就越大。要满足一套关键质量属性,如果你之前没有遇到过类似问题的话,可能你觉得你的设计能实现,但是最后的事实往往不一定正确。而且设计不象数学那么严格,更象是艺术,艺术靠什么,灵感!所以这个阶段中,不同的设计师很可能会有不同的设计稿。(当然,如果这个模块比较简单的话,很可能设计就不会有什么区别了,毕竟,现有的软件设计的模式是很多的。)

逻辑设计的方法主要还是画图。其中主要还是依据一些通用设计的原则进行设计。

画什么?主要是 UML 中的两类图:静态结构图(包图、类图);动态结构图(序列图)。

顺带说一句,很多设计人员可能会坐在电脑旁边直接拿 EA 等工具画图。但是我个人比较喜欢的方式是:

  1. 先用纸笔来画一些手稿。
    这个方式主要是比较方便,任何地点都可以画,例如开一些不重要的会议的时候,就可以随手画画。而且最后看着许多有用的手稿,感觉还是很有成就感的,跟画家似的~哈哈。
  2. 随时想、随时画:
    我觉得,一些复杂的设计不是简简单单就能想出来的,特别是我觉得自己的智商只是处于常人智商的范围中,要想出一些卓越的设计,不可能只是坐在办公室的那一点点时间。(我记得我曾在梦中想出了一些醒着的时候想不出来的东西……)
  3. 汇总成正式设计稿。

交付物:UML 图!这是必须的!

这个阶段中,主要考虑质量属性及关键需求。

要提升该阶段的能力,个人再次推荐几本著名的书籍:《Pattern of Enterprise Application Architecture》,《Microsoft Application Architecture Guide》,《Enterprise Solution Patterns Using Microsoft .NET》。

设计评审



召开设计评审会议的原因:

  1. 人无完人,个人的想法很可能有问题。
  2. 听取更有经验的人的指点。
  3. 团队协作、团队沟通。
  4. 听取模块使用者的建议。

所以,如果不是十万火急,都建议召开评审会议!

我主持过的评审会议,曾经出现了许多的问题,大家可以看看我当时的反思:《反思 - 组内设计评审会议》,不要出现和我一样的错误。

设计调整阶段



没啥,看评审会议的结论。要么做些小的调整,要么大改动,甚至重新设计。如果改动较大,别忘了最后再召开一次评审会议。

设计实现阶段



这个阶段包含了设计的代码验证阶段。

可能由于公司的组织结构不同,这个阶段并不一定由设计师自己去完成。但是我建议不要完全由他人完成,设计就象是自己的孩子一样,辛苦辛苦把他生下来,你让别人来把它抚养大,不觉得奇怪吗?如果你觉得你要设计的东西太多,没时间完成,我觉得你还是少做一些,做好一些会更好。

建议实战能力弱甚至没有实战能力的设计人员不要再做设计了,先好好在底层磨炼磨炼吧。设计师从程序员成长而来,架构师从设计师成长而来,这才是务实的做法!

这个阶段考验的是设计人员的代码实现能力,团队协作能力。代码的实现能力往往真正能看出一个人的设计能力。软件设计原则大家都会说,但是,要真正把这些原则应用到代码实现中,却需要时间的不断磨炼。如果开发组里能有几个为技术痴迷的人,那是最好不过的了。

实现相对于设计稿,可以有一些更多的灵活性,并不一定要100%符合设计稿,这是因为代码实现本身就是一种微观的设计。但是必须要求80%以上是要符合设计稿的。如果实现过程中,不得已有过多的部分不符合当初的设计稿。请:召开讨论会议!重新画图描述当前设计!总结反思!

值得一说的是,实现阶段需要着重对使用场景进行 721 分析,设计良好的 API 以应对这些场景,并配以相应的单元检测。关于框架设计中的场景驱动设计,大家可以看这篇文章推荐的书籍:《Framework Design Guidelines 2nd Edition》

模块整合阶段



其实这个阶段中的工作在上一阶段中需要准备好,也就是说,在进行编码时,需要不断考虑所设计的代码能否在大的环境中运行。所设计的接口是否能和当前系统正确的衔接上。如果之前的代码没有考虑足够,在这一整合阶段中,可能会发生一些集成的问题。不过这种情况我遇到的比较少,这里就不展开了。

这阶段完成后,最好能配上集成测试。(不过我目前都没有做过。)

演进模块的考虑点



在整个框架的架构设计完成之后,其中所涉及到的模块分两类:一类是在架构设计时已经考虑到并明确定义的模块;另一类是架构初始设计时并没有考虑到,但是随着系统逐渐演进,发现必须被添加进来的模块,我简称其为“演进模块”。两种模块的设计有许多相同之处,相对而言,设计演进模块时,相对要需要考虑更多的东西。

针对演进模块,在预设计阶段,约束中需要重点写明历史系统对当前模块的兼容性约束。在设计阶段,需要分析当前系统,从中找到突破口。

兼容性是很麻烦的一种约束,为了满足这种约束,常常会使简单的设计变得复杂。最后的代码也很可能写得不符合规范。在以后的新版本中,如果做出不再兼容这些历史代码的决定时,这些兼容性设计需要被删除。

设计失败的常见原因


  1. 预设计阶段工作做得不充足。
    未收集场景、早早地进入了逻辑设计阶段、甚至直接开始编码,导致最终设计了不需要的部分,或者根本满足不了需求。
  2. 过份自信,未召开评审会议。
  3. 设计经验不足。(逻辑设计要求经验、灵感)
    提升方案:多把现有系统画出来。架构模式、设计模式都熟了吗?平时有没有花非工作的时间多设计些东西?书看太少了?
  4. 编码能力不强。(代码实现要求实战家。)
    提升方案:天天写些无聊的代码?非工作时间有多少花在代码上?书看太多了?
  5. 逻辑设计、代码实现分两波人做。

总结



这篇文章是基于目前我的设计经验总结而成,将来可能会不断更新……

同时,希望和园友们交流设计经验。更加希望平台开发人员能和我一起交流平台级别的开发。

可以短信我,交换QQ和EMail。

时间: 2024-08-06 15:37:47

框架模块设计经验总结的相关文章

应用web框架模块设计三国演义篇--转至微博

从事web开发已经10年时间,近几年也一直从事微博应用产品的研发.从原生php写网站到使用cms bbs整合的大型站点,从使用各种流行的开源开发框架到成熟稳定的平台级框架下做研发.这期间对应用型web开发框架设计有一些自己的理解和见解,在这里和大家一起分享交流一下. 为了让大家对框架的各个模块有较深的理解,我对模块职能角色匹配了三国人物,在这里纯属为了增加大家的趣味性理解,如有不同见解可以在后面使劲得拍砖:). 一个较成熟的框架图如下: 三国人物和各个模块角色匹配如下: 一.单一入口(index

模块设计与实现经验总结(三)

3  模块详细设计指南与规范 模块详细设计要完成两个方面工作:一是明确模块的功能需求和非功能需求.二是设计如何完成和实现模块的功能需求,包括类结构.线程结构设计等.本节根据后台模块特点,描述了两部分工作需要考虑和设计的关键点. 3.1确定模块的功能规格 1) 本模块概述 概述主要描述了本模块所属子系统,以及在子系统中所承当职责的简单描述. 2) 本模块在系统中与周围模块关系和交互情况 很多模块一般要依赖周围的模块或者数据库,为此建议以图形方式描述本模块与本模块依赖的其他模块或者数据库之间交互情况

《自己动手写框架9》:理想的开源框架与设计原则

理想的开源框架?她应该是小的.简单的,满足Simple Is Beautiful?她应该是成长性好的,随着不断的扩展,她可以越来越丰满?她应该是有良好工具支持的,为什么要花时间做工具可以完成的事情呢??她应该是自组装的,也就是尽可能的脱离配置,而是用一种依赖即可用,取消依赖即消失的全自动处理模式?她应该是模块化的,所有的内容都可以被打入jar包而作为一个整体进行发布,并且能支持热部署的,可以开着车儿换轮胎的?她应该是支持水平部署的,想加服务器就加,想减服务器就减?她应该是有良好知识积累体系的,使

专訪阿里陶辉:大规模分布式系统、高性能server设计经验分享

http://www.csdn.net/article/2014-06-27/2820432 摘要:先后就职于在国内知名的互联网公司,眼下在阿里云弹性计算部门做架构设计与核心模块代码的编写,主要负责云server管理系统和存储系统的优化.陶辉就大规模分布式系统.高性能server设计分享了自己的看法. 关注陶辉非常长时间,初次对陶辉的了解还是在我们CSDN的博客上,从2007年開始写博客,一直到如今,假设不是对技术的追求和热爱,以及热爱分享的精神,我想不是非常多人能坚持下来,拥有多年大型互联网公

我们一起完成插件框架的设计与实现

原文:我们一起完成插件框架的设计与实现 开场一些题外话,今天登陆这个"小菜"的博客园,感触颇多."小菜"是我以前在QQ群里面的网名,同时也申请了这个博客园账户,五年前的"小菜"在NET和C++某两个群里面非常的活跃,也非常热心的帮助网友尽能力所及解决技术上的问题.依稀记得当时NET群里面的"青菊.Allen.酷酷",C++群里面的"夏老师.风筝兄"等网友.哥们.时过境迁,后来因为某些原因而慢慢淡出了QQ群里

缓存模块设计

NET 缓存模块设计 上一篇谈了我对缓存的概念,框架上的理解和看法,这篇承接上篇讲讲我自己的缓存模块设计实践. 基本的缓存模块设计 最基础的缓存模块一定有一个统一的CacheHelper,如下: public interface ICacheHelper { T Get<T>(string key); void Set<T>(string key, T value); void Remove(string key); } 然后业务层是这样调用的 public User Get(in

用户界面设计经验分享:界面设计技巧分享

如此有用的文章我已记不得是什么时候发现的了,但在看完的那一刻便想将之翻译,分享给大家自己也受用. 时间过了很久,来到了2014年,终于静下心来花了大把时间连同图片一起译成了中文.像我这样业余的翻译六级分数只够及格的程序员,不敢说做到信雅达,但求意思到位. 1 尽量使用单列而不是多列布局 单列布局能够让对全局有更好的掌控.同时用户也可以一目了然内容.而多列而已则会有分散用户注意力的风险使你的主旨无法很好表达.最好的做法是用一个有逻辑的叙述来引导用户并且在文末给出你的操作按钮. 2 放出礼品往往更具

企业信息系统集成框架(设计思路)C++模式

设计要求: 1.企业信息系统框架.第三方产品通过接口层进行分层. 2.企业信息系统框架如何自由的继承第三方产品:通过一个抽象类.(软件设计要求:模块要求松,接口要求紧). 设计步骤: 1.报文的接受与发送抽象类: C++与C语言设计区别:C语言中有个句柄,原因是需要分配一个结构体资源,把发送和接受的信息存储起来.而C++中由于有类的存在,可以直接将这个句柄内容存储在子类中,不需要再单独设置. 2.测试界面面向抽象类框架集成,开始初步完成测试界面. 4.厂商的产品实现(自己的头文件和.cpp文件)

一个硬件高手的设计经验分享

一个硬件高手的设计经验分享 一:成本节约 现象一:这些拉高/拉低的电阻用多大的阻值关系不大,就选个整数5K吧 点评:市场上不存在5K的阻值,最接近的是 4.99K(精度1%),其次是5.1K(精度5%),其成本分别比精度为20%的4.7K高4倍和2倍.20%精度的电阻阻值只有1.1.5.2.2. 3.3.4.7.6.8几个类别(含10的整数倍):类似地,20%精度的电容也只有以上几种值,如果选了其它的值就必须使用更高的精度,成本就翻了几倍,却不能带来任何好处. 现象二:面板上的指示灯选什么颜色呢