复杂方法的开发-分治策略
软件开发的关键在于应用抽象的概念。
方法抽象是通过将方法的使用和它的实现分离来实现的。
用户在不知道方法是如何实现的情况下,就可以使用方法。
方法的实现细节封装在方法内,对使用该方法的用户来说是隐藏的。这就被称为信息隐藏或者个封装。
如果决定改变方法的实现,但只要不改变方法签名,用户的程序就不会受到影响。
方法的实现对用户隐藏在“黑匣子”中
我们前面编写过一些方法,也使用过一些方法。
我们知道,作为方法的使用者,并不需要知道它们是如何实现的。
方法抽象的概念可以应用于程序的开发过程中。
当编写一个大程序时,可以使用“分治”策略,也成为逐步求精,将大问题分解成为子问题。
子问题又分解成更小、更容易处理的问题。
例如,想要编写方法实现如下图的输入年月,得到月份日历表的程序:
1、分治策略的首先是分析需求,将需求拆分成各个部分
1)、接受输入
public int[] readInput(){...}
2)打印月历
public void printMonth(int[] date)
1))、打印月份头
public void printHead(int[] date)
2))、打印月份体
public void printBody(int[] date)
简单的方法拆分之后,我们先完成部分的代码编写
public static void main(String[] args) {
PrintMonth printMonth = new PrintMonth();
printMonth.printMonthDate();
}
public void printMonthDate(){
int[] date = readInput();
printDate(date);
}
private void printDate(int[] date){
printHead(date);
printBody(date);
}
private void printHead(int[] date){
System.out.println("\t\t\t"+ date[0] + " " + transferMonth(date[1]));
System.out.println("------------------------------------------------");
System.out.println("Sun \t Mon \t Tue \t Wed \t Thu \t Fri \t Sat ");
}
private String transferMonth(int month){
switch (month){
case 0: return "January";
case 1: return "February";
case 2: return "March";
case 3: return "April";
case 4: return "May";
case 5: return "June";
case 6: return "July";
case 7: return "August";
case 8: return "September";
case 9: return "October";
case 10: return "November";
case 11: return "December";
default: return "";
}
}
private void printBody(int[] date){
}
private int[] readInput(){
Scanner sc = new Scanner(System.in);
int[] date = new int[2];
System.out.println("请输入完整的年,大于1919:");
date[0] = sc.nextInt();
System.out.println("请输入完整的月");
date[1] = sc.nextInt();
return date;
}
我们发现,打印月份体代码比较复杂,因此我们先只写了一个空的方法声明,将其他代码部分完成并简单测试,为了不影响程序效果,可以将方法体置空,或者方法体内模拟数据执行。
现在再来分析打印方法体:
1、打印空格
public void printSpace(int week)
2、打印数字
public void printDayNumber(int week, int monthDay)
打印空格和打印数字需要两个数据:
1、当月第一天是星期几
getFirstDayWeek(int year, int month)
2、本月有多少天
getMonthDayCount(int month)
对应编写方法与测试:
private void printBody(int[] date){
boolean isLeap = isLeapYear(date[0]);
int firstDayWeek = getFirstDayWeek(date[0], date[1]);
int monthDayCont = getMonthDayCount(date[1], isLeap);
printSpace(firstDayWeek);
printDayNumber(firstDayWeek, monthDayCont);
}
private void printSpace(int week){
for (int i= 0; i< week-2; i++){
System.out.print(" \t");
}
}
private void printDayNumber(int week, int monthDay){
int dayStart = 1;
while(dayStart
分治策略,指的就是将问题拆分成为多个子问题,然后挑简单的先完成,这样,就不会出现问题太过复杂而难以下手的情况了。