# 《代码里的世界观》

读完《代码里的世界观》,作者是名工作十几年的资深架构师,书中主要使用 C# 语法来讲解案例,对编程的内功,以及怎么做好项目架构,都有很深入的认识。

# 面向对象

面向对象已经听了很多次了,需要理解的概念很多,但主要还是由这三大特征所衍生的:封装,继承,多态。

封装:能让一对数据和方法有机的组合在一起,为继承和多态提供基础。

继承:为了节省公共代码,为多态提供基础。

多态(抽象的基石):在编译和运行时支持,让程序员实现面向抽象编程,面向接口编程。

Animal tiger = new Tiger();
Animal cat = new Cat();

void AnimalRun(Animal animal){
    animal.run(); // 此处在你定义的时候并不知道有多少种动物,只有运行时才知道
}

AnimalRun(tiger);
AnimalRun(cat);
1
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();
}
1
2
3
4
5
6
7
8
9
10

# 对象之间的关系

  • 继承:父子关系
class B {}

class A : B {}
1
2
3
  • 组合:朋友关系
class B {}

class A  {
    B b;
    public int getBName(){
        return b.name;
    }
}
1
2
3
4
5
6
7
8
  • 依赖:夫妻关系
class B {}

class A  {
    public int getBName(B b){
        return b.name;
    }
}

1
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);
}
1
2
3

4、构建上层建筑

# 使用隐世约定

隐世约定能给架构带来极大的灵活性,而且能够应用在各个层级的模块上。善用隐世约定的热是处理模块链接、数据传输的高手。

1、数据打包

2、数据传输

3、数据解包

例如,有一个状态为:可读可写不可读不可写的数据,可以用一个二进制数字表示。

# 多线程方案

1、互斥:相互竞争

2、同步:相互合作

3、异步:各忙各的

# 程序员应该具有的能力

  • 逻辑推理能力
  • 快速学习上手的能力
  • 架构能力,包括提炼和总结的能力
  • 定位 bug 的破案能力
  • 沟通能力,包括英语能力