此技术有名称吗,它有代码味吗?

问题描述 投票:2回答:1

我之前已经看过类似下面的代码,这导致将一种“扩展访问方法”添加到对象中。扩展方法将仅作为一种方法出现在intellisense中,但是选中后,intellisense将与“ manager”类中定义的所有方法一起出现。这似乎是组织一组类似功能并整理主要对象的主要智能的一种好方法。

所以,我想知道这种技术是否具有某种常用名称,以及是否被认为是代码异味(除了主要对象承担过多责任并变得太大的一般问题之外。]

public class StringManager
{
    public StringManager(String value)
    {
        Value = value;
    }

    private String Value { get; set; }

    public int GetTwiceLength()
    {
         return Value.Length * 2;
    }

    public decimal GetHalfLength()
    {
         return Value.Length / 2;
    }
}

public static class StringExtensions
{
    public static StringManager Operations(this String value)
    {
        return new StringManager(value);
    }
}

上面的代码将这样使用:

var myString = "the string";
var twiceLength= myString.Operations().GetTwiceLength();

愚蠢功能的致歉。这是从SO上的一个示例中借来的,该示例实际上是推荐使用该技术的,为了保护自己的潜在罪恶,对其进行了修改。

c# extension-methods
1个回答
0
投票

看起来像adapter pattern

适配器是一种结构设计模式,允许具有不兼容接口的对象进行协作。 – [https://refactoring.guru/design-patterns/adapter]

让我解释一下为什么我认为这适用于这里:

C#中的扩展方法只是带有少量语法糖的常规静态方法。函数第一个参数的this关键字允许您调用它好像它是该类型的实例方法。但是您可以像常规静态方法一样调用它:

StringExtensions.Operations("your string").CallMethtod();

查看Operations实现:

public static StringManager Operations(this String value)
{
    return new StringManager(value);
}

我们可以看到这是一个普通的旧static factory method,它返回您的Manager类的实例(=适配器)。这等效于直接创建apapter实例(但实际上是有利的,因为它隐藏了“如何”创建新实例。您可以例如合并并重用现有实例):

new StringManager("your string").CallMethod();

您的Manager类将string类型/接口修改为与其他接口兼容,从而提供了所有“管理方法”而不是原始的字符串方法。

是否有代码气味?我不这么认为,不一定。您只需要将一个类的接口调整为另一个接口(字符串接口为StringManager接口)。有人可能会争辩说“管理器”不应在类名中使用,因为它不会添加任何有用的上下文,并且基本上可以表示任何含义。迟早您所有的类都将是某种Manager或Service或ManagerService。

至于所有模式:在它们有意义并能带来益处时使用它们。不要过度使用它们:不要仅仅为了使用模式而使用设计模式。有时甚至最好不要使用某种模式,即使存在某种模式或故意引入气味(使用代码注释来解释为什么以这种方式实现某些东西)。使用明智的判断。

© www.soinside.com 2019 - 2024. All rights reserved.