Доброго всем дня.
Понимаю что тема измученна, но толкового ответа пока так и не нашел.
Теперь возникший вопрос.
Существует приложение на 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;
Можете ли Вы посоветовать как
Правильно сделать механизм обмена данными между множеством форм и моделью.
Здравствуйте, 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(...) отпадет сама по себе, если использовать не сам объект а его интерфейс
С уважением,
Евген.