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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2017, 15:20   #1  
ta_and is offline
ta_and
Участник
 
183 / 106 (4) +++++
Регистрация: 26.02.2002
Адрес: СПб
AX2012. Цель атрибутов в расширении наследования классов
Здравствуйте.
У меня возникли чисто теоретические вопросы.
1. Какая цель создания экземпляров классов через расширенные атрибуты
SysExtensionAppClassFactory::getClassFromSysAttribute(
?
2. Чем не устраивает старый дедовский способ construct ?
3. Как при создании экземпляра класса через расширенные атрибуты передать ему параметры в new?

ПС. Я исхожу из принципа, что вызывающий класс и так ВСЕГДА должен знать какого наследника он создает. Зачем тогда городить огород и не вызывать просто создание нужного наследника? Типа свич лишний, давайте загрузим ядро, у него голова большая, пусть думает? Или у нас наследники классов растут как грибы, не успеваем исправлять конструктор, нужно через атрибуты это делать?...
За это сообщение автора поблагодарили: mazzy (2).
Старый 28.05.2017, 16:01   #2  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,683 / 531 (21) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Как вариант такое обьяснение. Для как бы mapping через metadata, то есть для связки но не трогая код.
Но я конечно не уверен, это так - для темы.
Цитата:
есть у вас класс Point с полями X и Y
class Point
{
public int X {get; set;}
public int Y {get; set;}
}
Вы хотите его сериализовать в JSON. Окей, не вопрос, даже ничего не понадобится. Однако теперь есть проблема, точки нужно отдать в стороннюю библиотеку, где они должны назваться PTXCOORD и PTYCOORD. Естественно, свой код вы захламлять не хотите, у точки есть координаты X и Y, не нужно все эти дебильные прфиксы и суффиксы писать (однако эта библиотека принимает данные только в таком формате. И вот, здравствуйте, атрибуты:

[DataContract]
class Point
{
[DataMember(Name = "PTXCOORD ")]
public int X {get; set;}
[DataMember(Name = "PTYCOORD ")]
public int Y {get; set;}
}
Всё. Ваш код будет работать с нормальными именами, библиотека получит данные в нужном формате, все довольны.

Про WCF я и не говорю, там чуть менее чем всё на атрибуты завязано.
Что такое атрибуты и зачем они? Для чего нужны директивы препроцессора? - C#
http://www.cyberforum.ru/csharp-begi...ad1776997.html
Старый 28.05.2017, 18:43   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
1,680 / 841 (32) +++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
В основном все это для того, чтобы при создании наследников не менять существующий код.
Цитата:
старый дедовский способ construct
Да, способ старый, да он понятен большинству разработчиков. Но этот способ требует изменения уже существующего отлаженного кода для добавления наследника.
Цитата:
передать ему параметры в new
new с параметрами в описании BP не рекомендуется уже с DAX4, то есть более 10 лет. Кстати и construct с параметрами не рекомендуется к применению с тех же пор.
Цитата:
вызывающий класс и так ВСЕГДА должен знать какого наследника он создает
Достаточно спорное утверждение. Тот же принцип Барбары незабвенной Лисков говорит как раз об обратном - код, использующий какие-то классы из иерархии не должен делать предположение о том, какой именно наследник используется, а наследники класса должны сохранять поведение базового класса.
Старый 28.05.2017, 22:14   #4  
ta_and is offline
ta_and
Участник
 
183 / 106 (4) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
при создании наследников не менять существующий код
Код в месте, откуда происходит вызов наследников все равно придется менять, так как туда нужно будет передать новый добавленный атрибут для вызова нового наследника.
Шило на мыло. Тут мы добавляем новый атрибут, тут мы добавляем новый пункт свича для создания нужного наследника.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
уже существующего отлаженного кода
Правильное добавление наследника никак не может повлиять на существующий код.

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
new с параметрами в описании BP не рекомендуется уже с DAX4, то есть более 10 лет. Кстати и construct с параметрами не рекомендуется к применению с тех же пор.
Где в теории ООП написано, что конструктор должен быть без параметров?!
Совершенно не оправданное ограничение МС.
Приведите хотя бы один довод, почему в конструктор не должны передаваться параметры?

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
..код, использующий какие-то классы из иерархии не должен делать предположение..
Я не говорю о полиморфизме.
Я говорю именно о месте, где производится инициализация объекта нового класса.
В этом месте и в этот момент должно быть однозначно известно, какой наследник будет создан. И что это будет определять - атрибут или свич - совершенно все равно. Вопрос - зачем атрибут, если можно через свич легко и просто?
За это сообщение автора поблагодарили: mazzy (2), Ace of Database (2).
Старый 28.05.2017, 22:20   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,989 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от ta_and Посмотреть сообщение
Код в месте, откуда происходит вызов наследников все равно придется менять, так как туда нужно будет передать новый добавленный атрибут для вызова нового наследника.
Нет, не надо будет - надо будет добавить новое значение атрибута и не туда где он вызывается. А, навпример, в BaseEnum.

Цитата:
Я не говорю о полиморфизме.
Я говорю именно о месте, где производится инициализация объекта нового класса.
В этом месте и в этот момент должно быть однозначно известно, какой наследник будет создан. И что это будет определять - атрибут или свич - совершенно все равно. Вопрос - зачем атрибут, если можно через свич легко и просто?
Чтобы при мердже кода не мержить свитч.
Старый 29.05.2017, 03:08   #6  
online
trud
Участник
 
454 / 324 (11) ++++++
Регистрация: 07.06.2003
Цитата:
Сообщение от ta_and Посмотреть сообщение
Вопрос - зачем атрибут, если можно через свич легко и просто?
Мне думается вот хорошее видео которое объясняет в целом концепцию
Антон Кекс — Как нам спасти Java
https://www.youtube.com/watch?v=TSAlj04_tkA
Вкратце - представьте что вас взяли архитектором в Микрософт. если вы предложите писать все через switch, то собственно возникнет вопрос нафиг вы тогда вообще нужны, switch и так все знают. Поэтому собственно идет расширение концепций(при чем принцип чем запутаннее, тем лучше).
Вот кстати товарищ Мартин предлагает вообще использовать библиотеку Автофак для подобных вещей
goshoom: IoC containers for extensibility
если он сумеет продвинуть это, то в следующей версии будем разбираться уже с этим
Кстати один из примеров который приводит Антон - это то что на каком то проекте куда они пришли довнедрять было вообще запрещено писать бизнес логику на Джава, все должно быть на SQL. когда начали разбираться откуда пошло это безумное требование, оказалось что если разрешить писать на Джава вещи типа сделать проводку, то получаются конструкции "когда класс создает другой класс чтобы через интерфейс вызвать третий" и т.п. и через некоторое время понять что происходит становится невозможно. SQL этого не позволяется, там собственно всегда можно увидеть что происходит с данными
это кстати вспоминается когда приходится отлаживать что-то из Source Framework в Ах.
За это сообщение автора поблагодарили: Ace of Database (2).
Старый 29.05.2017, 05:02   #7  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от ta_and Посмотреть сообщение
Шило на мыло. Тут мы добавляем новый атрибут, тут мы добавляем новый пункт свича для создания нужного наследника.
Угу.

Цитата:
Сообщение от belugin Посмотреть сообщение
Чтобы при мердже кода не мержить свитч.
Ключевой вопрос: а почему "не мержить свитч" лучше?

Ведь use case все равно проверять, все равно придется копать все ветки кода, поскольку все равно останется угроза рефакторинга остальных веток кода. Все равно придется расширять test cases, все равно придется дописывать документацию, все равно придется обеспечивать совместимость.

Атрибут и свитч - это настолько небольшая часть работы в общем проекте. Но технология атрибутов получилась настолько отличной от остальной работы.

Так вот: а почему "не мержить свитч" лучше?

Цитата:
Сообщение от trud Посмотреть сообщение
Антон Кекс ... то собственно возникнет вопрос нафиг вы тогда вообще нужны, switch и так все знают.
Кекс экстремист своего рода )
Хоть и очень толковый. Но он судит людей по себе.

На самом деле все проще.
Как и остальные люди, специалисты в МС хотят сделать лучше, проще, быстрее. Просто "критерии лучшести" в МС сильно отличаются от остальных людей.

Можно много говорить на тему "почему отличаются". Это отдельная тема.

Но как бы то ни было, получаются решения типа советских панельных домов.
Которые получались неудобными для жилья, очень затратными в части отопления, дорогими в части перевозки (панелевоз всегда ездил порожняком со стройки в сторону панельного завода). Но зато сроки строительства минимальны и стоимость производства панелей минимальна за счет массового производства, а удобство-отопление-перевозки не включались расчет при оптимизации.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 29.05.2017, 07:45   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,098 / 1518 (57) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
mfp: SysExtension Framework – to the rescue

Последний раз редактировалось S.Kuskov; 29.05.2017 в 07:54.
Старый 29.05.2017, 08:51   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
3,989 / 2133 (79) +++++++++
Регистрация: 16.01.2004
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
Угу.
Ключевой вопрос: а почему "не мержить свитч" лучше?

Ведь use case все равно проверять, все равно придется копать все ветки кода, поскольку все равно останется угроза рефакторинга остальных веток кода. Все равно придется расширять test cases,
все равно придется дописывать документацию, все равно придется обеспечивать совместимость.
См. дальше дискуссия extensions vs overlayering. Скажу только, что можно скономить на легко автоматизируемых вещах время для трудноавтоматизируемых вещей.
Старый 29.05.2017, 08:58   #11  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от belugin Посмотреть сообщение
См. дальше дискуссия extensions vs overlayering.
)

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

