微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这是反模式吗?

如何解决这是反模式吗?

目前,我经常遇到遵循以下波纹管演示的模式的代码。这是一种策略模式。

我对此不满意,感觉有点臭。它破坏了实际的策略模式,并且其他间接方式令人困惑。同样,它经常导致类似于示例中的方法,因为该方法在派生类中的用途与在基类中的相似。另一方面,我无法用手指指向问题核心。

我是唯一发现这种鱼的人吗?如果不是这样,那么该代码会引起什么问题,尤其是在SOLID原则方面?

namespace MyTest
{
    abstract class Base
    {
        public void DoSomething()
        {
            var param = Prepare();
            DoItReally(param);
        }

        private string Prepare()
        {
            return "Hallo Welt";
        }

        protected abstract void DoItReally(string param);
    }

    class DerivedOne : Base
    {
        protected override void DoItReally(string param)
        {
            Console.WriteLine(param);
        }
    }

    class DerivedTwo : Base
    {
        protected override void DoItReally(string param)
        {
            Console.WriteLine(param.toupper());
        }
    }
    
    static class Program
    {
        public static void Main(string[] args)
        {
            Base strategy = new DerivedOne();
            strategy.DoSomething();
            
            strategy = new DerivedTwo();
            strategy.DoSomething();
        }
    }
}

解决方法

如果将代码分成两个组成部分,则应该看到它们都很好。

1。将一些逻辑抽象为私有方法

public void DoSomething()
{
    var param = Prepare();
    DoItReally(param);
}

private string Prepare()
{
    return "Hallo Welt";
}

鉴于这两种方法的方法主体都是固定的,在这种情况下确实很短,我们可以争辩说私有方法在这里不是必需的。但这只是一个例子,如果您的初始化逻辑变得更加复杂(例如,复杂的数据查询和计算),则需要将其抽象为私有方法。

2。实现抽象基本方法的子类

这就是abstract作为关键字存在的原因。

您的基类知道如何获取数据,但是由于有多种处理该数据的方法,因此有一些子类,每个子类都定义了这些选项之一。您已在基类中实现了最大的可重用性,唯一不可重用的是每个子类的自定义处理逻辑。


我认为您对标签样式和反样式的关注远不止于实际生产。

清洁代码并非来自寻找反模式的追求。干净的代码来自于理解您的需求,意识到该代码不适合您的目的或具有有害的副作用,然后重构该代码以保持其优势,同时减少或减少其弊端。

截至目前,您还没有显示代码本身有任何问题,也没有显示出它可能引起不必要的副作用的原因。您的问题本质上是软骨病,您急于寻找问题,而不是简单地尝试解决对您有具体影响的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?