31天学习重构(java)---2.移动方法
点击进入->31天学习重构(java)目录
本例子介绍了“移动方法”,当一个类中的方法与另一个类由太多的关联而形成了高度耦合,我们就应该思考:这个方法是否应该移动到另一个类中。
下面举个例子:一个学生和成绩的例子
public class Achievement {//成绩类
private double English;
private double Chinese;
private double math;
public Achievement( double English ,double Chinese,double math ){
this.English = English ;
this.Chinese = Chinese ;
this.math = math ;
}
public double getEnglish() {
return English;
}
public void setEnglish(double english) {
English = english;
}
public double getChinese() {
return Chinese;
}
public void setChinese(double chinese) {
Chinese = chinese;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
}
public class Student {//学生类
private Achievement achievement;//学生的成绩类
//省略学生 姓名,学号.....等一些细节
public double getTotalScore( ){
return achievement.getChinese() +
achievement.getEnglish() +
achievement.getMath();
}
public double getTotalCredit( ){//获得总学分,假设每门课都是1.0学分,且60分及格.
double totalCredit = 0 ;
if( achievement.getChinese() >= 60 )
{
totalCredit += 1.0 ;
}
if( achievement.getEnglish() >= 60 )
{
totalCredit += 1.0 ;
}
if( achievement.getMath() >= 60 )
{
totalCredit += 1.0 ;
}
return totalCredit;
}
public Achievement getAchievement() {
return achievement;
}
public void setAchievement(Achievement achievement) {
this.achievement = achievement;
}
}
从上面的例子可以看出
getTotalCredit和
getTotalScore 方法的实现部分 全部都是使用了
Achievement类的一些方法,因此这些方法很需要被移动到
Achievement类中
下面是移动后的代码:
public class Student {//学生类
private Achievement achievement;//学生的成绩类
//省略学生 姓名,学号.....等一些细节
public double getTotalScore( ){
return achievement.getTotalScore();
}
public double getTotalCredit( ){//获得总学分,假设每门课都是1.0学分,且60分及格.
return achievement.getTotalCredit();
}
public Achievement getAchievement() {
return achievement;
}
public void setAchievement(Achievement achievement) {
this.achievement = achievement;
}
}
public class Achievement {//成绩类
private double English;
private double Chinese;
private double math;
public Achievement( double English ,double Chinese,double math ){
this.English = English ;
this.Chinese = Chinese ;
this.math = math ;
}
public double getTotalCredit( ){//获得总学分,假设每门课都是1.0学分,且60分及格.
double totalCredit = 0 ;
if( getChinese() >= 60 )
{
totalCredit += 1.0 ;
}
if( getEnglish() >= 60 )
{
totalCredit += 1.0 ;
}
if( getMath() >= 60 )
{
totalCredit += 1.0 ;
}
return totalCredit;
}
public double getTotalScore( ){
return getChinese() + getEnglish() + getMath();
}
public double getEnglish() {
return English;
}
public void setEnglish(double english) {
English = english;
}
public double getChinese() {
return Chinese;
}
public void setChinese(double chinese) {
Chinese = chinese;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
}
总结:如果一个类的方法中大量包含了另一个类的方法或成员,也就是大量使用另一个类里的资源,我们就应该思考这个类是不是被赋予了一些自己不该完成的功能,是不是应该把一部分功能移动到其他对应的类中?移动后对是否对以后的维护和扩展都有很大的帮助?。是否需要移动还需考虑许多情况。