是否有使用多态性删除此switch语句的好方法?

石匠

我一直在阅读关于用多态重构和替换条件语句的信息。我遇到的麻烦是,只有在您遇到更复杂的情况(没有多态性,您将不得不多次重复相同的switch语句或if-els)时,这对我才有意义。如果您只做一次,我看不出有什么意义-您必须在某个地方设置条件,对吗?

作为示例,我最近编写了以下类,该类负责读取XML文件并将其数据转换为程序的对象。我们支持的文件有2种可能的格式,因此我仅在类中编写了一种方法来处理每种文件,并使用大小写转换来确定要使用的文件格式:

public class ComponentXmlReader
{
    public IEnumerable<UserComponent> ImportComponentsFromXml(string path)
    {
        var xmlFile = XElement.Load(path);
        switch (xmlFile.Name.LocalName)
        {
            case "CaseDefinition":
                return ImportComponentsFromA(xmlFile);
            case "Root":
                return ImportComponentsFromB(xmlFile);
        }
    }

    private IEnumerable<UserComponent> ImportComponentsFromA(XContainer file)
    {
        //do stuff
    }

    private IEnumerable<UserComponent> ImportComponentsFromB(XContainer file)
    {
        //do stuff
    } 
}

据我所知,我可以为此编写一个类层次结构来进行解析,但是我在这里看不到优势-我仍然必须使用大小写转换来确定要实例化的类。在我看来,这将是毫无益处的额外复杂性。如果我要保留这些类,并根据文件类型对它们进行更多操作,则可以避免在多个位置进行相同的切换,但这是一次性的。这是正确的吗,还是我没有看到某些原因或技术使使用多态类层次结构执行此操作成为一个好主意?

西蒙·特鲁塞拉

与所有设计选择一样,上下文是关键。在这种情况下,您似乎拥有一个相当简单的类来处理两个非常相似的任务。如果两个Import方法包含很少的重复代码,那么将它们包含在一个类中可能是最好的选择,因为正如您所说的那样,它可以降低复杂性。

但是,将来可能会使用此类,甚至还会添加新的导入类型。在这种情况下,如果该类是多态的,则它将更加可重用。

此外,由于这些方法听起来非常相似,因此您可能会有一堆重复的代码,您可以将它们保留在基类中,仅将特定于导入的代码放在子类中。

另外,正如Carl所提到的,有许多不使用case语句来实现此逻辑的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++多态性。方法

来自分类Dev

仅子类具有虚拟方法时使用多态性的问题

来自分类Dev

仅子类具有虚拟方法时使用多态性的问题

来自分类Dev

如何调用没有多态性的虚方法?

来自分类Dev

是否有使用IF / ELSE语句的替代方法

来自分类Dev

使用具有多态性的通用接口

来自分类Dev

这是使用多态性的正确方法吗

来自分类Dev

在php中使用多态性的正确方法?

来自分类Dev

SQLAlchemy:删除多表多态性

来自分类Dev

是否有使用SSE查找两个变量的模数的好方法?(没有SVML)

来自分类Dev

是否可以将这两种方法合而为一,可能使用..多态性?

来自分类Dev

Java多态性和方法链接

来自分类Dev

多态性,虚方法,C ++

来自分类Dev

静态方法和多态性

来自分类Dev

Java多态性/铸造/方法

来自分类Dev

如何创建方法多态性?

来自分类Dev

适当使用Universe多态性

来自分类Dev

C ++ std容器-没有指针的多态性。是否有可能?

来自分类Dev

F#是否具有行多态性(或类似的东西?)

来自分类Dev

F#是否具有行多态性(或类似的东西?)

来自分类Dev

方法是否在C#中重载了早期绑定的多态性?

来自分类Dev

使用多态性删除基于对象类型的开关调用函数

来自分类Dev

多态性输出

来自分类Dev

QVariant的多态性

来自分类Dev

C ++的多态性

来自分类Dev

多态性的代价

来自分类Dev

Haskell多态性

来自分类Dev

C ++多态性:是否可以使用从双重派生类到基类的函数?

来自分类Dev

C ++多态性-调用具有不同签名的派生类方法