重新使用已有的代码可以降低成本、增加代码的可靠性并提高它们的一致性。
说实话能不能复用倒是其次,关键是如果重复的那些代码需要改动,那么你就知道痛苦了。而且多一行代码就要多一个要个分散注意力的点。不要以为ctrl +C、V就是复用,那不是复用,那叫重复。
复用代码片断
假如一个函数如下:
public void foo(){
{代码片段A}
{代码片段B}
{代码片段C}
}
第一种情况:我们发现经常会用到代码片段B,要复用这段代码,那么将它提取未子函数,这是一般都会想到的。如下:
void clasB()
{
{代码片段B}
}
void foo(){
...
callB();
...
}
oid foo2(){
...
callB();
...
}
第二种情况:那么要是发现好多还函数结构类似,代码片段A和代码片段C相同,只是代码片段B不同。这里如何复用这段代码呢?
void foobar(Func b){
{代码片段A}
b.call(arg);
{代码片段C}
}
void foo1() {
foobar (new Func(arg){
...
});
}
void foo2() {
foobar (new Func(arg){
...
});
}
这里调用函数foo的时候参数是一个函数指针。在java中没有这些机制,有两种解决方案:
策略模式:参数b就是一个实际的策略。
模板方法:将b 申明为内部的抽象方法,在子类中覆盖 。如下:
class Bar
{
void foobar(){
{代码片段A}
foo(arg);
{代码片段C}
}
abstract void foo(arg);
}
class Foo1
{
override void foo(arg){
...
}
}
class Foo2
{
override void foo(arg){
...
}
}
第一种情况发展 下去 变成一个“库”,第二种情况发展下去变成一个“框架”。