Конструкция ООП: Автомобиль - Соединение между баком и двигателем - PullRequest
7 голосов
/ 22 октября 2011

Я не уверен, что безумно нарушаю концепции ООП.

Скажем, есть класс Car, который " имеет ", Engine и Tank.

Когда работает Engine, он будет брать масло из Tank (, скажем, единицу измерения за цикл, хотя масло не считается )

Как Engine получить нефть от Tank? (Когда оба поля Car?)

На самом деле Engine должно быть постоянно "поставляемым" маслом, а не чем "заводит" масло.
Там должно быть "OilCirculatingSystem", которое получает нефть из Tank
и расходные материалы для Engine.
Как я могу моделировать эту систему в классах?
Есть ли подходящий шаблон дизайна? enter image description here

** * Редактировать: Проще, как получить «Поток нефти» от Tank до Engine? (Является ли ответственность Oil потоком от Tank до Engine при открытии клапана?

Ответы [ 4 ]

4 голосов
/ 22 октября 2011

Извините, если это жарит мозг. Реализация методов отсутствует, но вы поняли, я надеюсь.

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();
    }
}
3 голосов
/ 22 октября 2011

Автомобильные аналогии никогда не бывают идеальными, потому что автомобили и двигатели на самом деле являются очень сложными системами.Вы должны игнорировать многие вещи, чтобы просто смоделировать их.Ваша проблема в том, что вы, кажется, не понимаете, как двигатель работает в первую очередь.

Масляный поддон является частью двигателя, а не автомобиля.Бензобак является частью автомобиля, но не двигателя.У вас есть масляный насос (также часть двигателя), который качает масло в цилиндры двигателя.Большинство автомобилей (возможно, всех) не «проверяют уровень масла» и отказываются заводиться.Двигатель просто закроется, если не будет достаточно масла.Аналогично, если он не получает достаточно газа, он не проверяет уровень бензобака ... у него просто заканчивается топливо.

Это было бы больше так:

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

Таймер представляет обороты двигателя, так как он вращается, он приводит в действие масляный насос, который закачивает масло в цилиндры.Масло обычно не «расходуется», как топливо.Это переработано.Со временем он может сломаться, а в некоторых двигателях, которые находятся в плохом состоянии, он может сгореть.

Ссылка «Масляный насос» представляет собой механическую связь между двигателем и масляным насосом (обычно зубчатые колеса поворачивают его).Таймер не имеет масляного насоса, он имеет ссылку на масляный насос.

Бензобак будет работать аналогичным образом.

Опять же, все это несовершенно (очень несовершенно), потому что так много не хватает.

2 голосов
/ 22 октября 2011

Я бы сказал, что Car сам по себе является OilCirculatingSystem.

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

Сам по себе Car уже является классом, соединяющим все ваши компоненты, зачем вам нужен еще один?

1 голос
/ 22 октября 2011

Тот факт, что подача является непрерывной, означает, что она должна быть проверена после определенного интервала времени.Если это не то, что вы ищете, вам, возможно, придется уточнить ваш вопрос.

Наиболее логичным подходом к этой проблеме (при условии, что у вас нет событийного или сигнального / слотного программирования) будет иметь автомобильпроверяйте состояние двигателя, каждый выбранный интервал времени и, если двигателю нужно больше масла, автомобиль должен прочитать некоторые данные из бака и передать их в двигатель.

Вот простой пример псевдокодачтобы продемонстрировать, что я имею в виду:

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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...