ООП лифта оценки


Я не столько используется для проектирования ООП, так что я взял один из очень часто используемых вопрос интервью , "проектирование системы лифтов". Ниже представлен прототип.

Я хотел бы получить некоторую обратную связь на дизайн

  • Лучшие практики, которые будут иметь конкретный аспект
  • Гибкость в коде
  • Некоторые важные общие функции, отсутствующие
  • Районах, чтобы сконцентрироваться на написание кода и дизайна

Я знаю, что подобные вещи не имеют конечного ответа или только один ответ, но я хотел бы знать, мой требует улучшения.

Оригинальный Дизайн:

class elevator{
    private:
    //The Lift box the elevator controls
    liftbox box;
    //The total number of levels
    const int LEVEL;
     //The request for various floors
    set<int> req;
     //Triggers the search to move to the next floor if required 
    void moveLiftToNext();
    //Instructs the lift box to move to that floor
    void moveLiftTo(int);
    public:
    //Adds request to the queue
    void addRequest(int);
    //Gets the total levels the box can move
    int getLevel();
    //For Emergency
    void setEmergency();
    void unsetEmergency();
};

class liftbox{
private:
    dailpad pad;
    elevator ele;
    int currLevel; //Current position
    bool direction; //True - up ; False- Down
public:
    //Instruction to move the box to certain level
    void Move(int x){
        if(x < 0 || x >= ele.getLevel())
            return; //invalid number
        //Move the lift
        //update direction and currLevel
    }
    //returns the current level. Used by Elevator
    int getCurrLevel();
    //returns the current direction of movement.Used by Elevator 
    int getDirection();
    void setEmergency(){
        //Do the required 
        ele.setEmergency();
    }
    void unsetEmergency(){
        ele.unsetEmergency();
    }
    //can passed to the elevator
    void addRequest(int);
};


class dailpad{
private:
    //Some DS to represent the dailpad 
    //Lift box is belongs to 
    liftbox box;
public:
    void recieveCommand(int x){
        //Depending on the value we can do the following
        box.setEmergency();
        //or
        box.unsetEmergency();
        //or
        box.addRequest(x);
    }
};

Обновленный Дизайн:

class elevator{
private:
    //The Lift box the elevator controls
    liftboxControlUnit & mLiftBoxCtrlUnit;   

    //constructor
    elevator(int Level=1, int NoOfBanks =1 );

    //Destructor
    ~elevator();

    //Triggers the search to move to the next floor if required 
    void moveLiftToNext();

public:

    //Adds request to the queue
    void addRequest(int FloorNumber){

    //Add the request to the queue. The single button outside the elevator door
    mLiftBoxCtrlUnit.addRequest(FloorNumber);

    }

    //For Emergency. Should be accessible to everyone !
    void setEmergency();
    void unsetEmergency();

};

typedef enum Direction{
    UP,
    DOWN
}direction;

class liftboxControlUnit{
private:

    //The request for various floors
    set<int> mRequestQueue;

    //The various banks for the whole system
    vector<Bank> mBanks;

    //The total number of levels. Remains the same for one building
    const int mTotalLevel;

    //Instruction to move the box to certain level
    void processRequest(){

        //Do the logic to move the box.

    }

    //can passed to the elevator
    void addRequest(int x){
        mRequestQueue.insert(x);
    }

    //Can be set by elevator class
    void setEmergency(){
        //Do the required 
        //Set Emergency on all Banks
    }

    void unsetEmergency(){
        //UnsetEmegency on all banks
    }

    void emergencyListener(){
        //Listen to all the banks if emergency has been set
    }

    void BankFreeListener(){
        //Listen to the banks if any is free

        //If so then
        processRequest();
    }

public:
    //Constructor
    liftboxControlUnit(int TotalLevels, int NoOfBanks): mTotalLevel(TotalLevels){
        for(int i=0 ; i lessthan NoOfBanks; ++ i)
            mBanks.push_back(Bank(0,UP));
    }    
    friend class elevator;
};

class Bank{
private:

    //The dailpad inside the bank
    dailpad & mpad;

    //Current Location
    int mPresentLevel;

    //Current direction of movement
    direction mDirection;

    //Currently moving
    bool mEngaged;

    //Manipulate the bank
    void move(int NoOfMoves){
        setEngaged();

        //Move the elevator

        unsetEngaged();    
    }

    //getters
    int getPresentLevel() const;
    int getDirection() const;

    //setters
    void setPresentLevel(int);
    void setDirection(direction);

    //Manipulate the engaged flag
    bool isEngaged() const;
    bool setEngaged();
    bool unsetEngaged();

    //For emergency
    void reset();

    //Dailpad Listener
    void dailpadListener(){

    }


public:
    Bank(int StartingLevel, direction Direction): mPresentLevel(StartingLevel),
            mDirection(Direction),
            mEngaged(false),
            mpad()
    {

    }

    //For emergency . Should be available for all.
    void SetEmergency();
    void UnsetEmergency();
    bool isEmergency();

    friend class liftboxControlUnit;
};


class dailpad{

private:
    //Some DS to represent the state . probably a 2D Array.

    void renderDisplay();

public:

    //Constructor
    dailpad();

    void getCommand(int x){
        //Depending on the value we can do the following

        //Make necessary changes to the display
        renderDisplay();
    }

    friend class Bank;
};


22096
3
задан 1 ноября 2011 в 02:11 Источник Поделиться
Комментарии
3 ответа

Первый код на C++:

class elevator{
liftbox box;

class liftbox{
elevator ele;

Это не будет работать как вы ожидаете.
Каждый класс содержит объект другого типа означает, что оба будут иметь совершенно разные объекты. Если вы хотите, чтобы они отсылают друг к другу какие-то отношения родителей ребенка, то один из них должен быть ссылкой или указателем на родителя.

const int LEVEL;

Традиционно все крышки предназначена для макросов. Нарушать традицию на свой собственный счет.

int getCurrLevel();
int getDirection();

Методы, которые возвращают информацию о состоянии объекта без фактического изменения состояния должны быть помечены как const.

public/private

Я не уверен, что я согласен с некоторыми из решений о заключении государственными методами. Я думаю, что очень немногие объекты должны взаимодействовать с этими системами, иногда дружба может помочь в ограничивающие доступ. (Теперь увеличивает дружбы сцепки с другом, но, если он уменьшает внешний интерфейс его будет уменьшаться сцепление с предметами, которые не имеют права модифицировать объект). В любом случае я ожидал бы увидеть обоснование, почему методы государственных. Если кто-то должен уметь называть их в порядке. Если никто, кроме другого объекта должен позвонить им нужно сделать лучше дела.

Дизайн

Глядя на него с точки зрения дизайна.

Не уверен, что я вижу различие между лифтом/liftbox

В больших зданиях некоторые лифты не ходят на все этажи.

Одна из вещей, о лифтах, что они, как правило, приходят в банки и не работают самостоятельно. Для очень большого здания нескольких банков будут объединены, но будет работать самостоятельно (если есть какие-то серьезные ЧП). Как вы собираетесь организовать свой код так, что несколько подъемников(лифтов к сожалению) можем работать вместе. Также я хочу посмотреть, как вы можете отвязать лифт объект от банка логику управления. (т. е. я не ожидаю, чтобы увидеть всю логику управления в банке, хотелось бы увидеть логику управления в лифте, но логики принятия решений в банке). Но если их несколько банков для координации я хочу логику более высокого уровня управления.

Реальное мясо этой проблемы заключается в том, как отделить объекты друг от друга. Какие модели вы считаете используются здесь.

Обновленный Код:

Не уверен, что вы понимаете банке работают лифты (на основе кода).


Банк представляет собой группу из 2 или более лифтов, которые работают вместе, чтобы служить набор пол.

Я все еще не вижу шаблон, который вы используете для отделения лифтов от банка.

4
ответ дан 1 ноября 2011 в 12:11 Источник Поделиться

Я согласен с тем, что изящные Локи. Я хотел бы добавить несколько.


  1. Вместо liftbox спрашивая лифт для общего числа уровней, лифт, окно могло быть дано общее количество в конструктор (это если liftbox должен быть создан с помощью лифта).

  2. Это не важный момент, но использование логическое значение , чтобы указать направление не самый простой для чтения. Я бы возникнуть соблазн заменить его перечисления , которые позволили бы вариантов вверх или вниз. Это было бы гораздо легче читать и устранило бы необходимость для комментария, чтобы объяснить это.

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

  4. Наконец, как и в пункте 3, я бы рекомендовал дифференцировать между локальным и глобальным переменным. Например, в некоторые стандарты кодирования, программисты префикс их глобальных переменных с подчеркивания (например, _currLevel). Я пишу свои глобальные переменные в случае Паскаля, начинающиеся с символа 'м', чтобы показать, что они переменные-члены (например, mCurrLevel). Это хорошо, чтобы попробовать и принять аналогичные соглашениям об именовании, так как он действительно помогает облегчить чтение кода.

2
ответ дан 1 ноября 2011 в 01:11 Источник Поделиться


  • Колодки циферблат, как правило, также отражают набор запросов, которые уже зарегистрированы (что делает эти кнопки свет-вверх). Это означает, что там может быть способ, чтобы рассказать все кнопки колодки - раз действие происходит за пределами площадки циферблат, а также.

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

  • уровней:
    уровень константный тип int; : это должно быть свойство коробки, а не лифт.

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

  • там где ты выложил список направлений вверх и вниз-словом - а кто управляет алгоритм, которому нужно следовать?

В целом это хорошо.

0
ответ дан 1 ноября 2011 в 03:11 Источник Поделиться