AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.11.2004, 11:51   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Реализация паттерна Visitor в Axapta
На днях, работая над довольно большой задачей, заметил, что для решения небольшой подзадачки мне идеально походит паттерн Visitor.
Про сам паттерн можно прочитать здесь , я лишь подчеркну особенности реализации паттерна в Аксапте.
Невозможность перегрузки методов в Axapta вызывает наибольшие затруднения при реализации паттерна. Так двойную диспетчеризацию, лежащую в основе паттерна пришлось реализовать вот таким довольно корявым образом:
PHP код:
        void visit(Employee empl)
        {

        
Boss boss;
        ;
        
totalDays += empl.getVacDays();
        if (
classIdGet(empl) == classNum(Boss))
        {

        
boss empl;
        
totalDays += boss.getBonusDays(); }

        } 
Вот здесь можно скачать пример, , демонстрирующий реализацию паттерна. Пример использования абстрактный, не имеющий отношения к реальной задаче. Соответствие ролей классам следующее:

Роль Класс
Посетитель(Visitor) Visitor
Конкретный посетитель(Concrete Visitor) VacationVisitor
Конкретный элемент (Concrete Element) Employee, Boss
Старый 12.11.2004, 14:02   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
PHP код:
if (classIdGet(empl) == classNum(Boss)) 
-->
PHP код:
SysDictClass::isEqualOrSuperclass(classIdGet(empl),classNum(Boss)) 
еще можно попробовать вынести этот код в макрос типа:
PHP код:
#localmacro.process
    
if(SysDictClass::isEqualOrSuperclass(classIdGet(empl),classNum(%1))
    {
        
this.visit_%1(empl);
    }
#endmacro 
и тогда
PHP код:
void visit(Employee empl)
{
   
#process(Boss)
   #process(TinyMan)
}
void visit_Boss(Boss boss)
{ ...
}
void visit_TinyMan(TinyMan man)
{ ...

Старый 12.11.2004, 14:13   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
isEqualOrSuperclass
Не - здесь по смыслу нужен именно isEqual, для SuperClass может своя логика реализовываться. Можно конечно добавить свой метод isEqual - но там идея будет таже самая - сравнение id:

PHP код:
   if (_id == _potentialAncestorId)
return 
true
Насчет макросов - красиво. Но я стараюсь их избегать, так как они противоречат ООП. Кроме того, где-то читал, что в будующих версиях от них попробуют отказаться.
Старый 12.11.2004, 14:34   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Изначально опубликовано Андре
[B]
Не - здесь по смыслу нужен именно isEqual, для SuperClass может своя логика реализовываться.
таким образом Visitor будет чувствителен к дальнейшему подразаделению классов. в отличие от классического.

то есть будет не общий алгоритм для всех боссов, а общий алгоритм "для всех боссов у которых мы не нашли еще разновидностей" - с моей точки зрения это нехорошо, так как вводит лишнюю зависимость.

Цитата:
Насчет макросов - красиво. Но я стараюсь их избегать
даже в pack unpack
Старый 12.11.2004, 15:35   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
.... это нехорошо, так как вводит лишнюю зависимость.
Согласен. Спасибо.

Цитата:
даже в pack unpack
Тут уж никуда не денешься
Старый 13.11.2004, 14:14   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо за отличный пример и за отличную ссылку.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 12.04.2007 16:10
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 22.11.2006 15:20
Реализация замен и аналогов в Axapta 3.0 Om DAX: Функционал 15 16.10.2006 12:29
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:16.