簡體   English   中英

OOP設計:汽車 - 油箱和發動機之間的連接

[英]OOP design : Car - Connection between Tank and Engine

我不確定我是不是瘋狂地違反了OOP。

假設有一個“ EngineTankCar類。

Engine運轉時,它會從Tank取油( 比如每個循環一個單位,盡管油不可用

Engine應如何從Tank取油? (當兩者都是Car領域?)

實際上, Engine應該持續“供應”油而不是“獲得”油。
應該有"OilCirculatingSystem"Tank獲取油
並提供給Engine
如何在課程中對此系統進行建模?
有合適的設計模式嗎? 在此輸入圖像描述

** *編輯:簡單地說,如何從TankEngine獲得“油流”? (當閥門打開時, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM