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

来源:互联网 发布:php留言板视频教程 编辑:程序博客网 时间:2024/04/30 21:45

巴拉巴拉傻逼渣,这周看了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
原创粉丝点击