|
28.05.2017, 15:20 | #1 |
Участник
|
AX2012. Цель атрибутов в расширении наследования классов
Здравствуйте.
У меня возникли чисто теоретические вопросы. 1. Какая цель создания экземпляров классов через расширенные атрибуты SysExtensionAppClassFactory::getClassFromSysAttribute( ? 2. Чем не устраивает старый дедовский способ construct ? 3. Как при создании экземпляра класса через расширенные атрибуты передать ему параметры в new? ПС. Я исхожу из принципа, что вызывающий класс и так ВСЕГДА должен знать какого наследника он создает. Зачем тогда городить огород и не вызывать просто создание нужного наследника? Типа свич лишний, давайте загрузим ядро, у него голова большая, пусть думает? Или у нас наследники классов растут как грибы, не успеваем исправлять конструктор, нужно через атрибуты это делать?... |
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (1). |
28.05.2017, 16:01 | #2 |
Banned
|
Как вариант такое обьяснение. Для как бы 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 я и не говорю, там чуть менее чем всё на атрибуты завязано. http://www.cyberforum.ru/csharp-begi...ad1776997.html |
|
28.05.2017, 18:43 | #3 |
Участник
|
В основном все это для того, чтобы при создании наследников не менять существующий код.
Цитата:
старый дедовский способ construct
Цитата:
передать ему параметры в new
Цитата:
вызывающий класс и так ВСЕГДА должен знать какого наследника он создает
|
|
28.05.2017, 22:14 | #4 |
Участник
|
Код в месте, откуда происходит вызов наследников все равно придется менять, так как туда нужно будет передать новый добавленный атрибут для вызова нового наследника.
Шило на мыло. Тут мы добавляем новый атрибут, тут мы добавляем новый пункт свича для создания нужного наследника. Правильное добавление наследника никак не может повлиять на существующий код. Цитата:
Совершенно не оправданное ограничение МС. Приведите хотя бы один довод, почему в конструктор не должны передаваться параметры? Цитата:
Я говорю именно о месте, где производится инициализация объекта нового класса. В этом месте и в этот момент должно быть однозначно известно, какой наследник будет создан. И что это будет определять - атрибут или свич - совершенно все равно. Вопрос - зачем атрибут, если можно через свич легко и просто? |
|
|
За это сообщение автора поблагодарили: mazzy (2), Ace of Database (2). |
28.05.2017, 22:20 | #5 |
Участник
|
Цитата:
Цитата:
Я не говорю о полиморфизме.
Я говорю именно о месте, где производится инициализация объекта нового класса. В этом месте и в этот момент должно быть однозначно известно, какой наследник будет создан. И что это будет определять - атрибут или свич - совершенно все равно. Вопрос - зачем атрибут, если можно через свич легко и просто? |
|
29.05.2017, 03:08 | #6 |
Участник
|
Мне думается вот хорошее видео которое объясняет в целом концепцию
Антон Кекс — Как нам спасти 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, 11:52 | #7 |
Участник
|
В теории, разумеется, этого нет. Но Axapta - это не "теория". Это "экземпляр" теории Конкретная реализация, которая, разумеется, вводит свои собственные ограничения
Цитата:
classfactory.createClass(classId); передача параметров здесь не предусмотрена "в принципе". Все "параметры" поднимаются из unpack уже "потом". После инициализации Разумеется, пакетные задания - отдельный разговор, но, вообще-то, в Axapta довольно много разных обслуживающих процедур, которые требуют создание экземпляра класса для выполнения какого-либо анализа по структуре класса. Если у Вас в метод new передается какой-либо параметр, то есть риск получить Exception в момент создания экземпляра. Как следствие, весь функционал перестает работать Собственно, сделайте поиск по перекрестным ссылкам, где используется хотя бы classfactory.createClass() не говоря уже о DictClass.makeObject(). Удивитесь как много подобных вызовов Поэтому, чтобы не получить проблему "на ровном месте" в среде Axapta следует жестко придерживаться правила Никаких параметров в методах new Да, в большинстве случаев, у Вас проблем не будет, если Вы передадите параметр в new. Но однажды, в самый неподходящий момент, все "вдруг" перестанет работать
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: mazzy (10). |
29.05.2017, 11:57 | #8 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Собственно, сделайте поиск по перекрестным ссылкам, где используется хотя бы classfactory.createClass() не говоря уже о DictClass.makeObject(). Удивитесь как много подобных вызовов
Поэтому, чтобы не получить проблему "на ровном месте" в среде Axapta следует жестко придерживаться правила Никаких параметров в методах new Да, в большинстве случаев, у Вас проблем не будет, если Вы передадите параметр в new. Но однажды, в самый неподходящий момент, все "вдруг" перестанет работать а давайте вернемся к исходному вопросу? Цитата:
Сообщение от ta_and
Здравствуйте.
У меня возникли чисто теоретические вопросы. 1. Какая цель создания экземпляров классов через расширенные атрибуты SysExtensionAppClassFactory::getClassFromSysAttribute( ? 2. Чем не устраивает старый дедовский способ construct ? 3. Как при создании экземпляра класса через расширенные атрибуты передать ему параметры в new? ПС. Я исхожу из принципа, что вызывающий класс и так ВСЕГДА должен знать какого наследника он создает. Зачем тогда городить огород и не вызывать просто создание нужного наследника? Типа свич лишний, давайте загрузим ядро, у него голова большая, пусть думает? Или у нас наследники классов растут как грибы, не успеваем исправлять конструктор, нужно через атрибуты это делать?... довести до ответов на исходные вопросы? |
|
01.06.2017, 14:22 | #9 |
Участник
|
И чтобы закрыть темы, прозвучавшие в этой ветке.
Цитата:
Сообщение от Владимир Максимов
передача параметров здесь не предусмотрена "в принципе". Все "параметры" поднимаются из unpack уже "потом". После инициализации
... Собственно, сделайте поиск по перекрестным ссылкам, где используется хотя бы classfactory.createClass() не говоря уже о DictClass.makeObject(). Удивитесь как много подобных вызовов Поэтому, чтобы не получить проблему "на ровном месте" в среде Axapta следует жестко придерживаться правила Никаких параметров в методах new Да, в большинстве случаев, у Вас проблем не будет, если Вы передадите параметр в new. Но однажды, в самый неподходящий момент, все "вдруг" перестанет работать И параметры в new вполне предусмотрены (я не знаю почему только 5 параметров), и сам фреймворк, заменяющий технологию конструкторов, использует конструкторы... Но пост мне очень понравился. Поскольку проблема действительно была. Не знаю осталась ли она сейчас. Надо полагать, исправили. https://www.facebook.com/photosm/pho...type=3&theater Последний раз редактировалось mazzy; 01.06.2017 в 14:43. |
|
01.06.2017, 15:08 | #10 |
Banned
|
Охренеть. Switch case 1, 2, 3, 4, 5. Наверное когда додумаются передавать массив параметров (array[]) тогда оформят это патентом.
|
|
03.06.2017, 21:11 | #11 |
Участник
|
Цитата:
Для начала, чтобы не тратить время, определимся что такое конструктор. На мой взгляд, конструктор это то, что создает класс. В Аксе это метод new. Принято создавать статический метод construct, но, несмотря на название это все-таки не конструктор в общем понимании, а метод фабрики. Пример проблемы параметров в new очень простой (речь про DAX2009, то есть пока про атрибуты даже не вспоминаем). Создаем наследника RunBaseBatch в котором в new указываем параметры. Если запускаем этот класс через назначенный mtnuitem, то проблем нет. А теперь, представляем ситуацию, когда наш класс администратор хочет включить в пакетное задание в рамках журнала. Он запускает "Основное \ Запросы \ Пакетное задание. Создает новое задание, переходит в "Просмотр задач", создает новую строку и пытается выбрать класс обработки. И получает ошибку, причем непонятную - я встречал и "тип операнда не соответствует оператору" и "типы несовместимы" и другие и без всякого указания на класс, вызвавший проблему. На самом деле, даже не нужно создавать свой класс, MS, о нас позаботился и создал два такие класса. Если у Вас есть DAX2009 с Российской локализацией, включающей зарплату, то механизм создания журнала пакетного задания уже сломан из-за использования параметров в new. Пример тут: Создание пакетного задания DAX 2009 Последний раз редактировалось Raven Melancholic; 03.06.2017 в 21:17. |
|
07.06.2017, 19:58 | #12 |
Участник
|
Цитата:
Я все время испытывал ужасный дискомфорт, когда нарушал это правило ВР. И мне было неудобно перед теми программистами, кто знает ВР и может меня упрекнуть в нарушении этого правила. И тут... тадам. SysOperationServiceController метод new !!! Улыбаемся и машем! Если кто-то скажет, что это неправильный класс и так нельзя делать, то даже не знаю что и подумать.... ----------------- На самом деле, я бы для ВСЕХ классов, по умолчанию!, сделал в методе нью необязательный? параметр с типом Args. В большинстве случаев как раз при инициализации класса НЕОБХОДИМЫ! параметры для исключения ошибок дальнейшей инициализации и работы класса. Я не могу себе даже представить такую ситуацию, в которой необходим чистый класс, который на входе не принимает никаких параметров вообще. Возможно, я ошибаюсь. Можете привести хоть один пример класса, в котором не нужны параметры?... --------- Может быть выделить это обсуждение в отдельную тему? А то офтопик получается... Последний раз редактировалось ta_and; 07.06.2017 в 20:10. |
|
|
За это сообщение автора поблагодарили: Михаил Андреев (5), Pustik (2). |
08.06.2017, 15:16 | #13 |
Участник
|
Цитата:
Цитата:
В большинстве случаев как раз при инициализации класса НЕОБХОДИМЫ! параметры для исключения ошибок дальнейшей инициализации и работы класса.
Circle::createByCenterAndRadius(p1, r1); Circle::createByTwoPonts(p1, p2) А не new Circle(null, 0, p1, p2) Цитата:
Я не могу себе даже представить такую ситуацию, в которой необходим чистый класс, который на входе не принимает никаких параметров вообще.
Возможно, я ошибаюсь. Можете привести хоть один пример класса, в котором не нужны параметры?... |
|
09.06.2017, 15:09 | #14 |
Участник
|
Потому что анитайп слишком расплывчато. Он не типизирован и не прозрачен. Неизвестно чего он него ждать.
Аргс используется как буфер обмена повсеместно, во всей системе, формы, main, джобы...Это де-факто - параметр по умолчанию. Почему бы его не использовать и для инициализации классов? |
|
09.06.2017, 15:25 | #15 |
Участник
|
Цитата:
Аргс используется не повсеместно а только в коде который вызывается непосредственно из UI. Он содержит UI специфичные параметры, а остальное фактически так же нетипизировано как AnyType |
|
29.05.2017, 05:02 | #16 |
Участник
|
Цитата:
Ключевой вопрос: а почему "не мержить свитч" лучше? Ведь use case все равно проверять, все равно придется копать все ветки кода, поскольку все равно останется угроза рефакторинга остальных веток кода. Все равно придется расширять test cases, все равно придется дописывать документацию, все равно придется обеспечивать совместимость. Атрибут и свитч - это настолько небольшая часть работы в общем проекте. Но технология атрибутов получилась настолько отличной от остальной работы. Так вот: а почему "не мержить свитч" лучше? Цитата:
Хоть и очень толковый. Но он судит людей по себе. На самом деле все проще. Как и остальные люди, специалисты в МС хотят сделать лучше, проще, быстрее. Просто "критерии лучшести" в МС сильно отличаются от остальных людей. Можно много говорить на тему "почему отличаются". Это отдельная тема. Но как бы то ни было, получаются решения типа советских панельных домов. Которые получались неудобными для жилья, очень затратными в части отопления, дорогими в части перевозки (панелевоз всегда ездил порожняком со стройки в сторону панельного завода). Но зато сроки строительства минимальны и стоимость производства панелей минимальна за счет массового производства, а удобство-отопление-перевозки не включались расчет при оптимизации. |
|
29.05.2017, 08:51 | #17 |
Участник
|
Цитата:
Сообщение от mazzy
Угу.
Ключевой вопрос: а почему "не мержить свитч" лучше? Ведь use case все равно проверять, все равно придется копать все ветки кода, поскольку все равно останется угроза рефакторинга остальных веток кода. Все равно придется расширять test cases, все равно придется дописывать документацию, все равно придется обеспечивать совместимость. |
|
29.05.2017, 08:58 | #18 |
Участник
|
)
Цитата:
экономия предназначена только для инженеров МС, проявляется только внутри МС и в только на environment МС, в ходе достижения целей, которые существуют только внутри МС. любое последствие (хорошее или плохое) для других пользователей (клиенты, партнеры) - это скорее всего побочный эффект. причем, скорее всего, незапланированный заранее побочный эффект. ) Последний раз редактировалось mazzy; 29.05.2017 в 09:07. |
|
|
За это сообщение автора поблагодарили: ta_and (3), apanko (3). |
29.05.2017, 09:31 | #19 |
Участник
|
|
|
29.05.2017, 11:00 | #20 |
Участник
|
Цитата:
В последующем времени, вероятно, все больше кода будет закрыто и опечатано сей корпорацией.
__________________
// no comments |
|
Теги |
sysextension framework, sysoperation framework, как правильно, полезное |
|
|