2011-10-22 8 views
7

私はOOPのコンセプトに狂っているのかどうかはわかりません。

」のCarクラスがあり、EngineTankがあるとします。

Engineが動作しているとき、それはTankから油を取る方法EngineTankからオイルを取得する必要があります

(オイルが無数のですがは、サイクルごとの単位でユニットを言いますか)? (両方ともCarのフィールドである場合は?)

実はEngineは継続的にオイルを「取得」よりも油ではなく を「付属」しなければなりません。
Tank
からオイルを得てEngineに供給する"OilCirculatingSystem"があるはずです。
このシステムをクラスでどのようにモデル化できますか?
適切なデザインパターンはありますか? enter image description here

** *編集:だけで、EngineTankから "油の流れを" 持っていますか? (弁が開いたときEngineTankから流れるようにOilの責任ですか?
OOPデザイン:車 - タンクとエンジンの接続

+0

車のエンジンについて私の理解は傷ついているかもしれませんが、オイルタンクはエンジンアセンブリ全体の一部ではありませんか? –

+0

あなたの質問とは無関係ですが、重要だと思います: 'checkEngineOil'はあなたが使っているものを実際に伝えるものではありません。あなたは本当に、「私には始めるのに十分な油があれば」と言っています。 'if(tank.oilLevel()> OIL_NEEDED_TO_START_ENGINE)'の行に沿って何かを提案します。 –

答えて

4

脳をフライするとすみません。メソッドの実装は欠けていますが、私はあなたが望む考えを得る。

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(); 
    } 
} 
+0

Ok.私は「いつpipe_OilNeededイベントが発生するのですか? "それはSuckOil()が正しい時でしょうか? .Eventsは理解しにくいです。私は[イベントについてのこの回答を読む](http://stackoverflow.com/questions/213638/how-do-c-sharp-events-work-behind-the-scenes/213651# 213651)何度か理解してみてください。 – Dinushan

+0

@ D-ShanはいSuckOilが呼び出されると、クラスはイベントを発生させ、ソースにオイルを提供するように要求します。 –

1

供給は、それが指定した時間間隔後にチェックされなければならないことを連続手段であるということ。これは何をされていない場合

この問題の最も論理的なアプローチは、(イベントベースやシグナル/スロットのプログラミングをしていないと仮定した場合)、エンジンがエンジンの状態をチェックするようにすることですが、エンジンが多くのオイルを必要とする場合、車はタンクからデータを読み込んでエンジンに渡す必要があります。

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) 
     } 
    } 
} 
2

私はCar自体がOilCirculatingSystemであることを言うだろう:は、ここで私が言いたいことを証明するための簡単な擬似コードの一例です。

class Car 
{ 
    Tank tank; 
    Engine engine; 
    start() 
    { 
    //whatever 
    } 
    feedEngine() 
    { 
     while (tank.hasOil()) 
     { 
      tank.getOil(); 
      engine.giveOil(); 
     } 
    } 
} 

Car自体はすでに、すべてのコンポーネントを一緒に接続するクラスで、なぜあなたは別のものを必要とするでしょうか?

+0

Ok.Itは理にかなっています。車がエンジンとタンクの間の接続を「開始」した後、エンジンがタンクにアクセスしてタンクから直接オイルを取得し、車がエンジンのためにそれを行う必要はありません。 – Dinushan

+0

@ D-Shan私が見ているように、それは疎結合の原理に違反するでしょう(それを見てください)。タンクとエンジンが接続する理由はありません。彼らは自分の論理を含むべきであり、それ以上のものは含んではいけません。エンジンは、タンクから必要ではなく、ポンプから直接ガスで供給することができます。タンクはエンジンに給油する必要はありません。ではなぜそれらを接続しますか?良いOOPとは、クラスが疎結合し、独自のロジックを含んでいることを意味します。このロジックは車に属しています。基本的には車であり、さまざまなコンポーネントが相互に作用する手段です。 –

+0

私が混乱しているのはオイルの挙動です。実際にオイルはタンクからエンジンに流れ、オイルはタンクからエンジンに運ばれます – Dinushan

3

車とエンジンは実際には非常に複雑なシステムなので、車の類推は決して完璧ではありません。単純にモデル化するには、多くのことを無視しなければなりません。あなたの問題は、最初のエンジンの仕組みを理解していないように見えるということです。

オイルパンはエンジンの一部であり、車ではありません。ガソリンタンクは車の一部ですが、エンジンはありません。エンジンのシリンダーにオイルを汲み上げるオイルポンプ(エンジンの一部)もあります。ほとんどの車(おそらくすべて)は「オイルレベルをチェック」して始動を拒否しません。十分なオイルが得られない場合、エンジンは単に握るだけです。同様に、十分なガスが得られなければ、ガソリンタンクのレベルをチェックしません。燃料がなくなってしまいます。

それはもっとこのようになります:

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); } 
} 

タイマーは、それが回転して、それがシリンダー内にオイルポンプ、オイルポンプを作動させ、エンジンの回転をreprsents。オイルは燃料のように典型的には消費されません。リサイクルされています。時間が経つと故障する可能性があり、悪い形状のエンジンでは燃える可能性があります。

オイルポンプリファレンスは、エンジンとオイルポンプ(通常はギヤがそれを回転させる)との機械的結合を表します。タイマーにはオイルポンプがありません。オイルポンプを参照しています。

ガソリンタンクも同様に動作します。

また、これは欠けているものが多いため、やはり不完全です(非常に不完全です)。

関連する問題