Robert 认为编程是一种技艺甚于科学的东西,要编写整洁代码,必须先写肮脏代码,然后再清理。
跟写作文先写草稿,再写第二稿,直至最终写出终稿,这是一个逐步改进的过程。
写出能工作的程序远远不够 ,要以整洁代码为目标,只有达到整洁代码后,才可转移到下一个任务上。
Robert 认为编程是一种技艺甚于科学的东西,要编写整洁代码,必须先写肮脏代码,然后再清理。
跟写作文先写草稿,再写第二稿,直至最终写出终稿,这是一个逐步改进的过程。
写出能工作的程序远远不够 ,要以整洁代码为目标,只有达到整洁代码后,才可转移到下一个任务上。
对象是过程的抽象,线程是调度的抽象
并发是一种架构设计:并发不是简单的 “用 Thread
跑个任务”。它是一种宏观的设计决策,应该在架构设计早期就考虑,而不是事后添加。它可以将“做什么”和“何时做”解耦。
并发与性能不是等价的:
并发:结构性问题。旨在让程序在同一时间做多件事(更清晰的设计)。
并行:性能问题。旨在让程序在更短的时间内做一件事(提高速度)。
并发可以带来并行,从而提升性能,但这不是唯一目的。并发只有在多个线程或处理器之间能分享大量等待时间的时候管用
并发编写的核心难点:对共享数据的正确访问。不同执行线程对同一数据资源的竞争和协作是万恶之源。
并发防御原则:
单一权责原则 (SRP):并发相关的代码应该有自己独立的开发、修改和调优的生命周期。不要将并发代码与其他业务代码混在一起。
限制数据作用域:共享数据是危险的。严格限制哪些数据可以被共享,并通过精细的同步机制来保护它们。
使用数据副本:尽可能避免共享,使用数据的副本进行处理。
线程应尽可能独立:让每个线程在自己的世界中运行,不与其他线程共享数据。例如,使用 ThreadLocal
变量。
错误处理很重要,但是如果它搞乱了代码逻辑,就是错误的做法
异常的妙处在于:它们在程序中定义了范围,执行 try-catch-finally 语句中 try 部分的代码时,你是在表明可随时取消执行,并在 catch 语句中接续
在某种意义上,try 代码块就像是 事务
尝试编写强行抛出异常的测试,再往处理器中添加行为,使之满足测试要求
隐藏实现 并非 只是在变量之间放上一个函数层那么简单,隐藏实现 关乎 抽象
类不能简单地通过 Setter 和 Getter 把变量暴露出去,而应该暴露抽象接口,以便用户无需了解数据的的实现就能操作数据本体
如果把变量设为 private,然后通过 Setter 和 Getter 暴露,这跟设为 public 有什么区别
举两个例子:
1 | public class Point { |
代码格式关乎沟通,而沟通是专业开发者的头等大事
每个空白行都是一条线索,表示出新的独立概念
关系密切的概念应该互相靠近
变量声明:应尽可能靠近其使用位置
实体变量:应在类的顶部声明(Java)或 底部声明(C++, 剪刀原则),团队遵循相同规范即可