我今天开始学习扎实的原则,并想要一些建议,以了解我是否真的了解了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规则后,我的代码就是这个。请注意,我还减少了与引擎类并使用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();
}
}
两个备注:
-
S原则的关键更改是您决定将引擎初始化细节放在引擎类本身的start((方法中。好。
-
引入IENENGINE界面也是一个合理的决定。这样做,您可以让任何"引擎"课程做自己的工作,而无需"汽车"不得不打扰其内部设备。汽车唯一需要知道的是它可能启动((引擎。
您需要更改的一件事是verifyEngine((和chackheat((的方式。您的设置不会编译,因为您的引擎类中没有_ENGINE属性。verifyEngine((和chackheat((实际上是引擎的私人方法。
另外,您的两个引擎状态验证可能会产生布尔结果,并且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;
}
}