7

私がOOPの概念にめちゃくちゃ違反しているかどうかはわかりません。「と」を持つクラスがあると

しましょう。が動作している とき、それはからオイルを取ります(オイルは数えられませんが、サイクルごとにユニットごとに言います) どのようにオイルを得る必要がありますか?(両方が?のフィールドである場合) 実際には、オイルを「取得」するのではなく、継続的に「供給」される必要があります。からオイルを取得し、 に供給するものがあるはずです。このシステムをクラスでモデル化するにはどうすればよいですか? 適切なデザインパターンはありますか? ** *編集:CarEngineTank

EngineTank

EngineTankCar

Engine
"OilCirculatingSystem"Tank
Engine

ここに画像の説明を入力してください

簡単に言えば、「オイルの流れ」をからTankにするにはどうすればよいEngineですか?(バルブが開いたときにからOilに流れるのは責任ですか?TankEngine

4

4 に答える 4

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();
    }
}
于 2011-10-22T16:26:30.980 に答える
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); }
}

タイマーはエンジンの回転を表し、回転すると、シリンダーにオイルを送り込むオイルポンプを作動させます。石油は通常、燃料のように「消費」されません。リサイクルされます。時間の経過とともに故障する可能性があり、状態の悪い一部のエンジンでは、燃焼する可能性があります。

オイルポンプリファレンスは、エンジンとオイルポンプの間の機械的なリンクを表します(通常、ギアがそれを回転させます)。タイマーにはオイルポンプがなく、オイルポンプへの参照があります。

ガスタンクも同様に機能します。

繰り返しになりますが、これはすべて不完全です(非常に不完全です)。

于 2011-10-22T16:47:20.143 に答える
2

それCar自体がOilCirculatingSystemです。

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

それCar自体はすでにすべてのコンポーネントを接続するクラスですが、なぜ別のコンポーネントが必要になるのでしょうか。

于 2011-10-22T16:08:27.957 に答える
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)
        }
    }
}
于 2011-10-22T16:08:12.023 に答える