экономия предназначена только для инженеров МС, проявляется только внутри МС и в только на environment МС, в ходе достижения целей, которые существуют только внутри МС.

любое последствие (хорошее или плохое) для других пользователей (клиенты, партнеры) - это скорее всего побочный эффект. причем, скорее всего, незапланированный заранее побочный эффект.
)
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 29.05.2017 в 09:07.
За это сообщение автора поблагодарили: ta_and (3), apanko (3).
Старый 29.05.2017, 09:31   #12  
ta_and is offline
ta_and
Участник
 
183 / 106 (4) +++++
Регистрация: 26.02.2002
Адрес: СПб
Цитата:
Сообщение от mazzy Посмотреть сообщение
экономия предназначена только для инженеров МС, проявляется только внутри МС и в только на environment МС, в ходе достижения целей, которые существуют только внутри МС.
ВОТ! Точно и ясно высказанная цель, которую я не мог сформулировать.
Других целей я не вижу.
Старый 29.05.2017, 11:00   #13  
dech is offline
dech
Участник
Аватар для dech
 
438 / 189 (7) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Цитата:
Сообщение от ta_and Посмотреть сообщение
ВОТ! Точно и ясно высказанная цель, которую я не мог сформулировать.
Других целей я не вижу.
Цель МС давно известна - сделать разделение кода, так чтобы разработчики клиентов не лезли в её код.
В последующем времени, вероятно, все больше кода будет закрыто и опечатано сей корпорацией.
__________________
// no comments
Старый 29.05.2017, 11:06   #14  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от dech Посмотреть сообщение
Цель МС давно известна - сделать разделение кода
Цель МС давно известна - заработать.

