体系结构之质量属性
系统的开发之所以需要使用构架,一个重要的原因就是要提高产品的质量。功能相同、品质不同的产品比比皆是同,这时候,一个系统的质量属性就显得尤为重要了。质量属性(quality attributes)就是指影响质量的相关因素,是对质量的描述。主要有可用性(Availability)、可修改性(Modifiability)、性能(Performance)、安全性(Security)、可测试性(Testability)和易用性(Usability),下面将在正在开发的购物商城网站的角度,对它的质量属性进行分析。
首先系统功能主要有前台游客浏览、普通用户操作和后台管理3部分。结合目前网上购物平台系统的设计方案,系统包含了普通用户的购物操作;实现后台用户和商品管理;推荐商品;实现后台对用户、订单、商品的管理这些功能。
如果在用户角度来看的话,首先,一个网站在发布之后,首先给用户展现的是它的界面。界面设计美观大方、简洁明了,会给用户带来很好的第一印象。所以在设计页面时,网站中图片、图标整体都是一个色系,整体性较强,很好地提高了系统的融合性。图标、提示信息直接明了,容易理解,功能的名称没有歧义,让用户一看就知道是干什么的,而不是猜测其作用。使用SSH框架可以使得用户界面与业务层分离开来,所以可以很方便的修改这些界面中细节的结构。进入网站之后,就会有一个网站的LOGO,显示出系统的主题,让用户知道这是一个购物网站。所有功能会在上方的功能栏中进行展示,用户想进行哪项操作直接点击就可以;在系统登录、注册这些二级界面,信息会显示在界面的正中心,用户可以容易地知道怎样进行下一步的操作。整个系统易学易用易理解,这就体现了系统的易用性。
然后,在用户进行登录、注册时, Struts2提供了最简单的验证数据的方法,使用validate在action类中写validate方法那么在执行execute()之前会调用validate方法验证。比如验证用户名,context参数将作为验证User类属性的文件名的一部分,如user属性返回一个User对象,那么用于验证User对象属性的文件名为User-abc-validation.xml。这个文件要和User.class文件在同一个目录中。appendPrefix表示是否在字段里加user,如果为true,Struts2就会使用user.name在form提交的数据中查找要验证的数据。这个属性的默认值是true。如果出错,Struts2会将<message>标签中的信息加到User-abc-validation.xml文件中的相应错误信息前面。这就体现了系统的安全性。
用户登陆之后,就会在网站中选购商品。作为一个购物网站,能够完成的功能最基本的要有一个完整的购物流程,用户首先要进行注册,然后登陆,进行商品查询,选择合适的商品加入购物车,然后填写基本信息,进行订单的提交等。这一系列的流程的每一个细节都要完整,在使用框架的时候,只需要考虑它的业务流程就行了,不需要管界面,数据操作两个相关内容,这样就使得系统开发变得更方便。比如商品订单信息需要包括交易时间,订单号、总金额、收货地址、支付方式、订单状态等,想要添加某一个属性的时候,不用对系统进行很大的变动,只需要利用Spring的特性,在其属性集中加一项就可以了。另外,在用户付款时如果使用银行卡支付,余额不足的话,系统就要给出相应的解决方案,比如要有选择其他支付方式的提示信息;系统数据出现故障,数据库需要具备及时自动恢复的能力。这些都无一例外地体现了系统的可用性。
其次,因为系统是交互式的系统,所以用户可以真切感受到系统的性能。在用户使用系统的过程中,如果系统的响应时间太长会降低用户的体验。虽然现在我们开发系统还不会对响应时间以及吞吐量、最大负载进行优化,但是对开发人员来说这是需要掌握的性能优化。struct2访问或添加request/session/application时,尽量使用静态属性存储数据而不使用Application对象,在Application对象里存储只读类型的数据都将回提高性能;尽量使用InProc模式的Session,这个模式是最快的;(2)在使用Hibernate对数据库进行操作时,关于数据访问方面:尽量使用存储过程返回数据,不要直接在代码中进行查询; 在数据库中只返回有用的数据结果,不要选择不使用的数据段; 尽量一次返回多个数据集而不是每个记录集分别打开一次数据库连接进行查询;(3)关于代码优化: 将循环判定条件放在for语句外;将循环判定条件放在for语句外;避免在循环里创建对象。这些方法都可以在一定程度上提高系统的性能。
由于SSH框架极大地降低了系统的耦合性,在系统界面中,首先通过JSP页面实现交互界面,负责传送按钮点击这些请求(Request)和数据接收这些响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。这使得系统的可修改性大大的得到提升。