随笔 - 181  文章 - 15  trackbacks - 0
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔分类

随笔档案

My Tech blog

搜索

  •  

最新评论

阅读排行榜

评论排行榜

运用多态(polymorphism)取代与价格相关的条件逻辑
在另一个对象的属性基础上运行switch语句,并不是什么好主意。如果不得不使用,也应该在对象自己的数据上而不是在别人的数据上使用。选择对象之间的传递关系的时候,应当考虑选择将稳定的对象的属性传递给易变的对象(如书中的将租期长度来自Rental(稳定,不易变)传递给Movie(不稳定,易变))。
对于类A和类B,如果A中存在因B而变化的属性或方法体,则将它们移动到B中,A中只保留移动后B暴露给A的接口(或方法)。
终于.......我们来到继承(inheritance)
此部分包含的重构方法:
Self Encapsulate Field:自封装域。
Move Method:移动方法。
Replace Conditional with Polymorphism:用多态替换条件选择。
Replace Type Code with State/Strategy:在这个方法中使用了上面三个方法作为步骤。即用状态、策略替换代码,将与类型相依的行为搬移到模式内。在使用它的时候,多使用对于以类型相依的行为进行Self Encapsulate Field作为第一步骤。从而确保任何时候都通过getter和setter两个函数来运行这些行为。第二步通常采用Move Method方法,即把代码从超类的宿主中搬移到子类中去。第三步采用Replace Conditional with Polymorphism方法,将switch,if等条件分支语句转变为多态形式。
下面是一个小实验:
一、重构之前的代码:

public class ClassA {
    
public int getValue(TheType type)
    {
        
switch(type)
        {
        
case SmallValue:return 100;
        
case MidValue:return 200;
        
case BigValue:return 300;
        
default:return 0;
        
        }
    }
    
    
public static void main(String args[])
    {
        ClassA instanceA
=new ClassA();
        System.out.println(
"theValueIs:"+instanceA.getValue(TheType.SmallValue));
    }
}

应用Self Encapsulate Field之后的效果:

public class ClassAModified {

    
/**
     * 
@param args
     
*/
    
public TheValue _theValue;
    
public int getValue(TheType type)
    {
        
switch(type)
        {
        
case SmallValue:return 100;
        
case MidValue:return 200;
        
case BigValue:return 300;
        
default:return 0;
        
        }
    }

        
    
public TheValue get_theValue() {
        
return _theValue;
    }

    
public void set_theValue(TheType type) {
            }
        
}
public class TheValue
    {
    
    }
        

应用Move Method之后的效果:

public class ClassAModified {

    
/**
     * @param args
     
*/
    
public TheValue _theValue;
    
public int getValue(TheType type)
    {
        
return _theValue.getValue(type);
    }

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub

    }
    
    
public TheValue get_theValue() {
        
return _theValue;
    }

    
public void set_theValue(TheType type) {
        _theValue
=new TheValue();
    }
    
public class TheValue
    {
        
public int getValue(TheType type)
        {
            
switch(type)
            {
            
case SmallValue:return 100;
            
case MidValue:return 200;
            
case BigValue:return 300;
            
default:return 0;
            
            }
        }
    }
    

}

 应用Replace Conditional with Polymorphism之后的效果:

public class ClassAModified {

    
/**
     * @param args
     
*/
    
public TheValue _theValue;
    
public int getValue(TheType type)
    {
        
return _theValue.getValue();
    }

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub

    }
    
    
public TheValue get_theValue() {
        
return _theValue;
    }

    
public void set_theValue(TheType type) {
        
switch(type)
        {
            
case SmallValue:_theValue= new SmallValue();
            
case MidValue:_theValue= new MidValue();
            
case BigValue:_theValue= new BigValue();
            
default:_theValue=new TheValue();
        
        }
    }
    
public class TheValue
    {
        
public int getValue()
        {
            
return 0;
        }
    }
    
public class SmallValue extends TheValue
    {
        
public int getValue()
        {
            
return 100;
        }
    }
    
public class MidValue extends TheValue
    {
        
public int getValue()
        {
            
return 200;
        }
    }
    
public class BigValue extends TheValue
    {
        
public int getValue()
        {
            
return 300;
        }
    }

}

结语
重构的节奏:测试、小修改、测试、小修改、测试、小修改。。。
正是这种节奏让重构得以快速而安全的前进。
 


 

posted on 2007-06-20 21:42 littlegai 阅读(179) 评论(0)  编辑 收藏 引用 所属分类: 我的读书笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理