【问题标题】:Is this an anti pattern?这是反模式吗?
【发布时间】:2023-03-11 19:25:01
【问题描述】:

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

我不喜欢这个,感觉有点臭。它打破了实际的策略模式,并且额外的间接性令人困惑。此外,它通常会导致与示例中类似的方法,因为派生类中方法的目的与基类中的方法非常相似。另一方面,我无法用手指指向问题核心。

我是唯一一个发现这个问题的人吗?如果不是,这段代码会导致什么问题,尤其是在 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();
        }
    }
}

【问题讨论】:

  • 您应该更少担心模式,而更多地关注您真正想要做什么以及 那个 是否有意义、可读性和可维护性.
  • 正如迈克尔所说。设计模式可帮助您以优雅且可维护的方式实施解决方案,但您必须首先了解您要解决的问题并选择最适合该问题的设计模式。
  • 您的困惑可能源于这样一个事实,即这不是策略模式的应用,而是模板方法模式的应用。当然,是否适合使用取决于。
  • 我从中得到的是,您可能担心DoItReally 的实现中的代码重复。是的,在这个例子中它可以被改进。 但是:这是否适用于实际代码(不仅仅是示例)?它有实质性的好处吗?

标签: c# oop design-patterns solid-principles anti-patterns


【解决方案1】:

如果您将代码分成两个组成部分,您应该会发现它们都非常好。

1.将一些逻辑抽象到私有方法中

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

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

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

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

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

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


我认为您对标记模式和反模式的关注远远超过了实际生产力。

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

到目前为止,您还没有发现代码本身有任何问题,也没有发现它可能会导致不良副作用的原因。您的问题本质上是疑病症,您过于急切地寻找问题,而不是简单地尝试解决具体影响您的问题。

【讨论】:

  • 我认为关于模式和结构的观点有点没有实际意义。该操作没有现实生活中的示例,并且在没有架构的情况下担心设计语言。域问题出生模式,如果有人在如此简单的层面上担心它们,他们不知道域
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多