"Сделать разделение кода" не является (и не может являться) целью корпорации МС )))
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 29.05.2017, 11:17   #15  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Давайте отвечу публично:
Нет, это не придирки к русскому языку и правописанию.

Допустим, что в утверждении подразумевался не МС, а некие мифические "разработчики МС".
Тогда получается утверждение "Цель разработчиков МС давно известна - сделать разделение кода".
Но при этом утверждение, что "цель корпорации МС - заработать" остается верным.

Отсюда тривиальный вопрос - а как выполнение цели этих мифических разработчиков МС позволит выполнить цель корпорации МС? каков механизм?

На самом деле вопросов встает очень много.
Это если нормально сформулировать мысль, не делая никаких неоправданных логических допущений.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 29.05.2017, 11:35   #16  
sukhanchik is offline
sukhanchik
Moderator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,475 / 1573 (57) ++++++++
Регистрация: 13.06.2004
Адрес: Москва
Все просто. Прибыль, как известно - это доходы минус расходы. Для увеличения прибыли надо увеличивать доходы и уменьшать расходы. Уменьшение трудозатрат МСа при выпуске новых версий даст возможность уменьшить расходы. Вполне вероятно, что существенное уменьшение расходов МСа повлечет за собой несущественное уменьшение стоимости лицензий (=доходов). Т.е. даст возможность существенно увеличить прибыль .
Так что если какая-то технология нужна исключительно МСу и позволяет ему снизить свои издержки - то эта технология будет, даже если она не нужна ни партнерам ни клиентам.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: mazzy (2).
Старый 29.05.2017, 11:45   #17  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Логично, чё!
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Уменьшение трудозатрат МСа при выпуске новых версий даст возможность уменьшить расходы.
Предположим )))

Прямой вопрос к твоему тексту:
А как "уменьшение трудозатрат МСа" повлияет на число купленных лицензий (доход)? Увеличит? Сохранит на прежнем уровне? Уменьшит? Почему?

Косвенный вопрос:
dech сказал "сделать разделение кода"
ты говоришь "Уменьшение трудозатрат ..., технология ... позволяет ему снизить свои издержки"
а "разделение кода" точно позволит МСу "снизить свои издержки"? каков механизм?

))))

