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方面的学习中,要努力做到界面代码与运算代码无耦合,各方法之间通过使用接口的方式实现低耦合,清晰的分解出代码与代码之间的相关联系、方法的互相调用,使得代码整洁。

 

原文地址:https://www.cnblogs.com/Mingsnow/p/6858273.html