我尝试在项目的类设计中应用SOLID原则。是否有任何SOLID原则的例外情况?我们是否必须明确地应用这些原则。例如,我准备了一个工厂类。
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);
}
}
}
此课程从不符合OCP 将来可能需要新的列表制作者,我必须添加一个新的if if块 我的设计不好吗? 或者是否有过常常没有提到的SOLID原则的例外情况? 我不确定,但我的例子符合OCP的“战略关闭”? 如果您有关于SOLID异常的其他示例,我认为这对设计人员有帮助。
答案 0 :(得分:3)
开放 - 封闭原则是重要且有用的,但它不应该盲目地应用于所有类和所有模块。在某些情况下,创建支持可扩展性的抽象是不值得的,因为不需要扩展。在其他情况下,我们可以预期需求会发生变化,但我们不确定会发生什么样的变化,或者我们不确定其他需求,所以我们更愿意推迟决策,并从更简单的模块开始不尊重OCP的实施。
答案 1 :(得分:2)
SOLID原则只是指导原则。无论是否使用这些原则,您都可以解决问题。
您的主要关注点应该是设计问题的解决方案,而不是将解决方案与特定的设计模式或原则相匹配。
如果您确实认为不应修改您的课程,则只需实施Open/Closed principle。通常,我没有看到修改现有Factory类以添加新类型的任何问题。
以下三个原则对于设计解决方案非常有用
Interface_segregation_principle:不应该强迫任何客户依赖它不使用的方法
不要在代码中使用fat接口,其中实现类必须覆盖未使用或不相关的方法。设计粒度接口并创建实现这些粒度接口的类。 相关的SE问题:
Interface Segregation Principle- Program to an interface
Dependency_inversion_principle:这是一个很好的原则。你应该编程接口而不是实现。
Liskov_substitution_principle:如果您需要动态更改运行时的实现,请使用此原则。如果您的应用程序未更改其实现,则可能不需要此功能。
但Single_responsibility_principle在所有五项原则中都存在争议。 模块可能有单一的责任,但设计一个迎合单一责任的课程将导致数百/数千课程。
答案 2 :(得分:1)
SOLID原则(或任何相关原则)是在实施和维护方面避免软件项目中潜在陷阱/威胁的指南。只是盲目地遵循一个原则而不知道它的反思根本不会起作用。
作为你的例子,我将采取OCP。 OCP背后的关键概念是,如果您的项目100%符合OCP,任何其他(可能由外人,新成员)可以在不查看当前代码的情况下进行编码,只需查看您的api文档(关于暴露的方法)这真的让那个人的生活变得轻松。并且也不需要一次又一次地测试现有代码,因为现有代码不会进行任何修改。但实际上在某些情况下我们必须打破OCP。
前:
新要求。(需要在现有类中实现),
错误修复
有限的框架支持(任何MVC框架)等。
在某些情况下,我们可能会破坏OCP,因为它知道它不会造成伤害。
关于原则,你可以这样做一个简单的比喻。当你在路上行走时,作为行人有很多原则可供遵循。
前:
走在左手边。 (这样你就可以看到进来的车辆)
仅在人行横道上穿过(这样车辆可以清楚地看到你,他们会停下来)。
尽可能地跟着他们一定会让你安全。但想象一下,在公路上没有车辆行驶里程的情况,您是否还在寻找过马路的人行横道?没有权利?你知道即使不是行人过路处你也很安全。如果有一种情况是道路上的左侧非常泥泞并且无法行走,您是否仍然会继续遵循原则?没有权利。知道情况后,你宁可走在右手边。
我认为你对原则有所了解。 :)
答案 3 :(得分:0)
我认为我发现在编写代码时必须考虑的第一件事。它是UNIT TESTS.Solid原则,设计模式等是帮助进行单元测试的工具。据我所知,任何未定向的程序员(像我一样)都必须申请单位测试没有例外。测试结果已经导致程序员更好地设计。