zoukankan      html  css  js  c++  java
  • 对某某软件架构认识与建议(非原创)

    一、    某某架构

    1.从“层”上认识某某软件架构

    软件业中Web最经典的架构必然是三层架构:表现层,业务层,数据层。那么让我们看看某某软件在三层架构上是如何实现的(如图1):

    项目

    认识

    表现层

    Zivsoft.CRM

    Zivsoft.CRM.Controller

    表现层应该只对界面的表现形式做控制

    业务层

    Zivsoft.Business

    Zivsoft.Ajax

    Zivsoft.Email

    Zivsoft.Resource

    Zivsoft.Report

    业务层应该只跟具体需求有关系,是商业软件的真正核心。

    数据层

    Zivsoft.Comm

    数据层必须是独立,是必须可扩展的一层。

                          图1某某软件项目以三层划分

    从上面的表格中,可以看出,有三层的影子,但再具体看项目,发现三层分得不太明确,但又像MVC分层(如图2)

    项目

    认识

    Model

    Zivsoft.Business

    Zivsoft.Report

    Zivsoft.Ajax

    代表系统的模型层

    View

    Zivsoft.CRM

    模型的展现层

    Controller

    Zivsoft.Controller

    负责业务的流转

                           图2某某软件以MVC层划分

    总体上,感觉某某软件比较像MVC架构,这是我的认识。总体感觉有架构的影子,但是似乎又没尽力做到最好。

    2.从“开发模式”上认识某某软件架构

    首先,我们从软件流程上来分析:

    假设我们现在从客户得到了一个新的需求,那么,会有很专业的人员理解需求,并将需求带回公司。某某在这一环节做得很好,如图3

     


                                                                                                  图3 客户需求提出

    但是,需求分析后的下一步,需求人员开始与程序员沟通,于是开始编码, 即使程序员在编码前花了一些时间做了设计工作,甚至还拿到了文档(注:此文档一般都是需求文档,而非设计文档),具体流程如图4

     
    4 需求到编码的跨越

    于是,接下来,就开始走一下流程(如图5)


    5 最耗时间的死循环

    那么现在让我们继续看下面的流程,如图6

     

    6 软件实施

    现在对以上流程谈一下看法:

    在需求提出上,我个人认为做得很好,当客户想要新的功能,无法用软件表现时,需求人员提出自己的解决方案,让客户满意,并将需求与解决方案带回公司。回公司,只要沟通没问题,其实需求文档并不重要,但一般软件开发还是要写需求文档,因为需求文档毕竟是文档,它可以便于以后复查,这是它的主要好处。

    但是,我总认为,软件是一项工程,某某的流程走得似乎过于简单,编码前的设计与分析,以及扩展性,还有可行性,另外现有的框架是否满足这个新需求的到来,等等,这些似乎没过多考虑,而直接开始了编码工作。

    先看看软件设计要做的事如图7

    阶段

    事务描述

    概要设计文档

    对需求人员提出的需求变成开发文档,并分析是否可行,可行继续写详细设计文档,不可行和需求人员沟通对需求做出调整,以适应开发,继续做概要设计分析;另外有可能需要调整系统架构等等,然后来适应开发和软件的后续稳定性和扩展性。

    详细设计文档

    接口设计

    设计者此时必须以开发人员的角色去分析需求。并设计好接口,数据库结构,各表关联,以及界面表现形式。还有可能需要对架构等等加以调整和扩充,从而满足新需求不会影响到已经存在的模块。

    数据库设计

    界面设计

    备注:

    以上是我个人认为很重要的环节,因为很多的Bug都是因为事先考虑不周,或者设计不合理导致的,以及扩展性难,当然作为框架设计不合理,也会导致新需求的加入造成不稳定性,而这一切如此重要,却被某某忽略,于是总有“不稳性”的阴影,从而大家都在改永远改不完的Bug。因为没有事先的设计,从而让我们陷于如图5的死循环中,再回头已不能自拔(如Zivsoft.Comm,DataGrid一动全惊动,杀掉一个bug,而另一个新bug却悄悄诞生)。

     7 软件设计的重要环节被忽略

    作为流程后面的发布与测试,我认为没有多大问题,还是佩服某某花了大力气,大人力来做这件事。只是感觉祸源不在此。

     

    其次,也就是最后要分析的是研发内部的开发模式:

    同样,从新需求开始分析。

    当一个程序员接到新需求,由于软件架构分了层,那么分层的另一个好处却没有利用起来(本可以利用),我们先看图8

     


    8 纵向开发

    分层的好处不仅可以把业务独立,让数据库容易扩展,同时界面可以随意适应客户需求的改变,这是它的主要好处之一;另外,分层在开发上,它可以让不同特长的程序员发挥它的专长。如对需求把握比较好的人,它可以去做表现层的开发,这样界面就比较统一,而且对需求的实现也比较精确;若对需求把握不准,可以去业务层开发,因为它只需要实现被设计好的接口,另外所有的业务之间的关联,如采购,订单,发货,将会非常清晰;至于底层的开发,一般需要性能分析,以及架构的知识,但这一块变化不大,架构,设计者可以开发这一块。现将上面的纵向开发模式改成横向开发模式,如下图9

     


    9 横向开发

    将图8,图9两张图进行比较,你会发现,程序员不需要知道跟它无关的事情,而且统一了代码风格,如表现层不会出现keyPKValue两种不统一的字段,也不会出现按钮样式或按钮在各模块放的位置不统一;做完订单流程,同时也知道到了发货流程该怎么走,它们的关联一清二楚,之间有什么关系,做这一层的人肯定非常清楚。而横横向之间的衔接,就是SOA思想下的请求与响应。你请求,我响应,这不会给程序之间带来沟通问题。其实如果有设计文档,这些提前已经设计好。

    以上是从开发模式上认识某某软件架构。

     

    二、    架构改进

    有了认识必然有一堆想法与建议,以下我用图的形式加以简略说明,这样比较直观。

    1.数据层架构图


    10 数据层架构

    好的数据层一旦建立,随着业务的扩充,一般不做修改,只需要稍微维护即可,在某某架构中,数据层是非常薄弱的,而且被分到OKComm中,这是不独立的,上面的数据层架构比较复杂,但从图可以看出它的最大好处是:跟业务无任何关系,只要是用到数据库的软件都可以用到此数据层,而且数据库是无限制扩展的,因为它是以SOA(面向服务架构)模式搭建,只需要扩展服务即可使用新的数据库,而且借鉴了开源NHibernateORM机制,让业务不出现任何Sql语句,同时与物理表脱离,从而达到数据库一旦修改而不影响业务代码的修改。

    下面是数据库的扩展方式,如图11

     


    11 如何扩展数据库

    2.业务层架构图


    12 业务层架构

    业务层架构相对数据层架构,稍微简单一些,但是随着需求的变化,业务的扩充,业务的比重将是整个架构的核心,从而成为软件企业重复利用的商业业务库。它好比一个工厂在铸造零件,当零件渐渐积累多了,用它们来生产产品将越来越轻松,软件企业亦是如此。

    其实某某架构在业务上做得很不错,只是有一些遗憾,因为它像三层架构,但更像MVC,所以Controller对于某某架构比重占得比较大,如果是MVC架构,那么可以说得过去,但如果它采用的是MVC架构,那么我看到了OKBusiness这样一个项目,所以又不全是MVC架构。

    以上架构图是对某某架构的改进。它增加了业务索引,因为我觉得业务代码像是一个工厂的零件库,而业务索引就像书签,便于查找的作用。同时去掉了Zivosft.Comm这个四不像的项目,因为它似乎什么都是,但却什么都不是,于是我个人文为应该将它部分功能封装在IO层的API中,因为它毕竟是表现层与业务层衔接的枢纽。

    3.表现层架构图


    13 表现层架构图

    如图13,由于SOA架构是面向服务的架构,所以业务层是表现层的服务,那么这就让表现层是最简单的一层,因为它只做界面控制,只需请求业务而已。而实际上某某架构中,刚才业务架构中提到,它的比重却占得比较大,而且是把Zivsoft.CRM与Zivsoft.Controller分开,改起来不方便。在这一层中将Plug-in引入,是因为很多东西可以独立出来,或者应用第三方的组件,某某架构中的DataGrid是一个最典型的见证。而中间件的定义和要求在图13中做了说明。

    三、    总结

    记得大学里数据库老师说过一句话,可以拿到这里做总结。“做任何事,应该把它当做一项工程来做,才能做好。软件工程是一项工程,只有这样认识它,才能做好软件。”,无论是在某某架构中,还是在某某软件开发流程中,最后总结的建议就是:软件必须重视设计,才像软件工程,才能持久做好。

     

  • 相关阅读:
    表表达式,Substring, CharIndex, 多行数据变同一行的用法
    武汉三首,记录备忘,写的不好,以后再改
    竟然又有两年没有码字发帖了,真是快长草了,打磨一下,克服拖延症,重新回归,重新写起!
    屈指一算,竟然有一年半没有发帖了,真是时光荏苒,白云苍狗!
    下雨有感
    (ETW) Event Trace for Windows 提高 (含pdf下载)
    (ETW) Event Tracing for Windows 入门 (含pdf下载)
    Requirejs加载超时问题的一个解决方法:设置waitSeconds=0
    如何通过Socket TCP发送并接收一个文件?
    Microsoft.VisualBasic.DateAndTime.Timer 与 DateTime.Now.TimeOfDay.TotalSeconds 相当
  • 原文地址:https://www.cnblogs.com/GeneralXU/p/1505374.html
Copyright © 2011-2022 走看看