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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.08.2013, 11:45   #1  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Новый шаблон проектирования execute()
Наверное все используют шаблон construct(), основанный на рекомендациях Microsoft. Я придумал небольшое нововведение, позволяющее методы сделать более "чистыми".
Пример кода, как мы обычно строим RunBase-класс:
X++:
class ConstructTemplateDemo extends RunBase
{
    public static void main(Args _args)
    {
        ConstructTemplateDemo constructTemplateDemo = ConstructTemplateDemo::construct();
        ;
    
        if (constructTemplateDemo.init() && constructTemplateDemo.prompt())
        {
            constructTemplateDemo.run();
        }
    }

    public static ConstructTemplateDemo construct()
    {
        return new ConstructTemplateDemo();
    }
}
Видно, что и сам класс и его переменная занимают много места в тексте, кроме того в методе main() может также анализироваться _args, что усложнит логику метода и читать этот метод станет сложнее.
Прикинем, что можно сделать... Выделим содержимое метода main() в новый метод и посмотрим, что же у нас получилось:
X++:
class ExecuteTemplateDemo extends RunBase
{
    public static void main(Args _args)
    {
        ExecuteTemplateDemo::construct().execute();
    }

    public static ExecuteTemplateDemo construct()
    {
        return new ExecuteTemplateDemo();
    }

    public void execute()
    {
        if (this.init() && this.prompt())
        {
            this.run();
        }
    }
}
З.Ы. Критика приветствуется
__________________
// no comments
За это сообщение автора поблагодарили: mazzy (5).
Старый 28.08.2013, 12:32   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от dech Посмотреть сообщение
в методе main() может также анализироваться _args, что усложнит логику метода и читать этот метод станет сложнее
Обычно логику обработки _args выносят в отдельный метод this.initFromArgs(_args) и вызывают его из Main.

Как вы предлагаете работать с _args?
Старый 28.08.2013, 13:07   #3  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Обычно логику обработки _args выносят в отдельный метод this.initFromArgs(_args) и вызывают его из Main.

Как вы предлагаете работать с _args?
Как вариант:
X++:
public void execute(Args _args)
{
    this.initFromArgs(_args);
    if (this.init() && this.prompt())
    {
        this.run();
    }
}
__________________
// no comments
Старый 28.08.2013, 13:45   #4  
twilight is offline
twilight
MCTS
MCBMSS
 
876 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Не вижу особых преимуществ. Общее количество строк не изменилось, а вот методов стало больше.
__________________
I could tell you, but then I would have to bill you.
Старый 28.08.2013, 13:49   #5  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Ну уж если поворчать, то в DAX4 и DAX2009 Microsoft рекомендует использовать не construct напрямую, а методы newЧего-то-там, а construct делать защищенным, причем в конструкторе только создавать экземпляр класса, не устанавливая никаких параметров (в BP даже есть проверка на это).
А вот в методах new* и делать инициализацию из параметров.
Старый 28.08.2013, 13:54   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
См также SysOperation framework в 2012
За это сообщение автора поблагодарили: dech (1).
Старый 28.08.2013, 15:35   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от twilight Посмотреть сообщение
Общее количество строк не изменилось, а вот методов стало больше.
Можно такой метод execute (включающий в себя наиболее распространённую и правильную комбинацию действий) поместить в базовый класс. Тогда его не нужно будет повторять на каждом наследнике. В результате кода и методов станет меньше.

Но согласен. Сверхполезным такое нововведение я бы не назвал.
Выбирая между красивым кодом и стандартным я бы выбрал стандартный.
Старый 29.08.2013, 05:53   #8  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Я уже говорил, изменения минимальны, но позволяют отделить всю стандартную шелуху в отдельный метод и сосредоточиться на главном.
Цитата:
Сообщение от belugin Посмотреть сообщение
См также SysOperation framework в 2012
Посмотрим
__________________
// no comments

Последний раз редактировалось dech; 29.08.2013 в 06:01.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX 2012 и шаблоны проектирования db DAX: Программирование 31 24.07.2014 12:40
dax-lessons: Get the underlying SSRS Report Query, reset query , add your own ranges and execute report [Dynamics AX 2012, X++] Blog bot DAX Blogs 0 30.04.2013 01:13
palleagermark: AIF: Execute messages on demand Blog bot DAX Blogs 0 11.01.2012 20:12
Synchronisation Error: Cannot execute a data definition language command on (). Blog bot DAX Blogs 0 20.12.2008 05:37
ODBCConnection Execute Select gb DAX in English 6 07.08.2005 00:00

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

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

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