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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.10.2009, 10:36   #1  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
? Как работает тернарный оператор
Почему для этого кода, в предпоследней строке, вываливает ошибка "Типы операнда не совместимы с оператором.":
X++:
return        _cmd == Command::CopyAll ? new EditCopyAll ()
            : _cmd == Command::Copy    ? new EditCopy    ()
            : _cmd == Command::MoveAll ? new EditMoveAll () 
            : _cmd == Command::Move    ? new EditMove    ()   // ошибка "Типы операнда не совместимы с оператором."
            : null;
причем если упростить до такого, то все ОК:
X++:
return        _cmd == Command::CopyAll ? new EditCopyAll ()
            //: _cmd == Command::Copy    ? new EditCopy    ()
            //: _cmd == Command::MoveAll ? new EditMoveAll () 
            //: _cmd == Command::Move    ? new EditMove    ()
            : null;

Это очередная баго-фича или есть смысл в таком поведении?
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
Старый 22.10.2009, 10:45   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
странный код... это метод construct() какого то класса? это код стандартного функционала?
может просто привык, но обычно в construct() используется оператор switch...

теперь по существу, предположу что класс EditMove не является наследником класса, который инициализируется.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 22.10.2009, 11:02   #3  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
С наследованием все в порядке.

Код свой. Для меня такой код выглядит более "чистым" и декларативным чем switch. Обратите внимание, что условия могут буть сколько угодно сложными. Второе, компилятор требует обязательно вернуть значение, а это более и безопасно и более читаемо, явно видно какой результат хочет получить программист который это писал. А а не просто "делай то не знаю что".
Ну где-то так.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
За это сообщение автора поблагодарили: miklenew (-1).
Старый 22.10.2009, 11:15   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
X++:
static MyClass construct(TypeRun _typeRun)
{
  MyClass  retClass;
  
  switch(_typeRun)
  {
    case 1 :
    retClass = new MyClass_1();
    break;

    case 2 :
    retClass = new MyClass_2();
    break;

    default : retClass = new MyClass();
  }

  return retClass;
}
мне кажется такой вид понятен, и выполняет требования компилятора.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: mazzy (2).
Старый 22.10.2009, 11:18   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Попробуйте взять в скобки вложенные операторы.
X++:
return        _cmd == Command::CopyAll ? new EditCopyAll ()
            : (_cmd == Command::Copy    ? new EditCopy    ()
            : (_cmd == Command::MoveAll ? new EditMoveAll () 
            : (_cmd == Command::Move    ? new EditMove    (): null)));   // ошибка "Типы операнда не совместимы с оператором."
По-моему, компилятор просто лажает на такой конструкции
__________________
Axapta v.3.0 sp5 kr2
Старый 22.10.2009, 12:17   #6  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Цитата:
Сообщение от AndyD Посмотреть сообщение
Попробуйте взять в скобки вложенные операторы.
X++:
return        _cmd == Command::CopyAll ? new EditCopyAll ()
            : (_cmd == Command::Copy    ? new EditCopy    ()
            : (_cmd == Command::MoveAll ? new EditMoveAll () 
            : (_cmd == Command::Move    ? new EditMove    (): null)));   // ошибка "Типы операнда не совместимы с оператором."
По-моему, компилятор просто лажает на такой конструкции
не помогло
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005

Последний раз редактировалось cerbo; 22.10.2009 в 12:19.
Старый 22.10.2009, 12:41   #7  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Вот так заработало:
X++:
return        _cmd == Command::CopyAll ? EditCopyAll::construct ()
            : _cmd == Command::Copy    ? EditCopy::construct    ()
            : _cmd == Command::MoveAll ? EditMoveAll::construct () 
            : _cmd == Command::Move    ? EditMove::construct    ()   
            : null;

Похоже действительно лажает компилятор, конструктор здесь имеет какое-то особое значение.
Все это ребята не весело
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
Старый 22.10.2009, 12:48   #8  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от cerbo Посмотреть сообщение
Все это ребята не весело
может стоило использовать стандартный в axapta подход, как было предложено выше? т.к. все что не вписывается в понятие "стандартный", другим людям будет сложнее поддерживать
Старый 22.10.2009, 13:17   #9  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от cerbo Посмотреть сообщение
Все это ребята не весело
Не хотел бы оказаться на месте компилятора...

http://www.delphikingdom.com/asp/vie...?catalogid=528
__________________
Best Regards,
Roman
Старый 22.10.2009, 13:42   #10  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Господа хорошие. Пост вообще-то был о проблемах компилятора, а не про стиль программирование. Я не хочу с вами спорить, но вы не правы.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
Старый 22.10.2009, 11:19   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
по проблеме.
Думаю должна помочь инкрементная компиляция класса родителя
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 22.10.2009, 15:47   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Альтернативное извращение
X++:
#localMacro.
    case Command::%1: return new Edit%1();
#endmacro
switch (_cmd)
{
     #(CopyAll)
     #(Copy)
     #(MoveAll)
     #(Move)
}
return null
ничего не повторяется, зато макросы
X++:
new SysDictClass(className2ID('Edit' + new DictEnum(enumNum(Command)).valueToSymbol(_cmd))).makeObject()
ничего не повторяется, нет макросов, зато компилятор не ругнется, если нет класса

НЕ ИСПОЛЬЗОВАТЬ В РАБОЧЕМ КОДЕ

