《代码整洁之道》读书笔记六


 有意义的命名

 1.一旦发现有更好的名称,就换掉旧的

 2.名副其实

    如果名称需要注释来补充,就不是名副其实

 3.避免误导

   做有意义的区分

   使用读得出来的名称

   使用可搜索的名称

      如:MAX_CLASSES_PRE_STUDENT

 4.类名

    类名和对象名应该是名词或名词短语,如Customer WikiPage Account

    AddressParser

    不应该是动词

 5.方法名

     应该是动词或动词短语,如postPayment deletePage save

     属性访问器、修改器、断言,应该根据其命名前加上get、set、is前缀

函数

1.短小是函数的第一规则

2.只做一件事,做好这件事

3.每个函数一个抽象层级

   如 getHtml() 高

      PathParser.render(pagePath) 中

      .append("\n") 低

   函数中混杂不同的抽象层级,会让人迷惑

   自顶向下读代码:向下规则

4.函数参数

  最理想的参数是零(零参数函数),其次是一,尽量避免三个参数及以上的函数

  从测试角度,参数越多越难测

5.转换结果的函数应该体现在返回值

6.应该尽量将二元函数转换为一元函数(元:参数个数)

7.参数对象

  如果函数看来需要三个或以上参数,说明其中一些参数应该封闭为类

  如:

    Circle makeCircle(double x, double y, double radius);

    |

    Circle makeCircle(Point center, double radius);

  从参数创建对象,从而减少参数数量,当一组参数被共同传递,往往就是该有自己名称的某个概念的一部分

8.动词与关键词

  给函数取好名字,能较好地解释函数的意图,以及参数的顺序和意图

  如一元函数 writeFile(name) 动词/名词

  将参数的名称编码成函数名,如

   assertEqual->assertExceptedEqualsActual(excepted, actual)

9.避免使用输出参数,如果函数必须修改某种状态,就修改所属对象的状态

    面向对象语言中对输出参数的大部分需要已经消失,因为this也有输出参数的意味

10.分隔指令与询问

    public boolean set(String attribute, String value);

    

    if(set("username", "unclebob"))...

    上述为指令与询问都在set函数中,应该改为

    if(attributeExists("username")) {

        setAttribute("username", "unclebob")

    }

11.使用异常替代返回错误码

    try {

        deletePage(page);

        registry.deleteReference(page.name);

        configKeys.deleteKey(page.name.makeKey());

    }catch (Exception e) {

        logger.log(e.getMessage())

    }

    

    完美的隔离(try catch 代码块主体抽离 )

    public void delete(Page page) {

        try{

            deletePageAndAllReferences(page);

        }catch (Exception e) {

            logError(e);

        }

    }

    private void deletePageAndAllReferences(Page page) throws Exception {

        deltePage(page);

        registry.deleteReference(page.name);

        configKeys.deleteKey(page.name.makeKey());

    }

    private void logError(Exception e)

    {

        logger.log(e.getMessage());

    }

12.错误处理就是一件事

   如上述代码,如果关键词try在某个函数中存在,它就是该函数的第一个单词,而且在catch/finally代码块后面也不该有

   其他的内容

13.依赖磁铁

   public enum Error {

        OK,

        INVALID,

        NO_SUCH,

        LOCKED;

   }

    

   使用异常替代错误码,新异常就可以从异常类派生出来,无需重新编译或重新部署

14.重复可能是软件中一切邪恶的根源



TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
Bing Webmaster Portal Back