`
mmdev
  • 浏览: 12911470 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

关于软件体系结构设计——给老师的一封邮件(及老师解答)

 
阅读更多
老师您好:
最近学习软件体系结构课,结合自己的项目实践,<wbr>对于软件的体系结构设计有一点想法。</wbr>
在本次课程中,好像更倾向于自顶向下的设计方法。最近我在看《<wbr>重构》这本书,里面则青睐从细节向结构的设计方法。</wbr>

对于自顶向下的设计方法,我觉得有一些不足:
一、自顶向下方法的适用范围可能不多。<wbr>它更适用于熟悉领域的设计。对于不熟悉的领域,<wbr>很容易导致一头雾水、无法前进。<wbr>像简单网站建设这样的低水平重复性的体系,<wbr>才更适合自顶向下的方法。</wbr></wbr></wbr></wbr>
二、即使对于领域比较熟悉,自顶向下方法,<wbr>由于对细节无法很清晰,可能会产生对细节不兼容的情况。<wbr>这体现在两方面:</wbr></wbr>
过度设计:由于对于细节无法完全把握,在自顶向下的设计过程中,<wbr>会考虑得过多;以后再回过头来,<wbr>发现其中许多方面的设计都是毫无必要的;</wbr></wbr>
设计不足:在具体的实现过程中,会有一些没有考虑到情况,<wbr>导致设计出来的架构无法兼容这些情况,反而会产生很大麻烦;</wbr>

重构的方式,我觉得是一种比较好的设计方式。通过这种方法,<wbr>在必要的时候再优化结构,灵活而方便,<wbr>从根本上消除了过度设计的问题,也会解决大部分设计不足的问题。<wbr>而且,在具体实现的基础上进行重构,更容易进行,<wbr>不会让人觉得无从下手。</wbr></wbr></wbr></wbr>
当然,完全自底向下的方式也是不合理的,也可能产生一些问题,<wbr>比如在刚开始时没有考虑到一些问题,导致后来改变架构比较麻烦。</wbr>

我比较倾向的设计方式是:在刚开始进行一些基础的、简单的、<wbr>明显的高层设计,然后在此基础上开始具体实现,并随时检查代码,<wbr>根据具体需要进行重构。</wbr></wbr>

这是我的想法,请老师指点。
谢谢!


嗯,上面是我刚刚给老师发的一封邮件。刚才跟同学讨论这个问题的时候,他也对从细节向上的设计方法深表赞同。

昨天晚上和今天上午和同学对此话题进行了讨论,使我的思维更加清晰了。现在重新表述如下:

对于熟悉的领域,如果经验丰富,有较大把握的话,可以尽量设计地详细一点;
而对于不熟悉的领域,从高层设计的话,所把握的原则是:只设计到有把握合理的地方;对于没有把握的地方,应当从细节开始,向上进行设计。

------------------------------------------解答----------------------------------------------
首先要明确一点,课程讲课的内容是自顶向下的,但这是为了逐步展开教学,不是说课程提倡或试图教大家自顶向下的设计软件。其实课程在ch1 ppt 14~15就已经有强调了,可能我强调还不足,这里再声明一下:
(14页)只有高层设计良好,底层设计才可能良好:先需求分析、后体系结构、详细设计、编码;
高层设计的质量需要到最底层才能准确验证
层次间是迭代关系,不是线性(瀑布)关系!!!!!
不要在全部完成高层设计之后再进行低层设计!!!!
要尽早有一个可验证的原型!!!!
15页
“I am not arguing that we should not “do design.” However you want to approach the process, I simply insist that you have not completed the process until you have written and tested the code.”
所以,课程提倡的是迭代方式,这自然会使用重构,只是课程没有专题讨论重构方法而已。


其次,重构与事先设计所考虑的因素、目标和原理基本一致,只是重构要更困难一些,原因很简单,分层设计存在的原因是为了分离关注点,控制设计者同一时间考虑的复杂度,以更好地解决问题。但是在重构方案中,设计者需要同时考虑代码载体适配、相关局部结构的清晰性与质量、以及整个软件系统的表现和体系结构质量。我个人认为:一个能够很好地完成重构任务的人,在分层设计中也会得心应手,但是一个分层设计都无法完成的人,是肯定无法完成重构的。


再次,这一点也是有争议的一点。重构方法的有效范围到底有多大,尤其是其能否有效进行体系结构的重构?我的看法是:至少从目前敏捷的实践和发表出来的书籍来看,重构主要集中于中层设计。
因为低层设计更多的是代码修改(数据类型和算法适配为主),对软件结构的影响有限,无法赋予重构很大的意义,而体系结构设计影响范围太广,靠重构来完成的可能性比较低。尤其是在复杂系统的体系结构设计上, CH3 ppt41页有说明:与质量和环境相关的体系结构设计决策可能会影响到系统的绝大部分,不是通过简单的修改部分代码就能够弥补前期缺陷的。例如你们实验中开始时使用了关系数据库的关系表(B树索引)来实现文本存储,那么再后期发现全文检索性能不足时,你可以想象需要修改的代码量有多大才能转换到倒排索引吗?!这种大量的修改还是重构所欣然允许和期盼的吗?我表示怀疑!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics