私はOOPのコンセプトに狂っているのかどうかはわかりません。
「が」のCar
クラスがあり、Engine
とTank
があるとします。
Engine
が動作しているとき、それはTank
から油を取る方法Engine
がTank
からオイルを取得する必要があります
(オイルが無数のですがは、サイクルごとの単位でユニットを言いますか)? (両方ともCar
のフィールドである場合は?)
実はEngine
は継続的にオイルを「取得」よりも油ではなく を「付属」しなければなりません。 Tank
からオイルを得てEngine
に供給する"OilCirculatingSystem"
があるはずです。
このシステムをクラスでどのようにモデル化できますか?
適切なデザインパターンはありますか?
** *編集:だけで、Engine
へTank
から "油の流れを" 持っていますか? (弁が開いたときEngine
へTank
から流れるようにOil
の責任ですか?OOPデザイン:車 - タンクとエンジンの接続
答えて
脳をフライするとすみません。メソッドの実装は欠けていますが、私はあなたが望む考えを得る。
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();
}
}
Ok.私は「いつpipe_OilNeededイベントが発生するのですか? "それはSuckOil()が正しい時でしょうか? .Eventsは理解しにくいです。私は[イベントについてのこの回答を読む](http://stackoverflow.com/questions/213638/how-do-c-sharp-events-work-behind-the-scenes/213651# 213651)何度か理解してみてください。 – Dinushan
@ D-ShanはいSuckOilが呼び出されると、クラスはイベントを発生させ、ソースにオイルを提供するように要求します。 –
供給は、それが指定した時間間隔後にチェックされなければならないことを連続手段であるということ。これは何をされていない場合
この問題の最も論理的なアプローチは、(イベントベースやシグナル/スロットのプログラミングをしていないと仮定した場合)、エンジンがエンジンの状態をチェックするようにすることですが、エンジンが多くのオイルを必要とする場合、車はタンクからデータを読み込んでエンジンに渡す必要があります。
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)
}
}
}
私はCar
自体がOilCirculatingSystem
であることを言うだろう:は、ここで私が言いたいことを証明するための簡単な擬似コードの一例です。
class Car
{
Tank tank;
Engine engine;
start()
{
//whatever
}
feedEngine()
{
while (tank.hasOil())
{
tank.getOil();
engine.giveOil();
}
}
}
Car
自体はすでに、すべてのコンポーネントを一緒に接続するクラスで、なぜあなたは別のものを必要とするでしょうか?
Ok.Itは理にかなっています。車がエンジンとタンクの間の接続を「開始」した後、エンジンがタンクにアクセスしてタンクから直接オイルを取得し、車がエンジンのためにそれを行う必要はありません。 – Dinushan
@ D-Shan私が見ているように、それは疎結合の原理に違反するでしょう(それを見てください)。タンクとエンジンが接続する理由はありません。彼らは自分の論理を含むべきであり、それ以上のものは含んではいけません。エンジンは、タンクから必要ではなく、ポンプから直接ガスで供給することができます。タンクはエンジンに給油する必要はありません。ではなぜそれらを接続しますか?良いOOPとは、クラスが疎結合し、独自のロジックを含んでいることを意味します。このロジックは車に属しています。基本的には車であり、さまざまなコンポーネントが相互に作用する手段です。 –
私が混乱しているのはオイルの挙動です。実際にオイルはタンクからエンジンに流れ、オイルはタンクからエンジンに運ばれます – Dinushan
車とエンジンは実際には非常に複雑なシステムなので、車の類推は決して完璧ではありません。単純にモデル化するには、多くのことを無視しなければなりません。あなたの問題は、最初のエンジンの仕組みを理解していないように見えるということです。
オイルパンはエンジンの一部であり、車ではありません。ガソリンタンクは車の一部ですが、エンジンはありません。エンジンのシリンダーにオイルを汲み上げるオイルポンプ(エンジンの一部)もあります。ほとんどの車(おそらくすべて)は「オイルレベルをチェック」して始動を拒否しません。十分なオイルが得られない場合、エンジンは単に握るだけです。同様に、十分なガスが得られなければ、ガソリンタンクのレベルをチェックしません。燃料がなくなってしまいます。
それはもっとこのようになります:
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。オイルは燃料のように典型的には消費されません。リサイクルされています。時間が経つと故障する可能性があり、悪い形状のエンジンでは燃える可能性があります。
オイルポンプリファレンスは、エンジンとオイルポンプ(通常はギヤがそれを回転させる)との機械的結合を表します。タイマーにはオイルポンプがありません。オイルポンプを参照しています。
ガソリンタンクも同様に動作します。
また、これは欠けているものが多いため、やはり不完全です(非常に不完全です)。
- 1. 駐車場、OOPデザイン - カスタムデザイン
- 2. PHP OOPデザイン:DBが積極的に接続
- 3. OOPデザイン質問
- 4. カードゲームクラス用のOOPデザイン
- 5. OOP PHPファーストクラスMySQLデータベース接続
- 6. 式エンジンとjavascript内のPHPデータベース接続
- 7. OOPデータベースの接続/切断クラス
- 8. OOPクラスのデザイン、このデザインは本質的に「反」OOPですか?
- 9. デザイン、ゲームに関するOOP
- 10. NoClassDefFoundError Androidエンジン接続Androidプロジェクトのデバッグ時
- 11. データベースのための最高のOOPデザイン
- 12. OOPのデザイン - 作成戦略/パターン
- 13. OOPとデザイン:通知のための良い場所
- 14. 電話機が車内のブルートゥースに接続されているときに、アクティビティ
- 15. mysqlデータベースへのPDO接続のPHP oop継承
- 16. 接続と接続要求のタイムアウト
- 17. モバイルブロードバンド接続の接続と切断
- 18. ソケット接続とXMPP接続の違い
- 19. SQL接続とOLEDB接続の違い
- 20. MDFファイルと接続の接続
- 21. Informix標準エンジン(SE)に接続するPHPから
- 22. 私のOOPデザインは正しいですか?
- 23. OOP-デザイン:インタフェース・メソッドの実装に依存するパラメータ
- 24. PHP:データベース接続クラスコンストラクタメソッド
- 25. C++ OOPとPHP OOPの相違点
- 26. スタイリンググラフノードと接続
- 27. PHPと永続的接続
- 28. Androidとイーサネットとの接続
- 29. pingとリモートサーバーとの接続 "
- 30. html5とmysqlの間の直接接続
車のエンジンについて私の理解は傷ついているかもしれませんが、オイルタンクはエンジンアセンブリ全体の一部ではありませんか? –
あなたの質問とは無関係ですが、重要だと思います: 'checkEngineOil'はあなたが使っているものを実際に伝えるものではありません。あなたは本当に、「私には始めるのに十分な油があれば」と言っています。 'if(tank.oilLevel()> OIL_NEEDED_TO_START_ENGINE)'の行に沿って何かを提案します。 –