rvller
@rvller

Реакция на изменение состояния объекта

Интересен вопрос, как бы вы реализовали возможность добавления некого обработчика(метода) при изменении состояния объекта.

Например, имеем класс:

class car {
private Engine engine;
private CarType carType;
...

public void setEngine(Engine engine) {
this.engine = engine;
}

public void setCarType(Engine carType) {
this.carType= carType;
}
}


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

В неправильном решении это будет выглядеть так:

class car {
private Engine engine;
private CarType carType;
...

public void setEngine(Engine engine) {
this.engine = engine;
calculateCarCost()
}

public void setCarType(Engine carType) {
this.carType= carType;
calculateCarCost()
}

public void calculateCarCost() {
...
}
}


Язык значения не имеет, важна идея.
  • Вопрос задан
  • 2424 просмотра
Пригласить эксперта
Ответы на вопрос 4
А чем приведенное решение неправильно? Замените calculateCarCost на какое-нибудь updateObject и получите примерно то, что обычно и делают в такой ситуации.
Ответ написан
Комментировать
Наверное, стоит узнать про [google]Паттерны проектирования[/google]. В данном случае подходит вот этот: Observer
Ответ написан
Если гибкость (другие методы, включая других обхектов, не один метод и т. п.) не важна, то вполне нормальное решение, имхо. Единственный нюанс, что отслеживаете присваивание, а не изменение. Следуя букве задачи и абстрагируясь от языка перед присваиванием и вызовом сначала нужно сравнить, а не присваивается ли то же самое значение и, соответственно, лишний раз вызывается метод, а если нет то и не присваивать, и не вызывать.
Ответ написан
Комментировать
taliban
@taliban
php программист
У Вас вполне хорошее решение. Если Вы хотите чтоб некий метод calculateCarCost вызвался сам, то у Вас это не получится, его нужно вызывать ручками, хотя, если Вас не интересует язык:

class Car
{
    protected function A()
    {
    }

    protected function B()
    {
    }
    
    protected function Calculate()
    {
    }

    public function __call($func, $args)
    {
        call_user_func_array(array($this, $func), $args);
        $this->Calculate();
    }
}

Я не знаю есть ли такая возможность в с++, но сут в том что методы вызываются не напрямую а через метод посредник. Хотя в Вашем случае я бы все оставил как есть =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы