SOLID:SRP + ISP

时间:2015-05-28 18:50:14

标签: solid-principles

我想了解SOLID原则。我想我很了解利斯科夫替代原则,但我对其他原则有些疑问。

一个例子。我有两个界面:Enginecar stereo。 问题是:对于汽车,我们有6个眼镜。

所以,我的汽车实现了接口EngineCar Stereo

但是对于6副眼镜,我应该实施它们,还是应该将它们放在一副眼镜上,因为知道有4个可以向上或向下的侧面眼镜和2个挡风玻璃(glasses由两个继承)。

第一个问题是,我无法实现相同眼镜的4倍。

所以第二个对我来说似乎很好,但我害怕打破SRP,我不确定是什么"责任"确实是。

2 个答案:

答案 0 :(得分:1)

正确的设计实践是

  

代码接口而不是类。

根据这一原则,我建议使用IWindowISurfaceIWindShield这样的界面,其层次结构如下

interface ISurface
{
  //surface specific properties which ideally should be DI-ed
  public SurfaceType SurfaceType {get; set;}
  public decimal Opacity {get;set;}
  public decimal Thickness {get; set;}
}

interface IWindow:ISurface
{
  //Window behavior specific properties and methods
  public void lowerWindow();
  public WindowHeight WindowLevel(){get;set;}
  public void shutWindow();
  // ...and more such window specific behavior
}

interface IWindShield:ISurface
{
  //WindShield behavior specific properties and methods
  public bool IsFogged(){get;set;}
  public bool IsClean(){get;set;}
  // ...and more such window specific behavior
}

最后,当组装具有所有功能的汽车(可能使用Builder模式)时,您可以在类型ISurface类型的Car类中拥有一个数组,如下所示

class Car
{
   string carName;
   Engine carEngine;
   Stereo carStereo;
   List<ISurface> carGlasses;
   .....
   // other Car parts
   // this is a typical builder pattern example
}

这是使用CarBuilder类型类构建MyCarBuilder其中

interface CarBuilder
{
  public Car MyCar {get; set;}
  void AddEngine();
  void AddStereo();
  void AddGlasses();// this is what works on adding ISurface List items
  // and other car building methods
}

和真正的构建器类

class MyCarBuilder:CarBuilder
{
    //... implements all methods of building your custom car
}

答案 1 :(得分:0)

这实际上取决于预期用途,但让我们以汽车功能域(现场发明)为例。

你的实现类将实现IMotor(Tesla D有两个电机),IEntertainmentCentre(希望有一个),IGlassSurface(在SUV中可能相当多)。在每个界面中,您将指定要寻址的电机/玻璃表面,例如:IGlassSurface.Operate(glassSurfaceId,direction,distance)。