`
flynewton
  • 浏览: 59730 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

《软件开发沉思录》之对象健身操

J# 
阅读更多

关键字: 编码规范

最近看了一部分《软件开发沉思录》, 感觉里面的“对象健康操”还是蛮有意思的,在这记录下,希望以后自己写的代码能按照这个要求来写。

规则1: 方法只使用一级缩进

每个方法只关注一件事情,提高可重用性

原来的代码如下:

  1. class Board {  
  2.     ...  
  3.     String board() {  
  4.         StringBuffer buf = new StringBuffer();  
  5.         for(int i = 0; i < 10; i++){  
  6.             for(int j = 0; j < 10; j++)  
  7.                 buf.append(data[i][j]);  
  8.             buf.append("\n");  
  9.         }  
  10.         return buf.toString();  
  11.     }  
  12. }  

重构后的代码如下:

  1. class Board {  
  2.     ...  
  3.     String board(){  
  4.         StringBuffer buf = new StringBuffer();  
  5.         collectRows(buf);  
  6.         Return buf.toString();  
  7.     }  
  8.   
  9.     Void collectRows(StringBuffer buf){  
  10.         for(int i = 0; i < 10; i++)  
  11.             collectRow(buf, i);  
  12.     }  
  13.   
  14.     Void collectRow(StringBuffer buf, int row){  
  15.         for(int i = 0; i < 10; i++)  
  16.             buf.append(data[row][i]);  
  17.         buf.append("\n");  
  18.     }  
  19. }  

规则2: 拒绝使用else关键字

层层嵌套的条件判断往往令人眩晕,另外条件判断结构通常还是重复代码的来源; 可以通过return提前,三元运算符,多态等方式来避免使用else

原来代码:

  1. public static void endMe(){  
  2.     if(status == DONE){  
  3.         doSomething();  
  4.     }else{  
  5.         doSomethingElse();    
  6.     }  
  7. }  

重构后代码:

  1. public static void endMe(){  
  2.     if(status == DONE){  
  3.         doSomething();  
  4.         return;  
  5.     }  
  6.     doSomethingElse();  
  7. }  

原来代码:

  1. public static Node head(){  
  2.     if(isAdvancing()){  
  3.         return first;  
  4.     }else{  
  5.         return last;  
  6.     }  
  7. }  

重构后代码:

  1. public static Node head(){  
  2.     return isAdvancing() ? first : last;  
  3. }  

另外,如果根据状态进行分支选择的代码大量地重复,那么就应该考虑使用策略模式或者反射的方式去解决。

规则3: 封装所有的原生类型和字符串

方法名中应该描述清楚参数的意思

规则4:一行代码只有一个“.”运算符

一行中如果有多个".", 而且这些“.”都是彼此联系的,那么你的对象就已经深深地陷入到另一个对象之中了。这些过量的“.”说明你破坏了封装性。尝试着让对象为你做一些事情,而不要窥视对象内部的细节。封装的主要含义就是,不要让类的边界跨入到它不应该知道的类型中。

原来代码:

  1. class Board{  
  2.    ...  
  3.    class Piece{  
  4.        ...  
  5.        String representation;  
  6.    }  
  7.   
  8.    class Location{  
  9.        ...  
  10.        Piece current;  
  11.    }  
  12.   
  13.    String boardRepresentation(){  
  14.        StringBuffer buf = new StringBuffer();  
  15.        for(Location l : squares())  
  16.            buf.append(l.current.representation.substring(01));  
  17.        return buf.toString();  
  18.    }  
  19. }  

相关推荐

Global site tag (gtag.js) - Google Analytics