[b][/b] [b]1.面向接口和抽象编程,而不要编程到类,这分离了接口与他们的实现。[/b]
比如:有一个Circle类,我们需要调用其draw方法来画圆。一种面向具体的写法就是:
Circle circle = new Circle();
circle.draw();
而设计模式告诉我们,应该面向接口编程,我们让Circle继承Sharp接口,然后写成这样:
Sharp sharp = new Circle();
sharp.draw();
这样,代码之间的耦合度就降低了,加入新的图形比如Line的时候,并不用去修改实现代码。
我想说的一点是,不要过度使用接口,这也是敏捷编程提倡的,比如说只有一个图形,那么就不需要接口了,接口是相似类型的相同实现,当没有相似类型的时候,没必要使用接口,抽象类同理。接口应尽量保持为最小程度。
[b]2.优先组合而非具体继承性。[/b]
继承性会产生数量庞大的子类和他们之间的耦合关系,业务逻辑简单还好。如果复杂一些,纯用继承会造成整个代码高耦合,难于维护。
比如:现在有3个图形,圆,直线,正方形。有3种绘制他们的方法,分别为d1,d2,d3。如果用继承,会产生3x3=9个子类,来实现绘制图形的类。如果再增加算法和图形,会产生更多的类,而且子类基本不能重用,只能耦合到特定的图形和算法上面。
[b]3.合并方法参数[/b]
把一个方法的参数封装到单个对象中,这样可以提高代码的易读性,并简化调用代码.考虑下面的例子:
public void mutiPara(String para1,String para2,String para3);
通过把这些多个参数组合为单个对象,我们可以简化这个方法:
public void singlePara(Options options);
public class Options{
private String para1;
private String para2;
}
更复杂的还可以有多个Options,可以设计一个统一的接口进行调用.
[b]4.消除代码重复[/b]
代码重复对维护来说是致命的,通常也体现了开发中的时间浪费.关于重构,可以参考Martin Fowler的书"重构-改善既有代码的设计".
比如:有一个Circle类,我们需要调用其draw方法来画圆。一种面向具体的写法就是:
Circle circle = new Circle();
circle.draw();
而设计模式告诉我们,应该面向接口编程,我们让Circle继承Sharp接口,然后写成这样:
Sharp sharp = new Circle();
sharp.draw();
这样,代码之间的耦合度就降低了,加入新的图形比如Line的时候,并不用去修改实现代码。
我想说的一点是,不要过度使用接口,这也是敏捷编程提倡的,比如说只有一个图形,那么就不需要接口了,接口是相似类型的相同实现,当没有相似类型的时候,没必要使用接口,抽象类同理。接口应尽量保持为最小程度。
[b]2.优先组合而非具体继承性。[/b]
继承性会产生数量庞大的子类和他们之间的耦合关系,业务逻辑简单还好。如果复杂一些,纯用继承会造成整个代码高耦合,难于维护。
比如:现在有3个图形,圆,直线,正方形。有3种绘制他们的方法,分别为d1,d2,d3。如果用继承,会产生3x3=9个子类,来实现绘制图形的类。如果再增加算法和图形,会产生更多的类,而且子类基本不能重用,只能耦合到特定的图形和算法上面。
[b]3.合并方法参数[/b]
把一个方法的参数封装到单个对象中,这样可以提高代码的易读性,并简化调用代码.考虑下面的例子:
public void mutiPara(String para1,String para2,String para3);
通过把这些多个参数组合为单个对象,我们可以简化这个方法:
public void singlePara(Options options);
public class Options{
private String para1;
private String para2;
}
更复杂的还可以有多个Options,可以设计一个统一的接口进行调用.
[b]4.消除代码重复[/b]
代码重复对维护来说是致命的,通常也体现了开发中的时间浪费.关于重构,可以参考Martin Fowler的书"重构-改善既有代码的设计".