《设计模式之禅》读书笔记

六大设计原则
单一职责原则 Single Responsibility Principle
例子:
IPhone :
-IConnectionManager
-DataTranfer
There should never be more than one reason for a class to change.
两个职责变化不互相影响,就考虑分成两个接口
降低复杂度、可读、可维护
用职责和变化原因来衡量接口或类设计得是否优良,但是,“职责”和“变化原因”都是不可度量的!
实践:
很难落实,各种现实原因(This is sometimes hard to see)
方法职责单一
接口单一职责,类的设计尽量做到只有一个原因引起变化
 
里氏替换原则 Likov Substitution Principle
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T ,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
Program P 中 S o1 能替换所有的 T o2 , S是T的子类
1.子类必须完全实现父类方法:在类中调用其他类时候,务必要使用父类或接口,如果不能使用父类或接口,说明类的设计已经违背了LSP法则
场景:士兵 枪 射击
枪有很多种,所有枪继承一个抽象的枪,士兵在使用具体枪的时候,调用抽象枪里的方法
玩具枪不能射击,怎么办?
1).所有士兵都做判断 instanceof
2).建一个抽象玩具枪类,与抽象枪类建立关联委托关系,将一些都交给抽象枪处理,具体场景在处理
2. 子类可以有自己的个性
downcast(向下转型)是不安全的,里氏替换原则来看,就是有子类出现的地方父类未必就可以出现
3.覆盖或实现父类的方法是输入参数可以被放大
Design by Contract 契约设计:父类和接口
当放大的时候就不是覆写(Override),而是重载(Overload),这时前置条件小的就会被执行,
如果子类前提小,那么在没有覆盖的前提下,子类方法就会代替父类方法被执行,这将引起业务的混乱
4.覆写或实现父类的方法时输出结果可以被缩小
依赖倒置原则(Dependence Inversion Principle)
High level modules should not depend upon low level modules ,both should depend upon abstractions.
Abstractions should not depend upon details.
Details should depend upon abstraction
核心:OID ->OOD 面向接口设计
TDD Test-Driven Development : 写好单元测试类,然后再写实现类。适合研发类项目和项目成员水平较低的时候使用
JMock 抽象出虚拟对象进行测试
依赖注入的三种写法
1.构造函数注入
2.Setter方法传递依赖对象
3.接口声明依赖对象:接口作为参数
最佳实践
1.每个类尽量都有接口或者抽象类
2.变量的表面类型(声明类型)尽量是接口或者抽象类
3.任何类都不应该从具体类派生
4.尽量不要覆写基类方法
5.结合里氏替换原则使用
倒置源于正置,正置就是正常人的思维,开车就依赖车,编程中需要抽象,产生的抽象类和接口,根据系统需求产生了抽象间的依赖,不是传统思维的依赖。
接口隔离原则
接口
实例接口:java类就是一种接口
类接口:Interface
隔离
1.依赖需要的接口
2.类间依赖关系应该建立在最小的接口上
迪米特法则
一个类应该对耦合类知道的越少越好的
原则:如果一个方法放在本类中,即不增加类间关系,也对本类不产生负面影响,就放在本类中
六度分隔理论
开闭原则

Maven安装最佳实践

设置MAVEN_OPTS环境变量

前面介绍Maven安装目录时我们了解到,运行mvn命令实际上是执行了Java命令,既然是运行Java,那么运行Java命令可用的参数当然也应该在运行mvn命令时可用。这个时候,MAVEN_OPTS环境变量就能派上用场。

通常需要设置MAVEN_OPTS的值为-Xms128m -Xmx512m,因为Java默认的最大可用内存往往不能够满足Maven运行的需要,比如在项目较大时,使用Maven生成项目站点需要占用大量的内 存,如果没有该配置,则很容易得到java.lang.OutOfMemeoryError。因此,一开始就配置该变量是推荐的做法。

关于如何设置环境变量,请参考前面设置M2_HOME环境变量的做法,尽量不要直接修改mvn.bat或者mvn这两个Maven执行脚本文件。因 为如果修改了脚本文件,升级Maven时就不得不再次修改,一来麻烦,二来容易忘记。同理,应该尽可能地不去修改任何Maven安装目录下的文件。

 

mvn compiler:compile时出现非法字符: /65279错误

原因:

UltraEdit、EditPlus等编辑器会在utf8编码格式的文件开头添加utf8标识,使文件的编码格式由utf8变为utf8+BOM,导致maven编译时将utf8标识误认为非法字符。

解决办法:

通过UltraEdit、EditPlus等编辑器将utf8+BOM编码格式的文件改为utf8格式,去掉文件开头的utf8标识即可。

 

maven中如何忽略单元测试中的错误继续构建工程

maven中默认的情况下如果单元测试有错误,将会停止构建工程,如果想忽略错误而继续构建的话只需在pom.xml文件中添加下面的配置即可:

 

<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </build> [...] </project>
这段配置将会忽略单元测试的错误而继续构建。
命令行:$ mvn test -Dmaven.test.failure.ignore=true