Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 将条件替换为多态性—;它是如何工作的?_Oop_Refactoring - Fatal编程技术网

Oop 将条件替换为多态性—;它是如何工作的?

Oop 将条件替换为多态性—;它是如何工作的?,oop,refactoring,Oop,Refactoring,我经常听到“尽量避免if/switch结构,如果你有它们,就把它们重构成子类” 我不知道这是怎么回事。 好的,代码中有一个if/开关。然后创建几个新类。但要决定使用哪个类,需要在fabric类(生成这些对象的地方)中实现switch。我错了吗 对我的英语很抱歉。我是读者,不是作家 但要决定使用哪个类,需要实现switch,如果 在fabric类中(生成这些对象的位置)。我错了吗 不,你没有错。虽然交换机上的多态性是一件好事,但也有例外。这样的一个例外是当您将工厂参数化时,这是绝对可以接受的。因此

我经常听到“尽量避免if/switch结构,如果你有它们,就把它们重构成子类” 我不知道这是怎么回事。 好的,代码中有一个if/开关。然后创建几个新类。但要决定使用哪个类,需要在fabric类(生成这些对象的地方)中实现switch。我错了吗

对我的英语很抱歉。我是读者,不是作家

但要决定使用哪个类,需要实现switch,如果 在fabric类中(生成这些对象的位置)。我错了吗

不,你没有错。虽然交换机上的多态性是一件好事,但也有例外。这样的一个例外是当您将工厂参数化时,这是绝对可以接受的。因此,您将要求这样的工厂为您创建专门的类,而不是客户机代码根据条件创建专门的类。优点是工厂将全权负责创建这些类实例,若引入新类,则只修改工厂,而不修改客户机代码

因此,与此相反:

public class Client {
    public string Serialize<T>(string contentType, T instance) where T : class {
        switch(contentType) {
            case "XML":
                return new XMLSerializer().Serialize(instance);
            case "JSON":
                return new JSONSerializer().Serialize(instance);
        }
    }
}
注意,工厂更改的原因只有一个,那个就是引入了新的序列化程序,所以我们在这里对SRP很好。更进一步说,还有一些方法可以避免修改factory,使用配置文件来存储标识符类型映射,或者简单地在factory上公开另一个方法以允许它的用户注册新类型等等,这些都是您的职责

但要决定使用哪个类,需要实现switch,如果 在fabric类中(生成这些对象的位置)。我错了吗

不,你没有错。虽然交换机上的多态性是一件好事,但也有例外。这样的一个例外是当您将工厂参数化时,这是绝对可以接受的。因此,您将要求这样的工厂为您创建专门的类,而不是客户机代码根据条件创建专门的类。优点是工厂将全权负责创建这些类实例,若引入新类,则只修改工厂,而不修改客户机代码

因此,与此相反:

public class Client {
    public string Serialize<T>(string contentType, T instance) where T : class {
        switch(contentType) {
            case "XML":
                return new XMLSerializer().Serialize(instance);
            case "JSON":
                return new JSONSerializer().Serialize(instance);
        }
    }
}

注意,工厂更改的原因只有一个,那个就是引入了新的序列化程序,所以我们在这里对SRP很好。更进一步说,还有一些方法可以避免修改factory,使用配置文件来存储标识符类型映射,或者简单地在factory上公开另一个方法以允许其用户注册新类型等等。这取决于您。

您希望使用哪种编程语言来获得答案?C#?任何。我更喜欢PHP,但C#或Java也没问题。你想要哪种编程语言的答案?C#?任何。我更喜欢PHP,但C#或Java也没问题。谢谢评论。现在我完全理解了这个概念。对不起,我可以给你一个加分,因为我的名声不好。但当它会很高的时候我会做,我保证:-)但当它会很高的时候我会做,我保证-那没关系。现在我完全理解了这个概念-这更重要。谢谢你的评论。现在我完全理解了这个概念。对不起,我可以给你一个加分,因为我的名声不好。但当它会很高的时候我会做,我保证:-)但当它会很高的时候我会做,我保证-那没关系。现在我完全理解了这个概念——这更重要。