软件架构设计三步曲

来源:互联网 发布:snmp网络管理系统 编辑:程序博客网 时间:2024/05/17 08:56

  软件架构设计由软件需求驱动。架构设计分为三个阶段:需求把握阶段、概念架构设计阶段、架构细化阶段。

    第一阶段,需求把握阶段。

    要求架构师参与需求分析,但不对需求分析结果负责,在这阶段架构师主要是理解需求,对需求进行分类。软件需求分为三个层次:业务级(组织级)需求、用户级需求、行为级(系统开发级)需求,该划分方法有别于RUP。从别的角度来看需求包括了:功能要求、质量要求和约束。同前面的三个层次组成二维需求矩阵,架构师在这阶段的设计可以借助于该矩阵来理清楚需求间关系,和发现衍生需求。

    -----------------------------------------------------------------------------

                      功能               质量                 约束

    -----------|--------------------|---------------------|----------------------

    业务级需求 |                                        |

    -----------|--------------------|---------------------|----------------------

    用户级需求 |                    |                     

    -----------|--------------------|---------------------|----------------------

    开发级需求 |                    |                     |

    -----------------------------------------------------------------------------

    架构设计之前就要抓住重点关键质量目标,第一时间判断关键质量目标之间的冲突,制定权衡取舍的策略。例如,性能优先还是扩展性优先。

    需求决定架构,对架构有影响因素多而杂,我们需要把这些影响因素分类整理,建立全面有序的理解。然后针对约束、质量、功能这3类需求开展相应工作:分析约束影响,识别隐含的需求;确定关键质量,识别关键质量之间的关系,以及他们之间的冲突,制定权衡取舍的策略;确定关键功能,便于有针对性地分配有限的设计时间。这阶段的需求分析总结为以下四步:

    1、需求结构化

    2、分析约束影响

    3、确定重点质量

    4、确定重点功能

 

    第二阶段,概念架构设计阶段。

    将重大需求、特色需求、高风险需求做为架构设计的入口,进行初步设计,然后综合初步设计确定高层分割,并考虑非功能需求做出相应的策略。概念架构的设计是大型系统设计的关键。在这阶段可以借助鲁棒图、架构模式、目标-场景-决策表来思考问题。

    第一步,初步设计,该阶段主要通过对重大需求用例进行鲁棒图分析,识别出功能职责协作链的各个组成部分。简单的说就是“发现职责”。

    第二步,进行高层分割,高层分割的方法主要有两种:分系统为系统,分系统为子系统。

    分析统为多个系统,再对各个系统进行架构设计。

    分系统为子系统最常见的方式就是:逻辑分层(Layer分层)、物理分层(Tier分层)、按通用性分层、技术堆叠。

    逻辑分层重视职责的划分,职责之间常常是上层调用下层的关系,这种分层根本不关心上层和下层是否“能分布”在不同机器上。最典型的就是四层结构:表现层、业务层、数据层、集成层(对外接口层)。

    物理分层,Tier是指“能分布”在不同机器上的软件层。不同层之间必须有跨机器访问的能力——可以通过远程调用或使用通信协议等。

    按通用性分层,其实也是一种Layer。这种分层主要强调通用性,通用程度越大的层就越靠下,如:应用层、操作系统层、硬件驱动程序层。

    技术堆叠,是综合多种分层方式的一种分层。

    第三步,考虑非功能性需求。 考虑非功能性需求,修改之前的成果,可以使用目标-场景-决策表来帮助设计。

    

    第三阶段,架构细化阶段。

    从概念架构继续深入细化架构设计,在架构设计的中间产物中加入非功能性要求,对架构进行测试和验证,不断的对架构进行修改提升,使架构能够满足质量要求。质量要求是架构设计优化的驱动力!这阶段要从软件体系五个视图来考虑架构设计:逻辑视图、运行视图、数据视图、开发视图、物理视图。设计要从这五个方面考虑问题,要满足五个方面的要求。

    需求的每一个功能都能对应到一个责任链(多个角色共同协作完成一个功能,在这个协作过程中每个角色都承担着不同的责任)。首先,划分子系统,对子系统的职责进行定义,并定义系统之间的接口,画出实现每一功能的协作图。

    这阶段可以借助包图、包接口图、灰盒包图、时序图、目标-场景-决策表来思考问题。

    第一,逻辑架构设计

    逻辑架构设计可以从以下三步来实现:1、根据职责划分结构单元。2、将结构单元组织起来完成功能,3、根据功能和质量要求对设计进行质疑,完善设计,并确定他们之间的接口。

    其中划分结构单元的原则有以下4个:1、职责不同的单元分在不同的子系统。2、不同的通用性的单元分在不同的子系统。3、需要的技术不同,分在不同的子系统。4、根据工作量均衡原则对工作量大的子系统再做细分。

    划分手段则有3个:1、分层。2、引入分区。3、提取机制。

    有时我们对逻辑单元中的重要类要做些深入的设计,可以采用灰盒包图。

    逻辑架构设计的时候应该使结构设计和行为设计相分离,这样才利于更有效的思维。

    第二,物理架构设计

    物理架构设计可以从以下三步来实现:1、选取硬件和拓扑结构。2、将逻辑单元影射到物理节点。3、关注非功能性要求,对架构进行优化。

    目标要实现“攻”/“守”6个指标。以“降低开销”/“避免争用”4个指标为思维方向。最终落实到“物理节点、网络、软件单元、数据单元”等内容上。

    *攻:高性能、持续可用性、可伸缩性

    *守:经济性、技术可行性、可维护性

    *降低开销:降低节点内计算开销、降低节点间通信开销

    *避免争用:避免节点内cpu、内存、磁盘资源的争用,避免节点间网络带宽的争用。

    第三,运行架构设计

    该设计为可选项,但对于系统复杂,有多任务并发或嵌入式系统等情况,则要求做。主要涉及进程、线程或中断程序的设计,包括以下工作:

    1、确定引入那些控制流

    2、确定每条控制流的任务

    3、控制流的创建、销毁问题

    4、控制流之间的同步关系、通信机制如何,如果有资源竞争的话还要引入加锁机制。

    第四,开发架构设计

    开发架构设计主要工作:1、逻辑单元和程序单元的影射。2、选用什么开发语言和开发工具。3、工程的划分如何,目录结构如何,程序单元之间的关系如何,编译与依赖关系如何?

    * 大粒度的单元重用可以减少类似bug重复修改次数。为从根本上降低成本,重用测试是关键。

    第五,数据架构设计

    数据库架构设计很关键,常常影响系统的成败。

    数据分布方式有6种:

    1、独立schema

    2、集中式

    3、分区

    4、复制

    5、子集

    6、数据重组

    其中推荐优先考虑独立schema方式,因为该方式具备容易维护的优点:

    ——————————————————————

    数据分布方式           优点

    ——————————————————————

    独立schema        通信开销少、可管理性好

    ——————————————————————

    集中式             数据一致性高、可管理性好

    ——————————————————————

    分区方式           扩展性高

    ——————————————————————

    复制               安全性高

    ——————————————————————

    子集

    ——————————————————————

    数据重组

    ——————————————————————

    但实际应用中还是要根据具体情况来确定,有时常常是多种分布方式一起使用。

   

    那么架构设计需要进行到什么程度呢?答案是:1、可以为开发人员带来指导和约束。2、按项目情况适当调整深度。3、业务层、通用机制应该更深入的设计。

    业务层决定软件的扩展性,通用机制决定软件的稳定性。

    领域模型设计是业务层设计的核心。

    总之,架构设计概括起来就分为上面的三个阶段,各个阶段侧重点不同,但非功能性需求都要考虑的,它贯穿了整个设计。可以借助“目标-场景-决策表”(场景技术)来帮助对非功能性设计的思维。

0 0
原创粉丝点击