Последний раз редактировалось belugin; 22.10.2009 в 15:54.
За это сообщение автора поблагодарили: miklenew (1).
Старый 22.10.2009, 17:22   #13  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
понимаете, правила придумываются не просто так. Правила - это стандартизация определенных действий, понятных всем людям.
Если говорите про нашу программу, то правила были придуманы, что бы любой программист мог поддерживать код в программе. Если каждый будет писать по своему принципу, то будет полный огород, и поддержка будет мукой. Мне тоже некоторые принципы не понятны в аксапте, а вначале их было ещё больше, однако все равно стараюсь следовать правилам.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: blokva (1).
Старый 22.10.2009, 17:24   #14  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Вам даже компилятор "сказал", что это неBestPractices, попробуйте его убедить в обратном
Старый 22.10.2009, 18:09   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Wamr Посмотреть сообщение
Вам даже компилятор "сказал", что это неBestPractices, попробуйте его убедить в обратном
Компилятор, скорее, сказал, что это не Common Practice
Старый 22.10.2009, 17:32   #16  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Знавал одного "архитектора", который как раз очень любил такие вещи и всегда надменно про себя говорил - этот не индусский код. По делам этот работничек сделал модуль, который состоял из четырех таблиц, которые содержали одинаковые по составу поля и при вставке данные прописывались по всем четырем таблицам. Красоты архтектуры не было, то есть вообще архитекруры не было. ИМХО надо делать все в меру.
Думаю что более "гикнуто" было вообще писать код в одну строчку
X++:
#localMacro. case Command::%1: return new Edit%1(); #endmacro switch (_cmd){ #(CopyAll) #(Copy) #(MoveAll) #(Move) } return null
Тогда точно враг не пройдет ну и свои тоже ))
__________________
Axapta book for developer
Старый 22.10.2009, 17:51   #17  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
- Вырезано Модератором: На личности не переходим -

Не. Никогда

Просто - мозг снесло у парня.

КМК

Последний раз редактировалось RVS; 22.10.2009 в 18:22.
Старый 22.10.2009, 18:16   #18  
cerbo is offline
cerbo
Участник
 
25 / 11 (1) +
Регистрация: 02.10.2008
Я так вижу, что либо вы не читали либо не поняли моих объяснений.

Попробую более подробно разъяснить.
Смысл, то в том, что когда от выражения требуется вернуть значение, то:
  1. понятно его назначение- что должно быть результатом отражено явно
  2. исходя из понимания что вернется можно предположить как там что реализованно не заглядывая внутрь
  3. некоторые программисты следят за тем чтобы такие выражения просто вычисляли значение, но не меняли бы состояние объектов
Все это в сумме дает более понимаемый код ("читается"- это я не совсем точно написал).

То есть:
X++:
switch(value)
{
   case cond1 : action1
   case cond2 : action2
   default    : default_action
}
здесь надо разобраться как работает каждый action, плохо то, что такой стиль требует модификацию объектов внутри action'ов.

X++:
result=   cond1 ? result1
        : cond2 ? result2
        : default_result;
здесь будет хоть чуть-чуть но проще потому, что одним измерением стало меньше- известен тип результата который вернется

То же и с функциями. Если функция void, то есть основания для беспокойства- внутри нее 100% изменяется состояние объектов, а иначе она не была бы void. Если не void то немного проще потому, что наперед известно чем все закончится.
__________________
Dynamics AX 4.0.2501.122 SP2, kernel 4.0.2163.0, MS SQL 2005
Старый 22.10.2009, 18:30   #19  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,319 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от cerbo Посмотреть сообщение
Все это в сумме дает более понимаемый код
Есть замечательное правило, очень хорошо применимое к системе, в которой УЖЕ есть код. Называется оно "Пусть безобразно, зато однообразно".

Т.е. никто не оценит усилия по улучшению читабельности отдельно взятого кода, если в остальных 255 местах он написан по-другому.

Микрософт делает шаги в этом направлении - и только они имеют право это делать как ее владельцы.

Если представить себе, что весь код будет переписан с нуля - то да, конечно можно пересмотреть все и вся.

А в АХ надо учитывать, что это не язык программирования в полном понимании и его компилятор не отлаживался полноценно (Вы уже успели с этим столкнуться). Поэтому написание кода "по аналогии" связано еще с заведомым обходом "косяков" компилятора.

Так что "массовость" существующего кода - сильно давит на всех остальных разработчиков - в т.ч. из МС (даже они оказались не готовы отказаться от X++ в пользу того же C#)
__________________
Возможно сделать все. Вопрос времени
Старый 22.10.2009, 18:34   #20  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от cerbo Посмотреть сообщение
Если не void то немного проще потому, что наперед известно чем все закончится.
Это соображения понятны, но
1. Так не делают, поэтому инструментарием данный путь не поддерживается
2. Так не делают, поэтому средний человек, читающий ваш код вместо знакомого паттерна будет долго тупить
3. нету case condition, есть case value - а вам приходится каждый раз повторять _cmd ==
4. Лучше безобразно, но единообразно (via подполковник Схаба)

=> На практике, лучше switch

Последний раз редактировалось belugin; 22.10.2009 в 18:36.
Теги
best practice, x++, антипаттерн, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
почему на работает common.(fieldId)[idx] maze DAX: Программирование 3 31.08.2007 06:48
Тернарный оператор в select novic DAX: Программирование 7 10.07.2007 19:13
JOIN программно на форме не работает rohlenko DAX: Программирование 2 31.03.2005 15:41
Не работает Debugger Antidot DAX: Программирование 0 20.12.2004 13:53
CRM ABC, SWOT анализ Как это работает и работает ли вообще. ShadowFromXZone DAX: Функционал 16 02.03.2004 18:09

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

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

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