Здравствуйте, IB, Вы писали:
ID>
Спасибо за ответ. Хочется разобраться c MVP
IB>Здравствуйте, Greg Zubankov, Вы писали:
GZ>> bool SetRect(Rect const&); // bool для уведомления о результете изменения успех/неудача
GZ>> bool SetState(State);
IB>Какая может быть неудача и какая логика на этом может быть построена?
Вынести в модель логику проверку отличия переданного значения параметра от хранимого.
Наверно этим лучше заняться Presenter'y.
GZ>>В случае с кнопкой интерфейс представления будет состоять из функций для отображения кнопки на экране, запроса на перерисовку кнопки и событий оповещающих Presenter о движении мыши и нажатиях на кнопки мыши (клавиатурные команды для простоты рассматривать не будем).
GZ>>Получается так:
IB>Не совсем. Обычно все-таки интерфейс View полее высокоуровневый, все эти отслеживания мыши и прочую конкретику берет на себя библиотека отображения. Интерфейс вью проще — нажали/не нажали, скрыли/показали, Enable/Disable, задали текст/изображение..
В том то и дело, что отдельный элемент управления это не форма c данными пользователя. Отслеживание мыши и многое другое (фокус, клавиатура etc.) это дело контрола. Ибо больше некому. Модель — хранит данные, Presenter — управляет их изменением. Остается только представление.
GZ>>// пример реализации одной из функций
IB>Нет, призентер ничего не знает о конкретных кнопках мыши или клавиатуры. К нему просто приходит извещение о том, что состояние кнопки изменилось. Каким способом это произошло — его не интересует, это забота вью.
IB>Забота презентера — изменить модель в соответствии с этим изменением и, возможно, изменить другие представления, то есть, довольно высокоуровневая логика.
Тогда его интерфейс повторяет интерфейс модели + события от представления
class Presenter
...
Rect GetRect() { return model->GetRect(); }
State GetState() { return model->GetState(); }
//
void SetRect(Rect rect)
{
model->SetRect(rect);
view->Draw(model->GetRect(), model->GetState());
}
void SetState(State state)
{
model->SetState(state);
view->Draw(model->GetRect(), model->GetState());
}
// обработчики событий
void OnSetRect() { SetRect(view->GetRect()); }
void OnSetState() { SetState(view->GetState()); }
Очень напоминает активную модель в схеме MVC.
GZ>> Если владелец кнопки захочет изменить ее местоположение или (пусть даже так) состояние, функциями какого класса он будет пользоваться?
IB>Все изменения модели происходят через соответствующий презентер.
к примеру некоторая форма размещает кнопки на себе:
class OkCalcelForm
...
void SetLayout()
{
GetOkButtonPresenter()->SetRect...;
GetCancelButtonPresenter()->SetRect...;
}
Я правильно понял?