Re[21]: Model-View-Controller в .Net
От: Greg Zubankov СССР  
Дата: 06.06.07 09:19
Оценка:
Здравствуйте, 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...;
    }

Я правильно понял?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.