• 质量属性战术


    某某征集系统在设计时所实现的质量属性战术以及原因

    一、 可用性战术(恢复和修复是可用性的重要方面,为了阻止错误发展成故障,至少能够把错误限制在一定的范围内,从而使修复成为可能)

          大家都知道,系统故障是不可避免的,比如系统不能启动、显示黑屏或蓝屏、桌面凝固不动、键盘不能输入、光标不能移动、软件运行非正常中断,再比如应用软件与操作系统不完全兼容,它们之间有冲突或者与硬件固有特性发生冲突等故障。所以对于某某征集系统,在可用性设计时运用了事务的战术,这是因为事务就是绑定几个有序的步骤,以能够立刻撤销整个绑定。如果进程中的一个步骤失败的话,可以使用事务来防止任何数据受到影响,还可以使用事务来防止访问相同数据的几个同时线程之间发生冲突。事务,就是一组操作数据库的动作集合。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

          在某某征集系统中,采用了Spring事务策略,也就是spring事务管理的实现方式。它有一个统一的抽象,是由实现下面这个接口完成的。         org.springframework.transaction.PlatformTransactionManager接口的内容如下:

    Public interface PlatformTransactionManager()

    {  

    TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;  

    Void commit(TransactionStatus status) throws TransactionException;  

    Void rollback(TransactionStatus status) throws TransactionException;  

           不管是声明式的还是编程式的事务管理都需要此抽象来完成,getTransaction() 根据类型为TransactionDefinition的参数返回一个TransactionStatus对象。返回的 TransactionStatus对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务)。如同J2EE事务上下文,一个 TransactionStatus也是和执行的线程关联的。同时,在框架中还存在TransactionDefinition接口,即上边的参数类型。此接口指定了事务隔离程度、事务传播、事务超时、只读状态。另外,还有TransactionStatus接口。这个接口为处理事务提供简单的控制事务执行和查询事务状态的方法。

    spring提供了几个关于事务处理的类: 

    TransactionDefinition //事务属性定义

    TranscationStatus //代表了当前的事务,可以提交,回滚。

    PlatformTransactionManager是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类 AbstractPlatformTransactionManager,我使用的事务管理类例如 DataSourceTransactionManager等都是这个类的子类。

     

    二、可修改性战术(可修改战术的目标是控制实现、测试和部署变更的时间和成本)

         对于某某征集系统的在线填报模块,我采用了信息隐藏的战术。信息隐藏就是把该功能模块的责任分解为更小的部分,并选择使那些基本不变的基础信息成为公有的,那些重要的技术信息成为私有的,可以通过指定的接口获得公有责任。信息隐藏的目的是将变更隔离在一个模块内,防止变更扩散到其他模块。它与“预期期望的变更有很大关系”,因为它使用那些变更作为分解的基础。

    三、性能战术(性能战术的目标就是对在一定的时间限制内到达系统的事件生成一个响应)

         针对于某某征集系统的性能战术,我采用了固定优先级的调度策略,为每个企业的提交请求分配一个特定的优先级,并按该优先级顺序对提交的表单进行审核。该策略能够保证为企业优先级较高的请求提供更好的服务,但是,对一些优先级较低的请求来说,可能要等待很长的时间才能得到服务,因为它前面有很多优先级较高的请求。所有我设计的优先级策略是轮转调度策略,它对请求进行排序,然后在允许的时候,把资源分配给该排序中的下一个请求。轮转的一个特殊形式就是循环执行,在循环执行中,资源分配是每隔一个固定的时间进行的。

    四、 安全性战术(安全性战术分为:与抵抗攻击有关的战术、与检测攻击有关的战术以及从攻击中恢复有关的战术)

          对于某某征集系统来说,安全性要求是非常高的,因为这涉及到某个省份的发展,所以在设计某某征集系统时,安全性问题是至关重要的。首先,我采用了MD5加密, MD5加密算法主要用在用户注册用户名和密码的加密,对于普通强度的口令加密。但是简单的MD5加密是没有办法达到绝对的安全的,因为普通的MD5加密有多种暴力破解方式,因此如果想要保证该征集系统的安全,还需要采用其他的安全性战术。该征集系统开启以后很多地方要用到数据库里的字典数据,比如部门表,归口管理表,这些数据是可变的,但是变化频率很小,所有每次用到的时候都去数据库取数据很明显的是对资源的浪费,所以想按照以前的方法把数据从数据库里读取出来,放到内存,每次用到的时候直接去内存找就可以了。想法应该是没有问题的,可是这个学期需要用到SSH框架,所以另配一个listener和Spring同时启动的做法是不可取的。因为listener的启动机制是线程,并不是按顺序一个一个启动,所有直接在spring的配置文件里,注册bean文件,让 bean文件来执行取数据的工作,但是这个bean显然是不能使用DAO的类,因为DAO层的东西无法注入进来,所以用到的是BeanPostProcessor接口,用类PBSTrackManagerPostProcessor实现它其中的一个方法 postProcessAfterInitialization,这个方法里可以引入一个类GetDictionaryInfo,实现类的方法 getAllInfo(),当getAllInfo去调用DAO层的数据时就可以了。

    五、 可测试性战术(可测试性战术目标是允许在完成一个软件开发的增量后,轻松地对软件进行测试)

          对于某某征集系统,我用Spring整合了JUnit框架进行单元测试代码, AbstractTransactionalSpringContextTests类是 AbstractDependencyInjectionSpringContextTests的直接子类,这个类一般应用在事务相关的测试中,一旦完成每个测试它就会正常地回滚事务,不会真正更新数据库,若要手动设置事务相关操作,可以重载onSetUpInTransaction和 onTearDownInTransaction方法,以便手工开始并提交事务,或者调用setComplete()方法。这个类也可以在没有事务的情况下使用。AbstractTransactionalDataSourceSpringContextTests也是 AbstractTransactionalSpringContextTests的直接子类,它使用了Spring的基于JDBC 的 jdbcTemplate工具类,支持数据库级别的事务。关于在TestCase Class里取得spring context,TestCase Class必须继承四个AbstractXXXSpringContextTests中的其中一个,那么就必须实现 protected abstract String[] getConfigLocations();方法来取得spring context。需要注意要加载的context xml file的路径问题:我的代码是基于classpath,因此applicationContext.xml和hibernate- context.xml必须放在classpath里,也就是把xml files放到WEB-INF/classes目录下,或者是在project properties里把xml files的路径加到classpath里。

    六、易用性战术(易用性与用户完成期望任务的难易程度以及系统为用户提供的支持种类有关)

          在测试过程中,通常会频繁修改用户接口。也就是说,易用性要求开发人员实现对当前接口设计的修改,所以必须对语义一致的可修改性的求精。将用户接口与应用的其余部分分离开来。局部化所期望的变更是语义一致的一个基本原理。因为在开发中和部署后,我们预计用户接口频繁发生变化,因此单独维护用户接口代码将会变更局部化在某个地方。开发用于实现该战术并支持用户接口修改的软件架构模式为:模型——视图——控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。MVC把应用程序分为三个核心模块:模型、视图和控制器,它们分别负担不同的任务:(1)视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能够接受用户的输入数据,但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但不能改变模型,视图还能接受模型发出的数据更新事件,从而对用户界面进行同步更新。(2)模型是应用程序的主要部分。模型表示业务数据和业务逻辑。一个模型能为多个视图提供数据,由于同一个模型可以被多个视图重用,所以提高了应用的可重用性。(3)控制器接受用户的输入并调用模型和视图去完成用户的需求。当Web用户单击Web页面中的提交按钮来发送HTML表单时,控制器接受请求并调用相应的模型去处理请求,然后调用相应的视图来显示模型返回的数据。MVC处理过程,首先控制器接受用户的请求,并决定应调用哪个模型来进行处理;然后模型根据用户请求进行相应的业务逻辑处理,并返回数据;最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈现给用户。

          对于某某征集系统,我用JSP页面生成表示层的内容,让Servlet完成深层次的处理任务,在这里,Servlet充当控制器的角色,负责处理用户请求,创建JSP页面需要使用的JavaBean对象,根据用户请求选择合适的JSP页面返回给用户。在JSP页内没处理逻辑,它仅负责检索原先由Servlet创建的JavaBean对象,从Servlet中提取动态内容插入到静态模板。这是一种有突破性的软件设计方法,它清晰地分离了表达和内容,明确了角色定义以及开发与网页设计的分工。

  • 相关阅读:
    [linux] shell脚本编程-ubuntu创建vsftpd服务
    [linux] C语言Linux系统编程-做成守护进程
    [编程] C语言Linux系统编程-等待终止的子进程(僵死进程)
    [Linux]C语言Linux系统编程创建进程
    [linux] C语言Linux系统编程进程基本概念
    [编程] C语言枚举类型(Enum)
    [编程] C语言结构体指针作为函数参数
    [编程] C语言的二级指针
    [编程] C语言的结构体
    [编程] C语言循环结构计算π的值
  • 原文地址:https://www.cnblogs.com/niujunyan/p/6637901.html
Copyright © 2020-2023  润新知