java学习(四)代码的设计
一、目的
1、为了使程序员编写的代码更加的简洁,使人阅读起来更加流畅
2、将运算代码与界面代码完全分离开来,利于团队开发,提高团队之间的工作效率
3、 在很短的时间内可以替换整个站点的外观;
4、使程序员可以抽象编程,而无须接触HTML代码;
5、可以重复利用以前的模板。
二、示例
引用前一篇的记忆曲线的JSP文件
1、未进行分离的代码
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ page import = "java.util.Date , java.text.*" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <table border=1> 12 <tr> 13 <td>天数</td> 14 <td>新学习</td> 15 <td>复习前1天</td> 16 <td>复习前2天</td> 17 <td>复习前4天</td> 18 <td>复习前7天</td> 19 <td>复习前15天</td> 20 </tr> 21 <% 22 Date today=new java.util.Date();//向上转型 23 SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); 24 25 int group=72; 26 int days=group+15; 27 for(int i=0;i<days;i++){ 28 29 java.util.Calendar calendar = new java.util.GregorianCalendar(); 30 //String day=today.toString(); 31 //String day=today.getTime()+""; 32 //给日历一个初始时间 33 calendar.setTime(today); 34 //日历可以获取的时间 35 36 calendar.add(java.util.Calendar.DATE,i); 37 String day=sdf.format( calendar.getTime()); 38 String task1="";// 39 String task2=""; 40 String task3=""; 41 String task4=""; 42 String task5=""; 43 String task6=""; 44 //求算任务1 45 if(i<=group-1){ 46 task1=(i+1)+""; 47 } 48 else{ 49 task1="--"; 50 } 51 //求算任务2 52 if(i<=0||i>group){ 53 task2=(i+1)+""; 54 } 55 else{ 56 task2=i+""; 57 } 58 //求算任务3 59 if(i<=(0+1)||(i-1)>=(group+1)){ 60 task3="--"; 61 } 62 else{ 63 task3=(i-1)+""; 64 } 65 //求算任务4 66 if((i-3)<=0||(i-3)>=(group+1)){ 67 task4="--"; 68 69 }else{ 70 task4=(i-3)+""; 71 } 72 //求算任务5 73 if((i-6)<=0||(i-3)>=(group+1)){ 74 task5="--"; 75 76 }else{ 77 task5=(i-6)+""; 78 } 79 //求算任务6 80 if((i-14)<=0||(i-14)>=(group+1)){ 81 task6="--"; 82 83 }else{ 84 task6=(i-14)+""; 85 } 86 87 %> 88 <tr> 89 <td><%=day %></td> 90 <td><%=task1%> </td> 91 <td><%=task2 %></td> 92 <td><%=task3 %></td> 93 <td><%=task4 %></td> 94 <td><%=task5 %></td> 95 <td><%=task6 %></td> 96 </tr> 97 <% 98 } 99 %> 100 </table> 101 </body> 102 </html>
由代码可知:在JSP的代码界面中掺杂了大部分的运算代码,造成了代码的凌乱与耦合,今天的学习目的就是将这段JSP中的运算代码给拿出来,保证JSP代码的纯净
2、进行代码的分离
2.1、纯净化JSP代码
即将JSP中无关页面布局的代码除去,保留有关页面布局的相关代码,以达到JSP的纯净模式
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ page import="java.util.*,java.text.SimpleDateFormat,web.MemTask,web.MemTaskImpl,entity.DayTask" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <table border="1px"> 12 <tr> 13 <td>日期</td> 14 <td>新学习</td> 15 <td>复习前1课</td> 16 <td>复习前2课</td> 17 <td>复习前4课</td> 18 <td>复习前7课</td> 19 <td>复习前15课</td> 20 </tr> 21 <tr> 22 <td><%=item.getDay()%></td> 23 <td><%=item.getTask1()%></td> 24 <td><%=item.getTask2()%></td> 25 <td><%=item.getTask3()%></td> 26 <td><%=item.getTask4()%></td> 27 <td><%=item.getTask5()%></td> 28 <td><%=item.getTask6()%></td> 29 </tr> 30 </table> 31 </body> 32 </html>
2.2、对方法进行封装
先在src中创建名为DayTask的Java文件,并在其中编写定义实现类和实现方法的代码
代码如下:
1 package entity; 2 3 public class DayTask { 4 private String day; 5 private String task1; 6 private String task2; 7 private String task3; 8 private String task4; 9 private String task5; 10 private String task6; 11 public String getDay(){ 12 return day; 13 } 14 public void setDay(String day) { 15 this.day = day; 16 } 17 public String getTask1() { 18 return task1; 19 } 20 public void setTask1(String task1) { 21 this.task1 = task1; 22 } 23 public String getTask2() { 24 return task2; 25 } 26 public void setTask2(String task2) { 27 this.task2 = task2; 28 } 29 public String getTask3() { 30 return task3; 31 } 32 public void setTask3(String task3) { 33 this.task3 = task3; 34 } 35 public String getTask4() { 36 return task4; 37 } 38 public void setTask4(String task4) { 39 this.task4 = task4; 40 } 41 public String getTask5() { 42 return task5; 43 } 44 public void setTask5(String task5) { 45 this.task5 = task5; 46 } 47 public String getTask6() { 48 return task6; 49 } 50 public void setTask6(String task6) { 51 this.task6 = task6; 52 } 53 54 }
2.3、设置接口类
在编写代码是要时刻注意对接口的使用:
1. 从定义中,“接口方法可以在不同的方法被不同的类实现”,说明使用接口能够方便的去扩展,比如你在client中调用了一个接口,以后想用其他的实现,只需要重写一个实现类并扩展工厂就行了。
2. 可复用性,比如大型项目中,将Hibernate换成Ibatis的时候,可以只需要在Spring中配置实现类就可以替换了。接口属性能够方便的配置。
3.项目开发人员的分工,当接口定义好后,不同模块的开发人员可以先根据接口的定义开发自己的模块,提高了开发效率
4.方便早期的设计和以后的扩展。
于是我们需要编写一个接口类MemTask
代码如下:
1 package web; 2 import java.util.List; 3 4 import entity.DayTask; 5 6 public interface MemTask { 7 8 public List<DayTask> getAllTask(int group); 9 10 }
2.4、实现接口类
新建一个MemTaskImpl类文件,该文件中的代码是用来实现MenTask类中的接口,并编写具体的类来实现算法。
1 package web; 2 3 import java.text.SimpleDateFormat; 4 import java.util.ArrayList; 5 import java.util.Calendar; 6 import java.util.Date; 7 import java.util.GregorianCalendar; 8 import java.util.List; 9 10 import entity.DayTask; 11 12 public class MemTaskImpl implements MemTask { 13 14 @Override 15 public List<DayTask> getAllTask(int group) { 16 List<DayTask> dayTaskList = new ArrayList<DayTask>(); 17 18 Date today = new Date(); 19 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 20 // 总次数 21 int days = group + 15; 22 for (int i = 0; i < days; i++) { 23 Calendar calendar = new GregorianCalendar(); 24 // 给日历一个初始时间 25 calendar.setTime(today); 26 // 日历翻页 27 calendar.add(Calendar.DATE, i); 28 DayTask dayTask = new DayTask(); 29 dayTask.setDay(sdf.format(calendar.getTime()) + " "); 30 31 // 求算任务1 32 if (i <= group - 1) { 33 dayTask.setTask1((i + 1) * 2 - 1 + ""); 34 } else { 35 dayTask.setTask1("--"); 36 } 37 38 // 求算任务2 39 if (i <= 0 || i >= (group + 1)) { 40 dayTask.setTask2("--"); 41 } else { 42 dayTask.setTask2(i * 2 - 1 + ""); 43 } 44 45 46 // 求算任务3 47 48 if ((i - 1) <= 0 || (i - 1) >= (group + 1)) { 49 dayTask.setTask3("--"); 50 51 } else { 52 dayTask.setTask3((i - 1) * 2 - 1 + ""); 53 54 } 55 //求算任务4 56 if ((i-3)<=0||(i-3)>=(group+1)){ 57 dayTask.setTask4("--"); 58 59 }else{ 60 dayTask.setTask4((i-3)*2-1+""); 61 62 } 63 //求算任务5 64 if ((i-6)<=0||(i-6)>=(group+1)){ 65 dayTask.setTask5("--"); 66 67 }else{ 68 dayTask.setTask5((i-6)*2-1+""); 69 70 } 71 //求算任务6 72 if ((i-14)<=0||(i-14)>=(group+1)){ 73 dayTask.setTask6("--"); 74 75 }else{ 76 dayTask.setTask6((i-14)*2-1+""); 77 78 } 79 dayTaskList.add(dayTask); 80 } 81 82 return dayTaskList; 83 } 84 85 }
2.5、在JSP界面中成功调用封装的类与方法
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ page import="java.util.*,java.text.SimpleDateFormat,web.MemTask,web.MemTaskImpl,entity.DayTask" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <table border="1px"> 12 <tr> 13 <td>日期</td> 14 <td>新学习</td> 15 <td>复习前1课</td> 16 <td>复习前2课</td> 17 <td>复习前4课</td> 18 <td>复习前7课</td> 19 <td>复习前15课</td> 20 </tr> 21 <% 22 //它的实例创建有2个办法 23 //1.传统的new 对象方法 24 //2.使用ioc注入 25 26 //调用已经封装的方法进行运算 27 MemTask memTask = new MemTaskImpl(); 28 List<DayTask> dayTaskList = memTask.getAllTask(20); 29 for (DayTask item:dayTaskList){ 30 %> 31 <tr> 32 <td><%=item.getDay()%></td> 33 <td><%=item.getTask1()%></td> 34 <td><%=item.getTask2()%></td> 35 <td><%=item.getTask3()%></td> 36 <td><%=item.getTask4()%></td> 37 <td><%=item.getTask5()%></td> 38 <td><%=item.getTask6()%></td> 39 </tr> 40<%} %> 41 </table> 42 </body> 43 </html>
2.6、运行结果
启动Tomcat服务,运行该项目
得到的运行结果和前者的效果是一致的,证明了代码的分离是成功的
三、总结
在Java中web方面的学习中,要努力做到界面代码与运算代码无耦合,各方法之间通过使用接口的方式实现低耦合,清晰的分解出代码与代码之间的相关联系、方法的互相调用,使得代码整洁。