gpt4 book ai didi

oop - SOLID - 单一职责原则和开放/封闭原则是否相互排斥?

转载 作者:行者123 更新时间:2023-12-04 23:37:30 25 4
gpt4 key购买 nike

单一职责原则指出:

A class should have one, and only one, reason to change.



开闭原则指出:

You should be able to extend a classes behavior, without modifying it.



如果一个类应该只有一个改变的理由,但不应该被修改,那么开发人员怎么能同时遵守这两个原则呢?

示例

工厂模式是一个很好的例子,它具有单一职责,但可能违反开放/封闭原则:
public abstract class Product
{
}

public class FooProduct : Product
{
}

public class BarProduct : Product
{
}

public class ProductFactory
{
public Product GetProduct(string type)
{
switch(type)
{
case "foo":
return new FooProduct();
case "bar":
return new BarProduct();
default:
throw new ArgumentException(...);
}
}
}

当我需要添加 ZenProduct 时会发生什么稍后到工厂?
  • 这肯定违反了开放/封闭原则吗?
  • 我们如何防止这种违规行为?
  • 最佳答案

    这感觉就像是在讨论“扩展类行为”的语义。向工厂添加新类型是修改现有行为,而不是扩展行为,因为我们没有改变工厂所做的一件事。我们可能需要扩展工厂,但我们没有扩展它的行为。扩展行为意味着引入新的行为,并且每次创建类型的实例或授权工厂的调用者时都会更多地遵循事件——这两个示例都扩展(引入新的)行为。

    A class should have one, and only one, reason to change.



    问题中的示例是用于创建 Product 的工厂实例,它改变的唯一正当理由是改变 Product 的某些内容。它创建的实例,例如添加一个新的 ZenProduct .

    You should be able to extend a classes behavior, without modifying it.



    实现此目的的一个非常简单的方法是使用 Decorator

    The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern.


    public interface IProductFactory
    {
    Product GetProduct(string type);
    }

    public class ProductFactory : IProductFactory
    {
    public Product GetProduct(string type)
    {
    \\ find and return the type
    }
    }

    public class ProductFactoryAuth : IProductFactory
    {
    IProductFactory decorated;
    public ProductFactoryAuth(IProductFactory decorated)
    {
    this.decorated = decorated;
    }

    public Product GetProduct(string type)
    {
    \\ authenticate the caller
    return this.decorated.GetProduct(type);
    }
    }

    在应用 SOLID 原则时,装饰者模式是一种强大的模式。在上面的例子中,我们已经为 ProductFactory 添加了身份验证不改变 ProductFactory .

    关于oop - SOLID - 单一职责原则和开放/封闭原则是否相互排斥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49197359/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com