我对单一责任原则的看法是否正确?

时间:2018-04-03 12:08:27

标签: c# .net oop

我今天开始学习SOLID原则,并且如果我真的理解了S原则(单一可重复性),我想要一些建议。

在我实施S原则之前,我的代码就是这个。

class Engine : Engine
{
    public void Start()
    {
        // business logic...
    }
}

class Car 
{
    private readonly Engine _engine;

    public Car(Engine engine)
    {
        _engine = engine;
    }

    public void Start()
    {
        _engine.VerifyEngine();
        _engine.CheckHeat();
        _engine.Start();
    }   
}

实施S规则后,我的代码是这样的。注意我还减少了与Engine类的耦合并使用了IEngine。

interface IEngine
{
    void Start();
}

class Engine : IEngine
{
    public void Start()
    {
        _engine.VerifyEngine();
        _engine.CheckHeat();
        // business logic...
    }
}

class Car 
{
    private readonly IEngine _engine;

    public Car(IEngine engine)
    {
        _engine = engine;
    }

    public void Start()
    {
        _engine.Start();
    }   
}

1 个答案:

答案 0 :(得分:0)

两个评论:

  • S-principle的关键变化是您决定将引擎初始化细节放在引擎类本身的Start()方法中。好。

  • 引入IEngine接口也是一个合理的S原则决定。这样做,你可以让任何“引擎”类做自己的工作,而“汽车”不必担心它的内部。汽车唯一需要知道的是它可能是Start()引擎。

您需要更改的一件事是引用VerifyEngine()和CheckHeat()的方式。您的安装程序将无法编译,因为您的Engine类中没有_engine属性。 VerifyEngine()和CheckHeat()实际上是Engine的私有方法。

此外,您的两个引擎状态验证可能会产生布尔结果,而Start()也可能产生布尔结果,如下所示:

class Engine : IEngine
{
  private bool VerifyEngine()
  { return true; }

  private bool CheckHeat()
  { return true; }

  public bool Start()
  {
    if (VerifyEngine() && CheckHeat())
    {
      // business logic...
      return true;
    }
    return false;
  }
}