《程序员修炼之道》第六章 当你编码时的阅读笔记
这一章的主题是如何在编码过程中保持思考和判断,避免靠巧合和运气来编程。作者提出了以下几个策略:
靠巧合编程:指的是依赖于不可靠的事物,如未文档化的行为、边界条件、语境假定等,来让代码看起来能工作,而不清楚代码为什么能工作或失败。这样的编程方式是危险和低效的,会导致难以发现和修复的错误。要避免靠巧合编程,要做到以下几点12:
总是意识到你在做什么,不要盲目地编程,试图构建你不完全理解的应用,或是使用你不熟悉的技术。
依靠可靠的事物,不要依靠巧合或假定。如果你无法说出各种特定情形的区别,就假定是最坏的。
为你假定建立文档,使用“按合约编程”来澄清你头脑中的假定,并且传达给别人。
不要只是测试你的代码,还要测试你的假定。使用断言或其他工具来检查你的假定是否正确。
为你的工作划分优先级,把时间花在重要的方面;很有可能,它们是最难的部分,如果你的基本原则或基础设施不正确,再花哨的铃声和口哨也是没用的。
不要做历史的奴隶,一旦你发现过去的代码有问题,请修改它,甚至是进行重构。
算法速率:指的是评估算法在不同规模的输入下执行所需时间和空间资源的方法。算法速率可以用大O表示法来表示,如O(1)、O(n)、O(n^2)、O(log n)等。算法速率可以帮助我们选择合适的算法,优化程序性能,避免性能瓶颈。要评估算法速率,要做到以下几点34:
理解大O表示法和常见的算法速率类别,如常数型、线性型、平方型、对数型、指数型等。
使用常识估算算法速率,如简单循环、嵌套循环、二分法、分而治之、组合等。
估算你算法的阶数,并尝试替换成阶数更低的算法。
不要过度追求理论上最快的算法,而要注重实效。理论上最快的不一定是实际最快的。因为不同的输入数据会导致更快的算法不同。
重构:指的是在不改变软件外部行为和功能的前提下,改善软件内部结构和质量的过程。重构可以提高代码可读性、可维护性、可扩展性和可测试性,也可以减少错误和缺陷。重构应该是一个持续进行并及时反馈结果的过程。要进行重构,要做到以下几点 :
在重构之前,确保你拥有良好且覆盖率高的测试,以便检查重构是否破坏了原有的功能。
采取小步骤进行重构,每次只修改一处代码,并运行测试。这样可以避免引入新的错误,也可以方便回退。
使用一些工具或技术来辅助重构,如IDE、版本控制、重构模式等。
在重构的同时,不要试图增加新的功能。这样可以保持重构的目的和范围清晰,也可以避免混淆重构和开发的责任。
易于测试的代码:指的是在编写代码时就考虑到测试的需求和方便性,使得代码能够被有效地测试和验证。易于测试的代码可以提高代码质量和可信度,也可以节省测试时间和成本。要编写易于测试的代码,要做到以下几点 :
遵循一些编码规范和原则,如单一职责、开闭原则、依赖倒置等,使得代码结构清晰,模块解耦,功能单一。
使用一些设计模式和技术来增加代码的可测试性,如工厂模式、依赖注入、模拟对象、测试驱动开发等。
使用一些工具或框架来编写和运行测试,如JUnit、TestNG、Selenium等。
在编写代码之前就设计好测试用例和测试计划,并根据实际情况进行调整和优化。
邪恶的向导:指的是那些帮助你快速生成大量代码的工具或功能,如IDE、框架、模板等。这些向导并不是完全没有用处,但是如果你不理解它们生成的代码是什么意思,或者不知道如何修改或维护它们,那么你就可能遇到很多问题。要小心使用那些邪恶的向导,要做到以下几点 :
不要盲目地信任向导生成的代码,而要仔细阅读和理解它们。如果有不明白或不合理的地方,要及时查阅文档或寻求帮助。
不要过度依赖向导生成的代码,而要根据自己的需求和风格进行修改或重写。如果向导生成的代码太复杂或太冗余,要考虑简化或删除它们。
不要让向导生成的代码成为你自己代码的一部分,而要把它们封装在整洁的接口后面。这样可以避免向导生成的代码和你自己编写的代码交织在一起,也可以方便地替换或更新它们。