温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

<<代码整洁之道(clean code)>>读书重点笔记

发布时间:2020-07-20 08:19:11 来源:网络 阅读:1578 作者:落寞三少 栏目:软件技术

整洁的代码

1.习艺之要

   1).知:习得有关原则、模式和实践的知识,穷尽应知之事,并且要对其了如指掌

   2).行:通过刻苦实践掌握它


2.阅读本书原因

  1)。你是个程序员

  2)。你想成为更好的程序员


3.勒布朗法则:

   稍后等于永不


4.花时间保持代码整洁不但有关效率,还有关生存


5.程序员遵从不了解混乱风险的经理的意愿,也是不专业的做法


6.赶上期限的唯一方法,做得快的唯一方法----就是始终尽可能保持代码整洁


7.破窗理论


8.整洁的代码只做好一件事

  力求集中,每个函数、每个类、模块都全神贯注于一事,完全不受四周细节的干扰和污染


9.整洁的代码应当明确展现出要解决问题的张力


10.简单代码规则:

       按重要顺序:

          .能通过所有测试

           没有重复代码

           体现系统中的全部设计理念

           包括尽量少的实体,比如类、方法、函数等

   无重复代码:

        如果同一段代码反复出现,就表示某种想法未在代码中得到良好的体现,应该尽力

        去找出到底那是什么,然后再尽力更清晰地表达出来


 11.提高表达力

    1)。有意义的命名

    2)。只做一件事

    3)。小规模抽象


 12.想要干得快、想要早点做完、想要轻松写代码,先让代码易读



 有意义的命名


 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.重复可能是软件中一切邪恶的根源


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI