单一责任原则是否适用于OOP?

bic*_*bic 7 oop design-patterns single-responsibility-principle solid-principles

我正在努力理解单一责任原则如何与OOP合作.

如果我们要遵循这个原则来开球,那么我们是不是留下了许多课程,其中许多课程可能只有一个方法?

如果我们不完全遵循这个原则,那么这个原则的重点是什么?

Mat*_*ans 8

我喜欢用这种方式陈述单一责任原则:"你写的每件事 - 每个模块,类,接口或方法,都应该有一份工作.它应该完成整个工作,只做那份工作.

请注意,您编写的这些内容中的一些是大(模块),一些是小(方法),一些是在(类)之间,而一些大事由较小的东西组成.

这不是问题,因为工作或职责也有各种规模,可以分层次地分解.警察的工作,例如,是为了"保护和服务" - 一个任务,即分解成"上街巡逻","破案"等,它们可以分别由不同的单位进行处理.这就产生了协调的需要(一项不同的工作),每个单位的工作分解为个别官员的工作等.

对于每一个重要的工作,有很多方法可以将其分解为较小的工作,并且每个工作都可以通过遵循SRP和其他SOLID原则的软件设计来建模.决定如何解决问题是软件设计艺术的重要组成部分.

  • 需要进行权衡:将工作分成较小的工作使得工作更容易理解,但增加了工作数量,这可能使整个系统变得更加复杂.有一个甜蜜点,其中每个作业的解决方案适合舒适到你的头上,打破它,更会使其更难以与工作,因为你需要会招惹更多的事情的变化.停在那里.这对每个人来说都是一个略微不同的地方. (2认同)
  • 我做的最好的思考练习之一是尝试预测系统中可能发生的变化.然后我试着理解如何分离职责,所以如果事情发生了变化,我不需要重构现有的代码,但我可以删除现有的工作,并用新工作替换它们,尽可能保持它们之间的接口完整.这让我想起Justin Searls今年在RailsConf上发表的演讲,https://www.youtube.com/watch?v = V4fnzHxHXMI.并非所有这些都是直接相关的,但它可能有助于您做出决策 (2认同)

arm*_*inb 5

一个类应该处理一个主题,这是它的单一职责。一个类Car可以包含如下方法startEngine()或属性weight

class Car
{
    int weight;
    void startEngine();
    void stopEngine();
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以将这个类更多地拆分。例如通过为引擎定义一个类:

class Engine
{
    start();
    stop();
}

class Car
{
    Engine engine;
    int weight;
}
Run Code Online (Sandbox Code Playgroud)

但是您不应为启动和停止引擎定义单独的类,例如:

class EngineStop
{
    stop();
}

class EngineStart
{
    start();
}

class Car
{
    EngineStart engineStart;
    EngineStop engineStop;
    int weight;
}
Run Code Online (Sandbox Code Playgroud)

原则是尽可能合理地分解类以实现抽象。抽象得太深违反了这个原则。