如何在系统层次实现六种质量属性战术
本篇博客主要对如何在代码层次实现六种质量属性。
在用代码对六大质量属性之前,首先简单的介绍一下,六大质量属性是什么,为什么要用这些属性。首先六大质量属性战术包括 :可用性战术、可修改性战术、、性能战术、安全性战术、可测试性战术、易用性战术
可用性战术:
可用性战术将会组织错误发展为故障,或者至少能够把错误的影响限制在一定的范围内。从而使系统恢复成为可能。维持可用性的方法包括:错误检测,自动恢复,错误预防
错误检测——用来检测故障的某种类型的健康监视;
自动恢复——检测到故障时某种类型的恢复;
错误预防——阻止错误演变为故障。
try {
Patient patient = PatientService.login(userName, password);
if(patient!=null) {
session.setAttribute("user", patient);
session.setAttribute("type", type);
session.setAttribute("ctime", current);
resp.sendRedirect("homeDoctorAndPatient.jsp");
}else {
req.setAttribute("error", "用户名或密码错误");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
如上述代码,就是利用try catch语句对错误进行提前的处理,如果发生错误之后程序会按照人们预先设定的结果做出相应的反应,以达到系统的可用性。
可用性战术的具体总结如下所示
可修改性
可修改性战术的目标是控制实现、测试和部署变更的时间和成本。
可修改性战术具体可以分为三类分别为: 局部化修改,防止连锁反应, 延迟绑定事件
局部化修改——目标是减少由某个变更直接影响的模块的数量;
防止连锁反应——目标是限制对局部化的模块的修改,以防止对某个模块的修改间接地影响到其他模块;
延迟绑定时间——目标是控制部署时间并允许非开发人员进行修改。
list = RegRecordService.showPatientRecord(patientId); for(RegRecord record:list) { System.out.println(record.getRegtime()); System.out.println(record.toString()); }
如上述代码所示,我对dao层的某方法进行调用,我没有直接调用dao层对象,而是将相应的dao方法在servlet中调用,然后在service中调用servlet方法,最终我调用service方法,这样我有不同的业务需求时,不用修改过多的调用dao层的文件,只需修改service层相应的方法即可
可修改性的总体流程如下所示
性能战术
性能战术的目标是对一定的时间限制内到达系统的事件生成一个响应,这些事件可以是消息到达、定时器到时,系统状态的变化。
性能资源控制包括三个分类:资源需求、资源管理、资源仲裁
资源需求——分析影响性能的资源因素
资源管理——提高资源的应用效率
资源仲裁——解决资源的争用
对于系统的性能资源控制,我认为对sql语句的优化就相当于对资源进行查询,不同的sql语句对于系统的性能影响是巨大的,如下图所示,对下属的sql进行性能优化,会使系统的性能得到大大的提高。
if(record.getPatientId() != null) {
_sql +=" and patientid = ?";
_list.add(record.getPatientId());
}
if(StringUtils.isNoneBlank(record.getPatientName())) {
_sql +=" and patient.name like ?";
_list.add("%"+record.getPatientName()+"%");
}
if(StringUtils.isNoneBlank(regtime)) {
_sql +=" and regtime like ?";
_list.add("%"+regtime+"%");
}
Object[] arr = new Object[_list.size()];
System.out.println("_listsize"+_list.size());
for(int i = 0;i<_list.size();i++) {
arr[i] = _list.get(i);
}
String sql = "select reg_record.*,dept.name as deptname,patient.name as patientname from reg_record,patient,dept where reg_record.patientid=patient.id and reg_record.deptid=dept.id and reg_record.deptid="+deptId+_sql;
System.out.println(sql);
系统性能战术的具体分类如下图所示
安全性战术
安全性战术包括抵抗攻击的战术、检测攻击的战术和从攻击从恢复的战术。
如下图所示,对用户的什么进行检测,不同用户登陆后所具有的功能界面是不不同的,所以可以使得不同的角色只能够使用自己相应的功能
图二是使用MD5对数据进行加密,防止数据库中的数据被窃取
<div class="tittle"> 病房挂号系统 </div> <form action="login" method="post"> <div class="u"> <input type="text" class="userName" name="userName" placeholder="用户名"/> </div> <div class="p"> <input type="password" name="password" class="pwd" placeholder="密码"/> </div> <div class="s"> <select name="type"> <option value="">请选择登录类型</option> <option value="0" >医生</option> <option value="1" >病人</option> </select> </div>
/* * 1.一个运用基本类的实例 * MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。 * 任何时候都可以调用 reset 方法重置摘要。 * 一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。 * 对于给定数量的更新数据,digest 方法只能被调用一次。 * 在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。 */ public static String encrypByMd5(String context) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(context.getBytes());//update处理 byte [] encryContext = md.digest();//调用该方法完成计算 int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < encryContext.length; offset++) {//做相应的转化(十六进制) i = encryContext[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } return buf.toString(); // System.out.println("32result: " + buf.toString());// 32位的加密 // System.out.println("16result: " + buf.toString().substring(8, 24));// 16位的加密 } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /* * 2.使用开发的jar直接应用 * 使用外部的jar包中的类:import org.apache.commons.codec.digest.DigestUtils; * 对上面内容的一个封装使用方便 */ public static void main(String[] args) { System.out.println(MD5.encrypByMd5("e10adc3949ba59abbe56e057f20f883e")); }
安全性战术的总体实现如下图所示
可测试性战术
可测试性战术的目标是允许在完成软件开发的一个增量后,轻松地对软件进行测试
下图几位监视代码的路径问题,对代码的请求进行过滤
public static String excludeString; @Override public void init(FilterConfig filterConfig) throws ServletException { excludeString = filterConfig.getInitParameter("exclude"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest)request; HttpServletResponse httpServletResponse = (HttpServletResponse)response; httpServletRequest.setAttribute("basePath",PathUtils.getBasePath(httpServletRequest)); chain.doFilter(httpServletRequest, httpServletResponse); }
易用性战术
易用性与用户完成期望任务的难易程度以及系统为用户提供的支持种类有关。
通过为用户提供关于系统正在做什么的反馈,以及为用户提供发出基于易用性命令的能力来增强易用性,如帮助、撤销、取消等。
比如代码中的各种快捷键。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix