最近看了一部分《软件开发沉思录》, 感觉里面的“对象健康操”还是蛮有意思的,在这记录下,希望以后自己写的代码能按照这个要求来写。
规则1: 方法只使用一级缩进
每个方法只关注一件事情,提高可重用性
原来的代码如下:
- class Board {
- ...
- String board() {
- StringBuffer buf = new StringBuffer();
- for(int i = 0; i < 10; i++){
- for(int j = 0; j < 10; j++)
- buf.append(data[i][j]);
- buf.append("\n");
- }
- return buf.toString();
- }
- }
重构后的代码如下:
- class Board {
- ...
- String board(){
- StringBuffer buf = new StringBuffer();
- collectRows(buf);
- Return buf.toString();
- }
- Void collectRows(StringBuffer buf){
- for(int i = 0; i < 10; i++)
- collectRow(buf, i);
- }
- Void collectRow(StringBuffer buf, int row){
- for(int i = 0; i < 10; i++)
- buf.append(data[row][i]);
- buf.append("\n");
- }
- }
规则2: 拒绝使用else关键字
层层嵌套的条件判断往往令人眩晕,另外条件判断结构通常还是重复代码的来源; 可以通过return提前,三元运算符,多态等方式来避免使用else
原来代码:
- public static void endMe(){
- if(status == DONE){
- doSomething();
- }else{
- doSomethingElse();
- }
- }
重构后代码:
- public static void endMe(){
- if(status == DONE){
- doSomething();
- return;
- }
- doSomethingElse();
- }
原来代码:
- public static Node head(){
- if(isAdvancing()){
- return first;
- }else{
- return last;
- }
- }
重构后代码:
- public static Node head(){
- return isAdvancing() ? first : last;
- }
另外,如果根据状态进行分支选择的代码大量地重复,那么就应该考虑使用策略模式或者反射的方式去解决。
规则3: 封装所有的原生类型和字符串
方法名中应该描述清楚参数的意思
规则4:一行代码只有一个“.”运算符
一行中如果有多个".", 而且这些“.”都是彼此联系的,那么你的对象就已经深深地陷入到另一个对象之中了。这些过量的“.”说明你破坏了封装性。尝试着让对象为你做一些事情,而不要窥视对象内部的细节。封装的主要含义就是,不要让类的边界跨入到它不应该知道的类型中。
原来代码:
- class Board{
- ...
- class Piece{
- ...
- String representation;
- }
- class Location{
- ...
- Piece current;
- }
- String boardRepresentation(){
- StringBuffer buf = new StringBuffer();
- for(Location l : squares())
- buf.append(l.current.representation.substring(0, 1));
- return buf.toString();
- }
- }
重构后