# 《代码里的世界观》读书笔记
读完《代码里的世界观》,作者是名工作十几年的资深架构师,书中主要使用 C# 语法来讲解案例,对编程的内功,以及怎么做好项目架构,都有很深入的认识。
# 面向对象d
面向对象已经听了很多次了,需要理解的概念很多,但主要还是由这三大特征所衍生的:封装,继承,多态。
封装:能让一对数据和方法有机的组合在一起,为继承和多态提供基础。
继承:为了节省公共代码,为多态提供基础。
多态(抽象的基石):在编译和运行时支持,让程序员实现面向抽象编程,面向接口编程。
Animal tiger = new Tiger();
Animal cat = new Cat();
void AnimalRun(Animal animal){
animal.run(); // 此处在你定义的时候并不知道有多少种动物,只有运行时才知道
}
AnimalRun(tiger);
AnimalRun(cat);
2
3
4
5
6
7
8
9
# 六大基本法则
- 单一职责原则——SRP:一个类只做一件事情,不要多管。
- 开闭原则——OCP:一旦类定义完成以后,如果要修改类,保证只做扩展,不要修改。
- 里式替换原则——LSP:凡是用到父类的地方,都可以用子类来代替,不要去修改父类的属性和方法。
- 依赖倒置原则——DIP:高层模块不应该依赖底层模块,两者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象
- 接口隔离原则——ISP:类间的依赖关系应该建立在最小的接口上。
- 迪米特原则——LOD:一个对象应该对其他对象保持最小的了解。高内聚,低耦合。
开发时注意事项:
- 优先降低复杂度,尽量降低耦合度。
- 使用单一职责原则,开闭原则,里式替换原则,降低复杂度。
- 使用迪米特法则降低耦合度。
- 使用依赖倒置原则,消除可以没有的耦合。
# 数据驱动
如果有多层 if else 嵌套,不妨把条件判断放在放在一个单独的数据池中进行管理。
if(xxx==='123' || xxx ==='456'){
doSomeThing();
}
// 可以修改为,如果要新增一项,直接在数据中增加即可
var currentNumber = ['123','456'];
if(dd.includes(xxx)){
doSomeThing();
}
2
3
4
5
6
7
8
9
10
11
12
# 对象之间的关系
- 继承:父子关系
class B {}
class A : B {}
2
3
- 组合:朋友关系
class B {}
class A {
B b;
public int getBName(){
return b.name;
}
}
2
3
4
5
6
7
8
- 依赖:夫妻关系
class B {}
class A {
public int getBName(B b){
return b.name;
}
}
2
3
4
5
6
7
8
继承,组合和依赖所代表的关系,其紧密程度是一次降低的。关系越松,越能产生灵活性。
# 处理异常
我们会使用 try catch 来捕获程序错误,可以把处理错误的逻辑和主体逻辑在空间上分离,让主体逻辑更加清晰,简介,便于阅读。
1、尽早检查并抛出异常,不要运行到函数深处再被动抛出。
2、不要加大 catch 的负担,只处理意料之外的异常
,意料之内的应该自己写容错。
3、避免 try catch 嵌套,避免滥用。
# 编写单元测试
1、这些测试代码写的再多都不会有副作用,因为丝毫不会影响主程序,塔有的只是正面的验证作用。
2、一旦检验出了 bug,是最小代价的修复问题。
3、进行重构时,大量个测试用例是宝贵的财富,可以验证每一步重构的正确性,让重构的风险降到最低。
4、测试用例就像一把把的尖刀,吧猪呢个工程配剖析为一个一个独立的个体。尖刀都是插在各个部分的连接之处。好比屠牛高手依照牛的骨架结构进行解牛。
你可以站在一个旁观者的角度,深层次分析代码的优劣,可以提高你的编程水平。
# static 的特性
1、对代码的直接访问
2、隔离性和游离性:对类实例隔离,对引用游离。
3、将类名淡化,突出参数的重要性。
# 实现案例
1、编写工具包函数
2、单例模式
3、实现类扩展
只有可以被拆卸的功能,才适合放在类扩展中。
class PersonExtension {
static void Drive(Person person,Car car);
}
2
3
4、构建上层建筑
# 使用隐世约定
隐世约定能给架构带来极大的灵活性,而且能够应用在各个层级的模块上。善用隐世约定的热是处理模块链接、数据传输的高手。
1、数据打包
2、数据传输
3、数据解包
例如,有一个状态为:可读
,可写
,不可读
,不可写
的数据,可以用一个二进制数字表示。
# 多线程方案
1、互斥:相互竞争
2、同步:相互合作
3、异步:各忙各的
# 程序员应该具有的能力
- 逻辑推理能力
- 快速学习上手的能力
- 架构能力,包括提炼和总结的能力
- 定位 bug 的破案能力
- 沟通能力,包括英语能力