寻找银弹

致力于探寻软件开发中的本质问题

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  说到可扩展性(Extension),大家都知道应用一些OO的feature和Principles可以达到这种效果像封装(Encapsulation),可以使对象最大可能性的把变化的部分封装在对象内部,减小影响面.面向接口而非实现编程(Coding to Interface instead of Implementation)可以是对象之间松散耦合,方便扩展. OCP,SRP这类的guideline也是达到易于扩展目的的方法.
  在实际应用中,可能会因为不同场景选择不同的方案,看两个例子.
第一个,
using System;
using System.Collections;
/// <summary>
/// ShopCart Class
/// </summary>

public class ShopCart
{
    
private List<Production> productions; 
    
public ShopCart()
    
{
        productions 
= new List<Production>();
    }

    
public void AddProduction(Production NewProduction)
    
{
        productions.Add(NewProduction);
    }

}

/// <summary>
/// Abstract Class production
/// </summary>

public abstract class Production
{
    
//
}

/// <summary>
/// Instance Class
/// </summary>

public class Apple : Production
{
    
//
}

/// <summary>
/// Another Instance Class
/// </summary>

public class Fish : Production
{
    
//
}

这个很好理解,ShopCart中可以放任何商品,只要是从Production基类中继承来的,这样以后有新的品种商品加入的话,只需要增加新的实例类就可以了,对于ShopCart类不用任何修改.
第二个例子,
using System;
using System.Collections;
/// <summary>
/// SubWay Class
/// </summary>

public class SubWay
{
    
private List<Station> stations; 
    
private List<Connection> connections; 

    
public SubWay()
    
{
        stations 
= new List<Station>();
        connections 
= new List<Connection>();

    }

    
public void AddStation(string StationName)
    
{
        stations.Add(
new Station(StationName));
    }

    
public void AddConnection(string StationName1, string StationName2)
    
{
        stations.Add(
new Connection(StationName1, StationName2));
    }

    
//
}


/// <summary>
/// Station Class
/// </summary>

public class Station
{
    
public Station(string stationName)
    
{
        
//
    }

    
//
}

/// <summary>
/// Connection Class
/// </summary>

public class Connection
{
    
public Connection(Station station1, Station station2)
    
{
        
//
    }

    
//
}
是不是貌似相同的情况,地铁由车站和连接线组成.用户可以自己添加车站和线路.
这里我们没有把Station 和 Connection 的对象当做参数传入SubWay类中,我们的考虑是,地铁和连接线是实体类,一般不会有修改,我们就没有做抽象.而最终用户,只关心车站名称和最终的地铁线路图,对于地铁对象和连接线对象也是不感兴趣的.所以我们就没有暴露这两个对象给用户.这样,如果以后有扩展或修改需求,比如车站除了名字还要颜色属性,我们就可以很方便在内部解决问题,对外没有任何变化.
  这两个例子我们可以看出,最终的好的design不是靠一些书本的知识能够得出来的,而是对需求的准确理解,以及对于将来需求变更的预测.才能知道那些是变化的,那些是不变的.这种OOA的工作,需要花费相当的精力来做,而且非常值得,对于以后的维护能够起到事半功倍的效果.


posted on 2008-01-11 10:46  hchlee  阅读(534)  评论(3)    收藏  举报