В общем, ребяты, давайте тщательнее. Пожалуйста.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 29.05.2017 в 11:51.
Старый 29.05.2017, 11:52   #18  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,339 / 828 (30) +++++++
Регистрация: 13.01.2004
Цитата:
Сообщение от ta_and Посмотреть сообщение
Где в теории ООП написано, что конструктор должен быть без параметров?!
В теории, разумеется, этого нет. Но Axapta - это не "теория". Это "экземпляр" теории Конкретная реализация, которая, разумеется, вводит свои собственные ограничения

Цитата:
Сообщение от ta_and Посмотреть сообщение
Совершенно не оправданное ограничение МС.
Приведите хотя бы один довод, почему в конструктор не должны передаваться параметры?
Оправдано, оправдано. Но! Не "вообще", а в конкретной реализации ООП в системе Axapta. Самый простой пример - пакетные задания (Batch) начинаются с того, что создают экземпляр класса через

classfactory.createClass(classId);

передача параметров здесь не предусмотрена "в принципе". Все "параметры" поднимаются из unpack уже "потом". После инициализации

Разумеется, пакетные задания - отдельный разговор, но, вообще-то, в Axapta довольно много разных обслуживающих процедур, которые требуют создание экземпляра класса для выполнения какого-либо анализа по структуре класса. Если у Вас в метод new передается какой-либо параметр, то есть риск получить Exception в момент создания экземпляра. Как следствие, весь функционал перестает работать

Собственно, сделайте поиск по перекрестным ссылкам, где используется хотя бы classfactory.createClass() не говоря уже о DictClass.makeObject(). Удивитесь как много подобных вызовов

Поэтому, чтобы не получить проблему "на ровном месте" в среде Axapta следует жестко придерживаться правила

Никаких параметров в методах new

Да, в большинстве случаев, у Вас проблем не будет, если Вы передадите параметр в new. Но однажды, в самый неподходящий момент, все "вдруг" перестанет работать
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (10).
Старый 29.05.2017, 11:57   #19  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Собственно, сделайте поиск по перекрестным ссылкам, где используется хотя бы classfactory.createClass() не говоря уже о DictClass.makeObject(). Удивитесь как много подобных вызовов

Поэтому, чтобы не получить проблему "на ровном месте" в среде Axapta следует жестко придерживаться правила

Никаких параметров в методах new

Да, в большинстве случаев, у Вас проблем не будет, если Вы передадите параметр в new. Но однажды, в самый неподходящий момент, все "вдруг" перестанет работать
Ураа!!! ответ по существу!!!!

а давайте вернемся к исходному вопросу?

Цитата:
Сообщение от ta_and Посмотреть сообщение
Здравствуйте.
У меня возникли чисто теоретические вопросы.
1. Какая цель создания экземпляров классов через расширенные атрибуты
SysExtensionAppClassFactory::getClassFromSysAttribute(
?
2. Чем не устраивает старый дедовский способ construct ?
3. Как при создании экземпляра класса через расширенные атрибуты передать ему параметры в new?

ПС. Я исхожу из принципа, что вызывающий класс и так ВСЕГДА должен знать какого наследника он создает. Зачем тогда городить огород и не вызывать просто создание нужного наследника? Типа свич лишний, давайте загрузим ядро, у него голова большая, пусть думает? Или у нас наследники классов растут как грибы, не успеваем исправлять конструктор, нужно через атрибуты это делать?...
Как утверждение "Никаких параметров в методах new"
довести до ответов на исходные вопросы?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 29.05.2017, 12:01   #20  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,592 / 3395 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
да, рекомендация "Никаких параметров в методах new" хороша с точки зрения партнера и клиента. но рискну задать вопрос с позиции вендора.

да, classfactory.createClass() и DictClass.makeObject() используется дофига где.
существуют ли на ваш взгляд более оптимальные (для всех причастных к аксапте) решения нежели "Никаких параметров в методах new"?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Теги
sysextension framework, sysoperation framework, как правильно, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
stephenmann: Technical History of Dynamics AX - From Axapta 3.0 to AX2012 Blog bot DAX Blogs 5 03.03.2017 10:22
dynamicsax-fico: Invoice search AX2012 vs. AX7 (Part 2) Blog bot DAX Blogs 0 01.04.2016 10:11
DAX2009 аналог friend классов. Как сделать? Raven Melancholic DAX: Программирование 9 07.11.2015 23:50
emeadaxsupport: Inventory closing differences between AX4.0 and AX2012 using weighted average costing method Blog bot DAX Blogs 0 27.12.2012 19:11
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:54.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.