if-else语句优化
代码 if-else 代码太多的缺点
最大的问题是代码逻辑复杂,维护性差,极容易引发 bug
重构 if-else原则
尽可能地维持正常流程代码在最外层——主干代码是正常流程,避免嵌套过深
实现的手段有
减少嵌套、移除临时变量、条件取反判断、合并条件表达式等
实例一:合并条件表达式
重构前
1 double disablityAmount(){
2 if(_seniority < 2)
3 return 0;
4
5 if(_monthsDisabled > 12)
6 return 0;
7
8 if(_isPartTime)
9 return 0;
重构后
1 double disablityAmount(){
2 if(_seniority < 2 || _monthsDisabled > 12 || _isPartTime)
3 return 0;
实例二:改包含关系为平行关系(嵌套无关联性时);废除临时变量
1 double getPayAmount(){
2 double result;
3 if(_isDead) {
4 result = deadAmount();
5 }else{
6 if(_isSeparated){
7 result = separatedAmount();
8 }
9 else{
10 if(_isRetired){
11 result = retiredAmount();
12 else{
13 result = normalPayAmount();
14 }
15 }
16 }
17 return result;
重构后
1 double getPayAmount(){
2 if(_isDead)
3 return deadAmount();
4
5 if(_isSeparated)
6 return separatedAmount();
7
8 if(_isRetired)
9 return retiredAmount();
10
11 return normalPayAmount();
实例三:将条件反转使异常情况先退出;维持正常流程代码在最外层
1 public double getAdjustedCapital(){
2 double result = 0.0;
3 if(_capital > 0.0 ){
4 if(_intRate > 0 && _duration >0){
5 resutl = (_income / _duration) *ADJ_FACTOR;
6 }
7 }
8 return result;
重构后
1 public double getAdjustedCapital(){
2 if(_capital <= 0.0 ){
3 return 0.0;
4 }
5 if(_intRate <= 0 || _duration <= 0){
6 return 0.0;
7 }
8
9 return (_income / _duration) *ADJ_FACTOR;
重构前:
1 /* 查找年龄大于18岁且为男性的学生列表 */
2 public ArrayList<Student> getStudents(int uid){
3 ArrayList<Student> result = new ArrayList<Student>();
4 Student stu = getStudentByUid(uid);
5 if (stu != null) {
6 Teacher teacher = stu.getTeacher();
7 if(teacher != null){
8 ArrayList<Student> students = teacher.getStudents();
9 if(students != null){
10 for(Student student : students){
11 if(student.getAge() > = 18 && student.getGender() == MALE){
12 result.add(student);
13 }
14 }
15 }else {
16 logger.error("获取学生列表失败");
17 }
18 }else {
19 logger.error("获取老师信息失败");
20 }
21 } else {
22 logger.error("获取学生信息失败");
23 }
24 return result;
25 }
重构后:
1 /* 查找年龄大于18岁且为男性的学生列表 */
2 public ArrayList<Student> getStudents(int uid){
3 ArrayList<Student> result = new ArrayList<Student>();
4 Student stu = getStudentByUid(uid);
5 if (stu == null) {
6 logger.error("获取学生信息失败");
7 return result;
8 }
9
10 Teacher teacher = stu.getTeacher();
11 if(teacher == null){
12 logger.error("获取老师信息失败");
13 return result;
14 }
15
16 ArrayList<Student> students = teacher.getStudents();
17 if(students == null){
18 logger.error("获取学生列表失败");
19 return result;
20 }
21
22 for(Student student : students){
23 if(student.getAge() > 18 && student.getGender() == MALE){
24 result.add(student);
25 }
26 }
27 return result;
28 }
实例四:将把 if-else 内的代码都封装成一个公共函数
1 double getPayAmount(){
2 Object obj = getObj();
3 double money = 0;
4 if (obj.getType == 1) {
5 ObjectA objA = obj.getObjectA();
6 money = objA.getMoney()*obj.getNormalMoneryA();
7 }
8 else if (obj.getType == 2) {
9 ObjectB objB = obj.getObjectB();
10 money = objB.getMoney()*obj.getNormalMoneryB()+1000;
11 }
12 return money;
12 }
重构后:
1 double getPayAmount(){
2 Object obj = getObj();
3 if (obj.getType == 1) {
4 return getType1Money(obj);
5 }
6 else if (obj.getType == 2) {
7 return getType2Money(obj);
8 }
9 }
10
11 double getType1Money(Object obj){
12 ObjectA objA = obj.getObjectA();
13 return objA.getMoney()*obj.getNormalMoneryA();
14 }
15
16 double getType2Money(Object obj){
17 ObjectB objB = obj.getObjectB();
18 return objB.getMoney()*obj.getNormalMoneryB()+1000;
19 }
实例五:多态取代条件表达式
重构前:
1 double getSpeed(){
2 switch(_type){
3 case EUROPEAN:
4 return getBaseSpeed();
5 case AFRICAN:
6 return getBaseSpeed()-getLoadFactor()*_numberOfCoconuts;
7 case NORWEGIAN_BLUE:
8 return (_isNailed)?0:getBaseSpeed(_voltage);
9 }
10 }
重构后:
1 class Bird{
2 abstract double getSpeed();
3 }
4
5 class European extends Bird{
6 double getSpeed(){
7 return getBaseSpeed();
8 }
9 }
10
11 class African extends Bird{
12 double getSpeed(){
13 return getBaseSpeed()-getLoadFactor()*_numberOfCoconuts;
14 }
15 }
16
17 class NorwegianBlue extends Bird{
18 double getSpeed(){
19 return (_isNailed)?0:getBaseSpeed(_voltage);
20 }
21 }