[英]OOP design : Car - Connection between Tank and Engine
我不確定我是不是瘋狂地違反了OOP。
假設有一個“ 有 ” Engine
和Tank
的Car
類。
當Engine
運轉時,它會從Tank
取油( 比如每個循環一個單位,盡管油不可用 )
Engine
應如何從Tank
取油? (當兩者都是Car
領域?)
實際上, Engine
應該持續“供應”油而不是“獲得”油。
應該有"OilCirculatingSystem"
從Tank
獲取油
並提供給Engine
。
如何在課程中對此系統進行建模?
有合適的設計模式嗎?
** *編輯:簡單地說,如何從Tank
到Engine
獲得“油流”? (當閥門打開時, Oil
是否有責任從Tank
流向Engine
?
如果它炸掉了大腦,我很抱歉。 缺少方法的實現,但你得到了我希望的想法。
class Tank
{
Oil oil;
public Tank(OilPipe pipe)
{
pipe.OilNeeded += new EventHandler<OilNeededEventArgs>(pipe_OilNeeded);
}
public void FillOil(Oil oil) { }
void pipe_OilNeeded(object sender, OilNeededEventArgs e)
{
e.Oil = oil.SubtractLiters(5);
}
}
class OilPipe
{
public event EventHandler<OilNeededEventArgs> OilNeeded;
public Oil SuckOil();
}
class Piston
{
public void Move() { }
}
class Oil
{
public Energy Burn() { }
}
class Energy
{
public void Push(Piston piston) { }
}
class Engine
{
OilPipe oilPipe;
public Engine(OilPipe oilPipe, Piston piston)
{
this.oilPipe = oilPipe;
}
public void MovePiston()
{
Oil oil = oilPipe.SuckOil();
Energy energy = Burn(oil);
energy.Push(piston);
}
}
class Car
{
Engine engine;
public Car(Engine engine, Tank tank)
{
}
public void Accelerate()
{
engine.MovePiston();
}
}
汽車類比從來都不是完美的,因為汽車和發動機實際上是非常復雜的系統。 你必須忽略很多東西來簡單地建模它們。 您的問題是您似乎並不了解引擎的工作原理。
油底殼是發動機的一部分,而不是汽車。 油箱是汽車的一部分,但不是發動機。 你有一個油泵(也是發動機的一部分),它將油泵入發動機的氣缸。 大多數汽車(可能全部)不“檢查油位”並拒絕啟動。 如果沒有足夠的油,發動機將會抓住它。 同樣,如果它沒有得到足夠的氣體,它也不會檢查油箱水平......它只是燃料耗盡。
它更像是這樣的:
class Car
{
Engine engine;
GasTank gasTank;
StartEngine() { engine.Start(); }
}
class Engine
{
Timer timer;
OilPan oilPan;
OilPump oilPump;
public Engine() { oilPump = new OilPump(oilPan, this); }
Start() { timer.Start(oilPump); }
InjectOil() {}
}
class Timer
{
OilPump op; // This is a reference
public Timer(OilPump op) { _op = op; }
Revolve() { op.Pump(); }
}
class OilPump {
OilPan _oilPan; // Reference
Engine _engine; // Reference
OilPump(OilPan oilPan, Engine engine) { _oilPan = oilPan; _engine = engine; }
Pump() { _engine.InjectOil(_oilPan.GetOil); }
}
定時器代表發動機的轉速,當它旋轉時,它啟動油泵,將油泵入氣缸。 油類通常不像燃料一樣被“消耗”。 它被回收利用。 隨着時間的推移,它會崩潰,而在一些形狀不好的發動機中,它會燃燒。
油泵參考表示發動機和油泵之間的機械連接(通常是齒輪轉動它)。 定時器沒有油泵,它有一個油泵。
油箱將以類似的方式工作。
同樣,這都是不完美的(非常不完美),因為有很多缺失。
我會說Car
本身就是OilCirculatingSystem
。
class Car
{
Tank tank;
Engine engine;
start()
{
//whatever
}
feedEngine()
{
while ( tank.hasOil() )
{
tank.getOil();
engine.giveOil();
}
}
}
Car
本身已經是將所有組件連接在一起的類,為什么還需要另一個?
供應是連續的這一事實意味着必須在指定的時間間隔后進行檢查。 如果這不是您要找的,您可能需要澄清您的問題。
解決這個問題的最合乎邏輯的方法(假設您沒有基於事件或信號/插槽編程)將讓汽車檢查發動機的狀態,每次選擇的時間間隔,以及發動機是否需要更多油,汽車應從油箱讀取一些數據並將其傳遞給發動機。
這是一個簡單的偽代碼示例,用於演示我的意思:
class Engine
{
void start()
{
while(true)
{
// do engine stuff here
}
}
void getOil(int amount)
{
// do stuff with oil
}
}
class Tank
{
int oilAmount
boolean hasOil
int giveOil()
{
return oilAmount
}
}
class Car
{
Tank tank
Engine engine
void start()
{
engine.start()
while(true)
{
engine.getOil(tank.giveOil())
sleep(100)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.