MVP шаблон и WinForms MDI приложение
От: Pencroff  
Дата: 29.08.11 08:09
Оценка:
Доброго всем дня.
Понимаю что тема измученна, но толкового ответа пока так и не нашел.
Теперь возникший вопрос.
Существует приложение на WinForms в котором:
1. Модель — бизнес логика и обработка информации
2. Представитель — посредник между моделью и представлением. Исключительно передача запросов и вызов методов.
3. Представление — интерфейс который реализует главная форма. Все запросы синхронные и вопросов кому предназначена информация (для children form) не возникает.
Но с добавлением 4-5 children форм. IView очень разросся и код в главной форме это передача данных от children форм к представителю и обратно.
Сейчас же хотим переработать интерфейс IView до вида GetData (посылает запрос на какие либо данные к модели) и SetData (ответ модели на запрос или просто генерация сообщения).
что бы все обработки по получению и обработке данных выполнялись в дополнительных классах.
Пробовали применить различные паттерны типа "Посетителя" и "Команды". Но в конечном итоге приходим к конструкции swich ... case в том или ином месте программы.
Мне же хочется это решить на уровне наследования и полиморфизма.
Смотрел статью
Автор(ы): Беркович Вадим, Чудин Андрей
Дата: 09.04.2003
Практически во всех проектах можно встретить те или иные паттерны проектирования. Но далеко не часто они обозначены разработчиками. Проект, в котором явно обозначены все использованные паттерны, удобнее для понимания и более управляем. Можно сказать, что описание проекта в терминах паттернов добавляет новые метаданные о проекте. Если мы считаем, что данный класс реализует паттерн "итератор", мы сразу получаем представление об его интерфейсе и роли. Если же изначально весь проект реализован с использованием паттернов, то управление проектом упрощается. Обобщение удачных решений конкретных задач в паттерны и использование их в последующих проектах существенно ускоряет процесс разработки. А код становится более понятным и элегантным, и им можно будет воспользоваться повторно.
.
Но там тоже есть участок кода:
{ обрабочик команд TOrdersAppModule }
procedure TOrdersAppModule.ExecCommand(Command: TCustomCommand);
begin
  if Command is TNewOrderCommand then // создать заказ
    OnCommand_NewOrder( TNewOrderCommand(Command) );

  if Command is TNewOrderItemCommand then // добавить позицию заказа
    OnCommand_NewOrderItem( TNewOrderItemCommand(Command) );
 
  if Command is TGetOrderCommand then   // получить данные об активном заказе
    OnCommand_GetOrderCommand( TGetOrderCommand(Command) );
end;

Можете ли Вы посоветовать как Правильно сделать механизм обмена данными между множеством форм и моделью.
winforms mvp mdi
Re: MVP шаблон и WinForms MDI приложение
От: EvgenB Украина  
Дата: 29.08.11 10:52
Оценка:
Здравствуйте, Pencroff, Вы писали:

P>Доброго всем дня.

...

Доброго!


P>Но там тоже есть участок кода:

P>
P>{ обрабочик команд TOrdersAppModule }
P>procedure TOrdersAppModule.ExecCommand(Command: TCustomCommand);
P>begin
P>  if Command is TNewOrderCommand then // создать заказ
P>    OnCommand_NewOrder( TNewOrderCommand(Command) );

P>  if Command is TNewOrderItemCommand then // добавить позицию заказа
P>    OnCommand_NewOrderItem( TNewOrderItemCommand(Command) );
 
P>  if Command is TGetOrderCommand then   // получить данные об активном заказе
P>    OnCommand_GetOrderCommand( TGetOrderCommand(Command) );
P>end;
P>

P>Можете ли Вы посоветовать как Правильно сделать механизм обмена данными между множеством форм и моделью.

Кто вам мешает использовать интерфейсы?
Создайте интерфейс типа:

    public interface ICustomCommand
    {
        public void Execute();
    }


и передавайте его в качестве параметра в вашу процедуру:
procedure TOrdersAppModule.ExecCommand(Command: ICustomCommand);


реализацию "OnCommand_NewOrder", "OnCommand_GetOrderCommand" надо перенести в классы соответствующих команд или же в фабрику и получится что-то вроде:

    public class NewOrderCommand : ICustomCommand
    {
        public void Execute()
        {
            OnCommand_NewOrder((TNewOrderCommand)this);
        }
    }

    public class GetOrderCommand : ICustomCommand
    {
        public void Execute()
        {
            OnCommand_GetOrderCommand((TGetOrderCommand)this);
        }
    }


в этом случае ваш обработчик превращается в совсем простую штуку:

    public class TOrdersAppModule
    {
        public static void ExecCommand(ICustomCommand command)
        {
            command.Execute();
        }
    }


извиняйте, что на сях ... но Паскакаль уже давно не юзаю

З.Ы. Собсно необходимость в TOrdersAppModule.ExecCommand(...) отпадет сама по себе, если использовать не сам объект а его интерфейс

С уважением,
Евген.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.