是否有 SOLID 原则例外情况?

Are there SOLID principle exceptions?

我尝试在项目的 class 设计中应用 SOLID 原则。 SOLID 原则有任何例外吗?我们必须明确地应用这些原则吗?比如我准备了一个工厂class.

class XAdderFactory
{
    private Person _person;

    public bool PersonHasNoRecords
    {
        get
        {
            return string.IsNullOrEmpty(_person.HasXRecords);
        }
    }

    public XAdderFactory(Person person)
    {
        this._person = person;
        if (PersonHasNoRecords)
        {
            new XListMakerAFactory(person);
        }
        else
        {
            new XListMakerB(person);
        }
    }
}

这 class 永远不符合 OCP。
将来可能需要新的类型列表制作器,我必须添加一个新的 else if 块。
我的设计不好吗?
或者有没有经常提到的 SOLID 原则的例外情况?
我不确定,但我的示例符合 OCP 的 "Strategic Closure"? 如果您有其他关于 SOLID 异常的示例,我认为这对设计人员会有所帮助。

Open-Closed原则很重要也很有用,但不应该盲目地应用于所有类和所有模块。在某些情况下,创建支持可扩展性的抽象是不值得的,因为不需要扩展。在其他情况下,我们可以预期需求会发生变化,但我们不确定预期会发生什么样的变化,或者我们不确定其他需求,所以我们宁愿推迟决定,并从更简单的模块开始不遵守 OCP 的实现。

SOLID 原则只是指南。您可以使用或不使用这些原则来解决您的问题。

您的主要重点应该是设计问题的解决方案,而不是使您的解决方案适合特定的设计模式或原则。

如果你真的认为你的class不应该修改,那就只执行Open/Closed principle。一般来说,我没有看到修改现有工厂 classes 以添加新类型的任何问题。

以下三个原则对于设计解决方案非常有用

Interface_segregation_principle:不应强迫客户端依赖它不使用的方法

不要在实现 classes 必须覆盖未使用或不相关方法的代码中使用胖接口。设计细化接口并创建 classes,实现这些细化接口。 相关 SE 问题:

Interface Segregation Principle- Program to an interface

Dependency_inversion_principle: 原则不错。您应该针对接口而不是实现进行编程。

Liskov_substitution_principle :如果您需要在 运行 时间动态更改您的实现,请使用此原则。如果您的应用程序不更改其实现,您可能不需要此功能。

但是 Single_responsibility_principle 在所有五个原则中都值得商榷。 模块可能具有单一职责,但设计一个 class 迎合单一职责将导致 hundreds/thousands 的 classes。

SOLID 原则(或任何相关原则)是在实施和维护方面避免软件项目中潜在 pitfalls/threats 的指南。而盲目遵循一个原则而不知道其反映是根本行不通的。

以你为例,我选OCP。 OCP 背后的关键概念是,如果您的项目 100% 符合 OCP,则任何其他人(可能是局外人、新成员)都可以在不查看当前代码的情况下进行编码,而只需查看您的 api 文档(关于公开的方法),这确实使该人的生活变得轻松。而且也不需要一次又一次地测试现有代码,因为不会对现有代码进行任何修改。但确实有一些情况我们必须打破OCP。

例如:

  • 新要求。(需要在现有的class中实现),

  • 错误修复

  • 有限的框架支持(任何 MVC 框架)等

而且在某些情况下,我们可能会在明知不会造成伤害的情况下破坏 OCP。

关于原理,大家可以这么简单的类比一下。当您在路上行走时,行人需要遵循许多原则。

例如:

  • 靠左手边走。 (这样你就可以看到来车了)

  • 只在人行横道上过马路(这样车辆可以清楚地看到你,他们会停下来)。

尽可能地跟随他们绝对会让你安全。但想象一下,在道路上数英里都没有车辆的情况下,您是否还在寻找人行横道过马路?没有权利?你知道你是安全的,即使它不是人行横道,你也穿过了。如果遇到左边的路很泥泞无法行走的情况,你还会为了遵循原则而走泥泞吗?没有权利。你宁愿在了解情况的情况下走在右手边。

我认为你对原则有所了解。 :)

我想我发现在写 codes.It 时首先要考虑的是 UNIT TESTS.Solid 原则,设计模式等是帮助我使 unit tests.According 成为任何工具的工具没有经验的程序员(像我一样)必须应用没有 exceptions.Test 结果的单元测试已经导致程序员走向更好的设计。