敏捷软件开发第二部分(OCP:开放-封闭原则)

巴拉巴拉傻逼渣,这周看了OCP跟LSP两个原则,但后者依旧看的不太明白,重新继续看,还有撸撸码。这周就记录一下OCP原则啦。

OCP:开放-封闭原则(The Open-Closed Principle)

遵循该原则设计出来的模块具有两个主要的特征
(1)对于拓展是开放的。这表示着一个模块的行为是可拓展的,当有需求时,可对该模块进行拓展,使其具有满足那些新改变的行为。
(2)对于修改是封闭的。对模块行为进行拓展时,不必改动模块的源代码。

举个渣子(举个违反OCP原则的例子~)

刚好肚子有点饿,举个相关的例子吧

列个枚举~(有段时间没接触C#了,基本语法忘了,如果有错的,请无视,这里关注的是模块的行为~)

(这里是小渣拥有的行为枚举)
enum
{
    enum_行为_吃饼干 = 1,
    enum_行为_吃方便面
}

//这个是行为模块
public class Action
{
    public Test(){}

    public void ExcuteAction(enum e)
    {
        if (e == enum.enum_行为_吃饼干) 
        {
            Console.WriteLine("小渣好饿,果断吃了一包巧克力饼干!");
        }
        else if (e == enum.enum_行为_吃方便面)
        {
            Console.WriteLine("小渣好饿,拆开最爱的公仔面一顿狂啃!");
        }
        else
        {
            Console.WriteLine("我找不到你的行为,请添加对应行为操作。");
        }
    }
}

//这里是业务代码(就是小渣现在自己想做的事,我现在饿了,我想吃泡面了!)
namespace XiaoZha
{

    class XiaoZhaEat
    {
        static void Main(string[] args)
        {
            Action action = new Action();
            //我想吃泡面了,因此
            action.ExcuteAction(enum.enum_行为_吃方便面);
        }
    }
}

好了,小渣成功的吃到方便面了。(然而现实并没有!)
小渣日复一日的吃着饼干泡面,坚持了一周之后,发现已经吃腻了,而且吃的尽是没营养的,这时必须强迫小渣吃点有营养的了,不然长久下去,小渣要挂掉的。
小渣决定增加了吃水果的行为。

enum
{
    enum_行为_吃饼干 = 1,
    enum_行为_吃方便面,
    enum_行为_吃水果
}

//这里执行吃水果的行为
action.ExcuteAction(enum.enum_行为_吃水果);

执行之后会出现,我找不到你的行为,请添加对应行为操作。
这是怎么回事呢~
因为我们在枚举中追加了吃水果的行为了,可是并没有在行为模块拓展相应枚举的操作。
因此,我们同时必须在行为模块中<修改>

else if (e == enum.enum_行为_吃水果)
        {
            Console.WriteLine("小渣缺乏营养,吃苹果吃苹果!");
        }

//这里执行吃水果的行为
action.ExcuteAction(enum.enum_行为_吃水果);

这次,小渣总算是顺利吃到了水果了。
但是,我们也发现了,一旦小渣想要更多或者除去不想要的行为之后,我们就必须不断地修改行为模块。
这就违反了OCP原则了。

所以我们将其改成以下方式,就可以随时随意的拓展行为了。

//将行为的枚举去除,更改为使用抽象接口的方式
public interface EatAction
{
    void Eat();
}

//需要的行为通过实现接口的方式进行拓展
public class EatInstantNoodles:EatAction
{
    public void Eat()
    {
        Console.WriteLine("小渣饿疯了,一次性吃了10碗方便面");
    }
}

public class EatApple:EatAction
{
    public void Eat()
    {
        Console.WriteLine("小渣吃了一些苹果,营养得到补充~");
    }
}

//需要更多的行为时直接按以上方式追加即可~

//这个是行为模块
public class Action
{
    public Test(){}

    public void ExcuteAction(EatAction a)
    {
        a.Eat();
    }
}

//这里是业务代码
namespace XiaoZha
{

    class XiaoZhaEat
    {
        static void Main(string[] args)
        {
            Action action = new Action();
            //我要吃苹果
            action.ExcuteAction(new EatApple());
        }
    }
}

这样就可以遵循OCP原则了,当小渣想拥有更多行为时,只需要创建一个类并实现EatAtion接口即可,而Action类却不会受到影响。这样对代码的维护也就更加方便啦~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值