读Java8函数式编程笔记07_设计和架构的原则

1.SOLID原则

1.1.开发良好面向对象程序的准则

1.2.Liskov substitution里氏替换

1.3.Interface segregation接口隔离

1.4.Single responsibility单一功能原则

1.4.1.程序中的类或方法只能有一个改变的理由

1.4.2.一个类不仅要功能单一,而且还需将功能封装好

1.5.Open/closed开闭原则

1.5.1.软件应该对扩展开放,对修改闭合

1.5.1.1.让软件易于修改

1.5.2.高阶函数在用多态来实现开闭原则

1.5.3.使用不可变对象实现开闭原则

1.6.Dependency inversion依赖反转原则

1.6.1.抽象不应依赖细节,细节应该依赖抽象

1.6.1.1.待依赖的抽象不必是接口

1.6.2.让程序员脱离底层粘合代码,编写上层业务逻辑代码

1.6.3.高阶函数提供了反转控制

1.6.4.模块化和重用方式是双向的

1.6.4.1.可以替换不同的细节重用上层代码

1.6.4.2.可以替换不同的业务逻辑重用细节的实现

2.不可变性

2.1.观测不可变性

2.1.1.在其他对象看来,该类是不可变的

2.1.2.java.lang.String

2.1.2.1.第一次调用hashCode方法时缓存了生成的散列值

2.1.3.观测不可变性不意味着实现不可变性

2.2.实现不可变性

2.2.1.对象本身不可变

2.2.2.实现不可变性意味着观测不可变性

3.设计模式

3.1.有些模式会变得过时

3.2.Lambda能让很多现有设计模式更简单、可读性更强

3.2.1.将大量代码塞进一个方法会让可读性变差是决定如何使用Lambda表达式的黄金法则

4.单例模式

4.1.应该避免使用的模式

4.2.敏捷开发使其成了一个反模式

5.命令者模式

5.1.命令者是一个对象,它封装了调用另一个方法的所有细节

5.2.使用该对象,可以编写出根据运行期条件,顺序调用方法的一般化代码

5.3.函数接口Runnable

5.4.宏只是使用命令者模式的一个例子,它被大量用在实现组件化的图形界面系统、撤销功能、线程池、事务和向导中

5.5.使用Lambda表达式或是方法引用,能让代码更简洁,去除了大量样板代码,让代码意图更加明显

6.策略模式

6.1.能在运行时改变软件的算法行为

6.2.定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后

6.3.使用Lambda表达式或者方法引用可以去掉样板代码

7.观察者模式

7.1.可被Lambda表达式简化和改进的行为模式

7.2.被观察者持有一个观察者列表。当被观察者的状态发生改变,会通知观察者。

7.3.观察者模式被大量应用于基于MVC的GUI工具中,以此让模型状态发生变化时,自动刷新视图模块,达到二者之间的解耦

8.模板方法模式

8.1.整体算法的设计是一个抽象类,它有一系列抽象方法,代表算法中可被定制的步骤,同时这个类中包含了一些通用代码

8.2.算法的每一个变种由具体的类实现,它们重写了抽象方法,提供了相应的实现

8.3.将一组方法调用按一定顺序组织起来

8.4.如果用函数接口表示函数,用Lambda表达式或者方法引用实现这些接口,相比使用继承构建算法,就会得到极大的灵活性

8.4.1.使用函数接口实现方法并没有排除继承的方式

9.领域专用语言(DSL)

9.1.针对软件系统中某特定部分的编程语言

9.1.1.比较小巧

9.1.2.表达能力也不如通用语言强

9.1.3.不求面面俱到,但求有所专长

9.2.Domain-Specific Languages

9.2.1.Martin Fowler和Rebecca Parsons合著

9.2.2.Addison-Wesley出版社出版

9.3.外部DSL

9.3.1.脱离程序源码编写,然后单独解析和实现

9.3.2.例如

9.3.2.1.级联样式表(CSS)

9.3.2.2.正则表达式

9.4.内部DSL

9.4.1.嵌入编写它们的编程语言中

9.4.2.普通的类库,提供API方便使用

9.4.3.例如

9.4.3.1.JMock

9.4.3.2.Mockito

9.4.3.3.JOOQ

9.4.3.4.Querydsl

10.行为驱动开发(BDD)

10.1.测试驱动开发(TDD)的一个变种

10.2.它的重点是描述程序的行为,而非一组需要通过的单元测试

发表回复