如何解决这是反模式吗?
目前,我经常遇到遵循以下波纹管演示的模式的代码。这是一种策略模式。
我对此不满意,感觉有点臭。它破坏了实际的策略模式,并且其他间接方式令人困惑。同样,它经常导致类似于示例中的方法,因为该方法在派生类中的用途与在基类中的相似。另一方面,我无法用手指指向问题核心。
我是唯一发现这种鱼的人吗?如果不是这样,那么该代码会引起什么问题,尤其是在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 举报,一经查实,本站将立刻删除。