它山之石,可以攻玉,在软件开发领域,借鉴前人们的经验是一个快速提升的捷径,而代码大全作为编程的最佳实践,它讲了很多实际开发中可能并没有考虑到的情况,然而随着编程经验的丰富可能会犯很多人犯过的错误,它告诉我们很多不必要的错误是可以避免的,但是需要你遵循规范来进行软件构建这项活动。
一些有创造精神的程序员,他们都有一个很明显的特点,就是特别聪明,他们将各种标准规范和前人的经验看成是束缚其创造力的东西,我以前也是这样认为的,但工作中发现当代码量一旦超过2万行,如果抽象的不好的话,每天的时间就是在代码中翻来翻去的,效率非常之低,而代码大全2是刚进入公司时每个人的标配,人手一本,刚来时比较忙,幸好后来有时间,就给自己定了个计划,抽了3个月的时间,天天没事时就看这本书,经典就是经典,确实受益匪浅。
我就我感受很深的几个部分,和大家做个分享,权当抛砖引玉,有不对之处,虚心接受指正。

软件构建的首要技术使命就是管理复杂度

没有谁的大脑能装得下一个现代的计算机程序,也就是说作为一名软件开发人员,我们不应该试着
在同一时间把整个程序都塞进自己的大脑,而应该试着以某种方式去组织程序,以便能够在一个时 刻可以专注于一个特定的部分

首先要明白两点
第一是:要相信阅读代码的次数要远远大于编写代码的次数
第二是:程序首先是为人写的,其次才是为机器
在本书中围绕复杂度这个中心也讲了很多话题,比如变量、语句等这些编程的基本要素,还有如何构建一个类、如何构建一个高质量的子程序、防御式编程、命名、重构、代码布局等等一系列话题,可谓不无巨细。不过深入理解一下,这些内容都是复杂度这个中心话题展开的,也就是软件构建的首要技术使命就是管理复杂度,,而这些方法论产生的根源就在于人脑恒久不变的智力水平同计算机日益增强的计算能力以及软件项目复杂程度之间的矛盾。书中常常会提到几个数字,差不多在7左右变化,对于人的理解力来说,7是一个神奇的数字,心理学研究发现,通常人类很难公式记住超过7个单位的信息,这一发现已经应用于各种领域了,因为这是人脑智力管理的极限,多了,就管不过来了,比如:

  • 类成员变量应该控制在7加减2(即5个或9个)
  • 继承层次应该限制在最多6层之内,类与类之间有依赖、关联、聚合、组合、实现、继承六种关系,而继承是这6种关系中耦合程度最强的一种,因为父类变子类也会变,子类应该保存父类中的所有假设。继承出现的常见场景有:A是一个B以及利用继承去消除大量的case语句,如果A有一个B,则应该使用聚合或组合。对于继承说这么多,是因为继承往往会让你和软件构建的首要技术使命(即管理复杂度)背道而驰,从控制复杂度的角度来说,你应该对继承持有非常歧视的态度
  • 把子程序的参数个数控制在7个之内,其实,别说7个了,没有现代IDE的帮助,我连4个以上的参数我都记不住
  • 小心危险的深层嵌套,像于If,循环,要保持嵌套层次不能多于6层,而据实际调查,一般3层以上的嵌套就会使程序员非常的困惑和抓狂了

想要管理复杂度,从作者的书中总结一下,大概有以下几点:

  • 分割并隐藏信息,既然大脑管不过来,那就把系统进行分割,也就是从设计角度上抽象出若干个部分,并将各个部分的变化隐藏在其内部,集中控制它,并且要针对接口编程,只要接口不变,不管每个部分的内部如何变化,都不会将变化波及其他部分,而良好的类接口就像是冰山一角一样,让类的大部分内容都不会暴露出来
  • 清晰的表达,也就是增加程序的可读性,书上也围绕着这个不断的论述,上面提到那些事无巨细的部分反复的说着这一点,甚至连命名都有专门的一章来讨论
    这样下来每次大脑就focus在一个部分上,这点我是有深刻体会,虽然我现在完全自己做的东西超不过30000行,不过也不能妄想自己把所有的部分都记住,如果抽象的不好的话,我就特别头疼,每天在代码中翻来翻去的,效率非常低。

命名

良好的编程习惯是:恰当的注释、良好的变量和子程序命名方式。

命名不仅仅局限在变量和子程序,也包括为类、包、文件以及其他的编程实体命名,通常命名你需要注意以下三个方面:

  • 变量的种类(它代表什么)
  • 数据的种类(常量、简单变量、用户自定义类型或类、BOOL变量、临时变量、循环下标),对于不同的类型,命名的方式是不一样的
  • 变量的作用域(私有的、类的、包的、全局的)
  • 一个好记的名字应该反映其意图,即这个变量是用去做什么,并非是什么

注释

注释应说明代码的意图,如果将要注释的代码片段换成同样功能的子程序,注释就像为子程序命名一样
伪代码开发过程

其他

通常来说,在一个类中,公有方法、保护方法、私有方法所完成的任务总是呈现一种逐级一次细化的层次结构,即保护方法所完成的功能通常比公有方法所实现的功能更为细小琐碎。

有效编程最重要的工作是思考

有效编程最重要的工作就是思考,而人思考时通常不会看起来很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没有用最有价值的工具——自己的脑袋。
最理想的状态就是,拿到一个问题,先不要动手,要做到谋定而后动,先想一想或在纸上画一画,然后再键盘上一阵子噼里啪啦,最后只测试一次,OK通过,整个过程是一气呵成,这也许就是所谓的键盘侠吧,哈哈。

调试

通过反复尝试来完成编程
随机的修改代码,直到你的代码看起来能工作,这样你学不到任何东西,你只是在晃来晃去的浪费时间
分析问题,解决问题是软件构建过程中的核心行为,而调试就是一个不断提出假设、验证假设的过程,这个过程如同破案一样有趣,要善于从蛛丝马迹中找到root cause。
调试是能让你更好的理解程序、错误、代码质量和解决问题的良机

测试

测试先行,开发而后的编程是过去十年中所形成的最有用的软件开发实践之一
不要通过测试去验证你的程序

最后

纸上得来终觉浅,得知此事要躬行!