我今天开始学习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();
}
}
答案 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;
}
}