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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.12.2007, 15:42   #1  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Могу ошибаться, но мне кажется, что:
1. при построении перекрестных ссылок у Аксапты может пехать крыша
2. query лучше строить не в коде, а в AOT, а в коде инстанцировать одной строкой query = new Query(querystr(mySuperQuery))
1. Не поедет - это такой же код как и другой
2. Query плохо читаемо: для того, чтобы узнать, какие есть условия на поля надо активно возить мышкой и нажимать на плюсики. Даже для того, что убедится, что оно не отсортировано. Т.е. визуализация Query содержит много лишних деталей, но при жтом нужные детали запрятаны глубоко.

Сорри, при наведении на датасурс часть структуры показывается...

Последний раз редактировалось belugin; 13.12.2007 в 15:46.
Старый 13.12.2007, 16:16   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
1. Не поедет - это такой же код как и другой
Не совсем. Уровней вложености много.

Цитата:
Сообщение от belugin Посмотреть сообщение
2. Query плохо читаемо: для того, чтобы узнать, какие есть условия на поля надо активно возить мышкой и нажимать на плюсики. Даже для того, что убедится, что оно не отсортировано. Т.е. визуализация Query содержит много лишних деталей, но при жтом нужные детали запрятаны глубоко.
В том то и дело.
В АОТ структура запроса отделена от кода. Следовательно:
1. заниматься оптимизацией и улучшизмами можно отдельно от кода (может отдельный человек)
2. апгрейд сильно упрощается, поскольку самым трудоемким является апгрейд кода. А количество кода при использовании Query из АОТ сильно уменьшается.

Но что-то я ушел от темы.

В общем, я согласен, что паттерн ExpressionBuilder позволяет сделать интересный код.
Но у него все ж таки есть недостатки, связанные с глубиной.
1. как я уже говорил могут поехать перекрестные ссылки
2. по-моему, нельзя будет поставить точку останова на конкретный метод (дебаггер остановится на первом вызове, а затем в дебаггере нужно будет заходить в каждый парм-метод)
3. возникают очень тонкие и неявные побочные явления, связанные с порядком вызова методов и их аргументов
4. не дай бог какому-нибудь из методов вернуть значение Null.
5. непонятно как возвращать параметры

В общем, все равно весь код в подобном стиле написать не получится.
Значит будет дикая смесь нотаций: традиционной и через-точку.

В общем, как руководитель проекта я не стал бы запрещать подобную запись, но и рекомендовать к использованию тоже бы не стал.
__________________
полезное на axForum, github, vk, coub.
Старый 13.12.2007, 16:34   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Не совсем. Уровней вложености много.
Надо проверить....

Цитата:
1. заниматься оптимизацией и улучшизмами можно отдельно от кода (может отдельный человек)
В принципе, да, есть примеры в реальности? Как фиксируется интерфейс Query (то есть то, что нельзя менять при такой оптимизации - состав полей, порядок записей)
Цитата:
2. апгрейд сильно упрощается, поскольку самым трудоемким является апгрейд кода. А количество кода при использовании Query из АОТ сильно уменьшается.
Я мало занимался апгрейдом, но при закачке внутренних обновлений обычно код сравнивать легче, чем, например, формы.

Я за то, чтобы не использовать Builder в модицикациях кода подверженного апгрейдам (имеется ввиду сторонний код).

Цитата:
2. по-моему, нельзя будет поставить точку останова на конкретный метод (дебаггер остановится на первом вызове, а затем в дебаггере нужно будет заходить в каждый парм-метод)
Согласен.

Цитата:
3. возникают очень тонкие и неявные побочные явления, связанные с порядком вызова методов и их аргументов
Вот тут не очень понятно, можено пример? Вроде порядок вызова четко определен.

Цитата:
4. не дай бог какому-нибудь из методов вернуть значение Null.
Каким образом return this может превратиться в Null

Цитата:
5. непонятно как возвращать параметры
Так как builder нацелен на создание Query, у него все сделано для того, чтоб эта задача решалась максимально просто и лаконично. Возврат параметров просто будет методами с более длинными названиями. Либо через Query

