如何在代码层实现可修改性战术

要想在代码层实现可修改性战术首先得了解什么是可修改性

可修改性描述了程序能够被正确修改的难易程度。一个可修改的程序应当是可理解的、通用的、简单的、灵活的。通用性是指程序适用于各种功能变化而无需修改。灵活性是指能够容易地对程序进行修改。
以下因素也会对系统的可维护性产生重要影响:
  (1)开发人员是否受过严格的规范化培训。
  (2)是否采用标准化的文档资料结构和文档形成机制。
  (3)是否采用可维护的程序设计语言
  (4)是否有健全程序的文档。
  (5)是否保存规范化的测试资料等。

可修改性可以分为三大类:

(1)局部化修改一目标是减少由某个变更直接影响的模块的数量

A、维持语义的一致性。(*语义的一致性是指模块中责任之间的关系,目标是确保所有这些责任都能协同工作,不需要过多得依赖别的模块。子战术:”抽象通用模块“。)

B、预期期望的变更。(*子战术:泛化该模块;限制可能的选择。)

理解:类似于servlet对于方法的方法的封装,在更改或者增加方法时无需对原来的方法进行修改,也无需改变原来的模块数量

下面代码为代码结构:

局部化修改
packagecom.hjf.servlet;importjava.io.IOException;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.hjf.entity.Course;importcom.hjf.service.CourseService;@WebServlet("/CourseServlet")publicclassCourseServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;CourseServiceservice=newCourseService();/***方法选择*/protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{req.setCharacterEncoding("utf-8");Stringmethod=req.getParameter("method");if("add".equals(method)){add(req,resp);}elseif("del".equals(method)){del(req,resp);}elseif("update".equals(method)){update(req,resp);}elseif("search".equals(method)){search(req,resp);}elseif("getcoursebyid".equals(method)){getCourseById(req,resp);}elseif("getcoursebyname".equals(method)){getCourseByName(req,resp);}elseif("list".equals(method)){list(req,resp);}}/***添加*@paramreq*@paramresp*@throwsIOException*@throwsServletException*/privatevoidadd(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");Stringname=req.getParameter("name");Stringteacher=req.getParameter("teacher");Stringclassroom=req.getParameter("classroom");Coursecourse=newCourse(name,teacher,classroom);//添加后消息显示if(service.add(course)){req.setAttribute("message","添加成功");req.getRequestDispatcher("add.jsp").forward(req,resp);}else{req.setAttribute("message","课程名称重复,请重新录入");req.getRequestDispatcher("add.jsp").forward(req,resp);}}/***全部*@paramreq*@paramresp*@throwsServletException*/privatevoidlist(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");List<Course>courses=service.list();req.setAttribute("courses",courses);for(inti=0;i<courses.size();i++){System.out.println(courses.get(i).getName());}req.getRequestDispatcher("list.jsp").forward(req,resp);}/***通过ID得到Course*@paramreq*@paramresp*@throwsServletException*/privatevoidgetCourseById(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");intid=Integer.parseInt(req.getParameter("id"));Coursecourse=service.getCourseById(id);req.setAttribute("course",course);req.getRequestDispatcher("detail2.jsp").forward(req,resp);}/***通过名字查找*跳转至删除*@paramreq*@paramresp*@throwsIOException*@throwsServletException*/privatevoidgetCourseByName(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");Stringname=req.getParameter("name");Coursecourse=service.getCourseByName(name);if(course==null){req.setAttribute("message","查无此课程!");req.getRequestDispatcher("del.jsp").forward(req,resp);}else{req.setAttribute("course",course);req.getRequestDispatcher("detail.jsp").forward(req,resp);}}/***删除*@paramreq*@paramresp*@throwsIOException*@throwsServletException*/privatevoiddel(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");intid=Integer.parseInt(req.getParameter("id"));service.del(id);req.setAttribute("message","删除成功!");req.getRequestDispatcher("del.jsp").forward(req,resp);}/***修改*@paramreq*@paramresp*@throwsIOException*@throwsServletException*/privatevoidupdate(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");intid=Integer.parseInt(req.getParameter("id"));Stringname=req.getParameter("name");Stringteacher=req.getParameter("teacher");Stringclassroom=req.getParameter("classroom");Coursecourse=newCourse(id,name,teacher,classroom);service.update(course);req.setAttribute("message","修改成功");req.getRequestDispatcher("CourseServlet?method=list").forward(req,resp);}/***查找*@paramreq*@paramresp*@throwsServletException*/privatevoidsearch(HttpServletRequestreq,HttpServletResponseresp)throwsIOException,ServletException{req.setCharacterEncoding("utf-8");Stringname=req.getParameter("name");Stringteacher=req.getParameter("teacher");Stringclassroom=req.getParameter("classroom");List<Course>courses=service.search(name,teacher,classroom);req.setAttribute("courses",courses);req.getRequestDispatcher("searchlist.jsp").forward(req,resp);}}

 

 

 

(2)防止连锁反应一一目标是限制对局部化的模块的修改,以防止对某个模块的修改间接地影响到其他模块

A、信息隐藏(*最大化实现模块分解,最大化的隐藏私有信息)
                       B、维持现有的接口。添加接口(*来维持现有接口签名);添加适配器(*包装原类,并提供原始签名);提供一个占位程序
                       C、限制通信路径(*减少共享数据数量)
                       D、使用仲裁者。

理解: 在封装方法时,方法仅仅负责独立完成该方法所应该完成的功能,与其他方法并没有联系,在某个方法进行更改时并不会影响到除被更改方法以外的其他方法,不会产生连锁反应对程序的影响不会很大

代码如下:

Methods

两种方法中其中一个方法被修改不会影响到另一个方法的正常执行

 

(3)延迟绑定时间一一目标是控制部署时间并允许非开发人员进行修改

                         A、运行时注册(*即插即用)
                         B、配置文件(*启动时设置参数)
                         C、多态(*后期绑定)
                         D、组件更换(*允许载入时间绑定)
                         E、遵守已定义的协议(*允许独立进程的运行时绑定)

 

posted @ 2020-03-05 17:53  锦瑟流年3344  阅读(176)  评论(0编辑  收藏  举报