是否有 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 结果的单元测试已经导致程序员走向更好的设计。
我尝试在项目的 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 结果的单元测试已经导致程序员走向更好的设计。