Цитата:
В общем, все равно весь код в подобном стиле написать не получится.
Значит будет дикая смесь нотаций: традиционной и через-точку.
Ну не согласен что смесь - скорее кровавая Мери - водка отдельно, томатный сок отдельно.
Старый 13.12.2007, 18:55   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Андре Посмотреть сообщение
Кстати, побочным удобством данного подхода является то, что можно легко прикрутить логирование.
А чем легче, чем при традиционном?

Цитата:
Сообщение от Андре Посмотреть сообщение
Не больше, чем если бы ты их точно так же вызывал последовательно с новой строки. Это скорее проблема корректно реализации класса, дабы он позволял присваивать параметры в произвольном порядке.
отвечю чуть ниже
Цитата:
Сообщение от belugin Посмотреть сообщение
Вот тут не очень понятно, можено пример? Вроде порядок вызова четко определен.
X++:
parm1(someComplexType _var)
{
    // модифицируется и проверяется _var
    return this;
}
parm2(someComplexType _var)
{
    // модифицируется и проверяется _var
    return this;
}

classvar.parm1(func1(var1)).parm2(func2(var1));
в каком порядке будут вызваны parm1, parm2, func1, func2?
Если вдобавок внутри происходит модификация переменных, то...

Не помню у кого, но видел в подписи выражение типа (i=1;i+=(i++)+(i++);cout<<i);
запись через точку порождает примерно такие же головоломки


Цитата:
Сообщение от belugin Посмотреть сообщение
Каким образом return this может превратиться в Null
Во всей Аксапте принято возвращать null или пустую запись, если что-то не получилось.

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

Цитата:
Сообщение от belugin Посмотреть сообщение
Так как builder нацелен на создание Query, у него все сделано для того, чтоб эта задача решалась максимально просто и лаконично.
А... дык, это только для создания query...
__________________
полезное на axForum, github, vk, coub.
Старый 13.12.2007, 19:04   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
А чем легче, чем при традиционном?

отвечю чуть ниже


X++:
     parm1, parm2, func1, func2?
Если бы не было return this, to все было то же самое. кроме повторения названия переменных.

func1, parm1, func2, parm2.

Цитата:
Если вдобавок внутри происходит модификация переменных, то...

Не помню у кого, но видел в подписи выражение типа (i=1;i+=(i++)+(i++);cout<<i);
запись через точку порождает примерно такие же головоломки
не.. тут зависимости видны явно.

Разве есть разница между

X++:
query.proc1(func1(x));
query.proc2(func2(x));
и
X++:
query.proc1(func1(x))
        .proc2(func2(x));

Цитата:
Например, методу передали неправильное значение и он хочет сообщить вызывающему об ошибке. В нормальных языках он должен возбудить исключение с определенным типом. А здесь непонятно что.
Тоже исключение.

Цитата:
А... дык, это только для создания query...
Именно! Этою билдер - оно и в названии отражено.
Старый 13.12.2007, 19:15   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение

X++:
     parm1, parm2, func1, func2?
Если бы не было return this, to все было то же самое. кроме повторения названия переменных.

func1, parm1, func2, parm2.
Не факт
порядок скорее зависит от конкретной реализации интерпретатора/компилятора. Это значит, что для 2.5, 3.0, 4.0, 5.0, а может быть и для каждого сервис-пака, надо проверять отдельно
__________________
полезное на axForum, github, vk, coub.
Старый 18.12.2007, 18:39   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
Не факт
порядок скорее зависит от конкретной реализации интерпретатора/компилятора. Это значит, что для 2.5, 3.0, 4.0, 5.0, а может быть и для каждого сервис-пака, надо проверять отдельно
Если внимательно посмотреть на код то вфзов parm1 требует вызова func1 => func1 вызовется раньше parm1. вызов parm2 требует вызова parm1, func2.

=> порядок вызова такой func1 (parm1 | func2) parm2

то есть единственная неопределенность - что раньше вызовется parm1 или func2.

Если func2 не будет иметь побочных эффектов то смысл кода не изменится.
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
Переменные в наследнике класса longson DAX: Программирование 32 12.07.2007 00:09
передача курсора в два класса kitty DAX: Программирование 3 09.08.2006 13:21
Запустить метод класса loka DAX: Программирование 2 13.03.2006 15:40
Какой метод какого класса может вернуть величину прихода/расходa по номенклатуре ATimTim DAX: Программирование 3 21.02.2005 13:06
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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