私がOOPの概念にめちゃくちゃ違反しているかどうかはわかりません。「と」を持つクラスがあると
しましょう。が動作している
とき、それはからオイルを取ります(オイルは数えられませんが、サイクルごとにユニットごとに言います)
どのようにオイルを得る必要がありますか?(両方が?のフィールドである場合)
実際には、オイルを「取得」するのではなく、継続的に「供給」される必要があります。からオイルを取得し、
に供給するものがあるはずです。このシステムをクラスでモデル化するにはどうすればよいですか?
適切なデザインパターンはありますか?
** *編集:Car
Engine
Tank
Engine
Tank
Engine
Tank
Car
Engine
"OilCirculatingSystem"
Tank
Engine
簡単に言えば、「オイルの流れ」をからTank
にするにはどうすればよいEngine
ですか?(バルブが開いたときにからOil
に流れるのは責任ですか?Tank
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();
}
}
車とエンジンは実際には非常に複雑なシステムであるため、車の例えは決して完璧ではありません。それらを単純にモデル化するには、多くのことを無視する必要があります。あなたの問題は、そもそもエンジンがどのように機能するかを理解していないように見えることです。
オイルパンはエンジンの一部であり、車ではありません。ガソリンタンクは車の一部ですが、エンジンではありません。エンジンのシリンダーにオイルを送り込むオイルポンプ(これもエンジンの一部)があります。ほとんどの車(おそらくすべて)は「オイルレベルをチェック」せず、始動を拒否します。十分な石油が得られない場合、エンジンは単に捕捉します。同様に、十分なガスが得られない場合は、ガスタンクのレベルをチェックしません。燃料が不足しているだけです。
これはもっと次のようになります:
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)
}
}
}