基于扩展性考虑,不同场景选择的不同方案

本文通过两个实例探讨了软件设计中的扩展性问题。首先介绍了如何利用面向对象编程原则实现灵活的商品添加功能;其次讨论了在地铁线路设计中隐藏具体实现细节以简化用户操作的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  说到可扩展性(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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lihongchao/archive/2008/01/11/1034847.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值