程序员修炼之道第五章读书笔记与感悟

  程序员修炼之道第五章读书笔记与感悟
时间耦合就是关于时间的各种事项。

软件设计中,时间的角色通常有两方面对我们来说很重要:并发(事情同一时间发生)、次序(事情在时间中的相对位置)。我们期望的是要容许并发,并考虑解除任何时间次序上的依赖。可以选择使用 UML 活动图进行工作流分析,以改善其并发性。在设计架构时,用服务进行设计而不是组件。饥饿的消费者模型是在多个消费者进程间进行快速而粗糙的负载平衡的一种有效途径。编写线性代码,我们很容易做出一些假定,把我们引向不整洁的编程。但并发会迫使你更仔细的对事情进行思考。尽可能使用线程安全的类,开发时也应尽可能设计线程安全的类。

我们都知道应该将程序分而治之,划分成不同模块。这里模块(或类)的定义是,具有单一的定义良好的责任。那如何在不同模块之间进行通信,处理事件呢?有以下两种方式。

发布/订阅模式,又叫 Observer模式。它的工作模式是,由订阅者 Subscriber 向发布者 Publisher 进行注册,注册之后,Publisher 的事件会通知到 Subscriber。未注册和解除注册将不会收到之后的事件通知。Model-View-Controller 是一种将模型与表示模型的 GUI 分离的架构模型,它能有效降低数据和视图之间的相互影响。

靠巧合编程

a) 士兵起初没有探测到地雷,但这不过是侥幸,但他由此得出了错误的结论,认为这里没有地雷,最终导致了灾难性的结果。作为开发者,我们也工作在雷区中,应该保持警惕,不要得出错误的结论。我们应该避免靠巧合编程——依靠运气和偶然的成功——而要深思熟虑地编程。

b) 实现的偶然。实现的偶然是那些只是因为代码现在的编写方式才得以发生的事情,你最后会依靠没有计入文档的错误或是边界条件。

虽然靠巧合编程,但代码已经能工作,但这种做法很危险。因为它也许不是真的能工作,只是看起来能工作;而且我们依靠的边界条件也许只是一个偶然。在不同的情形下(比如不同的屏幕分辨率),它的表现可能就会不同;此外没有计入文档的行为可能会随着库的下一次发布而变化;而多余的和不必要的调用也会使你的代码变慢;多余的调用还会有引入新bug的风险。

对于你编写给别人调用的代码,要进行良好的模块化以及把实现隐藏在撰写了良好文档的小接口之后。 

对于你调用的例程,要只依靠计入了文档的行为。 

c) 语境的偶然。比如GUI,是否在依靠说英语的用户、有文化的用户,或者别的什么没有保证的东西。

d) 项目可以在所有层面上让人误入歧途,从生成需求直到测试。人们常常在头脑中带着许多假定,但这些假定很少被计入文档,而且在不同的开发者之间常常是冲突的。所以最好不要假定,而是要证明。

e) 怎样深思熟虑地编程

总是意识到你在做什么,不要做温水中的青蛙。

不要盲目地编程,试图构建你不完全理解的应用,或是使用你不熟悉的技术,就是希望自己被巧合误导。

一定要按照计划行事。

依靠可靠的事物,而不是巧合或假定。如果你不得不依靠假定,就依靠最坏的假定。

为你的假定建立文档。这有助于你澄清头脑中的假定,并把它们传达给别人。

不要只是测试你的代码,还要测试你的假定。不要猜测,要实际尝试它。编写断言测试你的假定。

为你的工作划分优先级,把时间花在重要的方面。

不要做历史的奴隶,不要让已有的代码支配将来的代码,随时准备好就进行重构。

posted @ 2022-12-02 17:31  风·华正茂  阅读(36)  评论(0)    收藏  举报