04.10.2017, 23:04 | #41 |
Banned
|
Цитата:
Как понимаю в CoC нельзя не вызывать next. И соответственно мы не можем вырезать или заменить то что нам не нужно. Только в очередной раз облизать. И автор темы решит свою проблему точно так же опасно с CoC как и Pre/Post, только вместо двух методов будет один. Сам же по себе такой способ как паттерн решения не должен быть промышленным. Рабочий но потенциально опасный workaround. После которого инженер должен пойти и хорошо напиться. Возможно именно обязательность вызова next изменят в PU 11. О чем то же Kashperuk намекает. P.S. вьехал в код - мы обходим вызов NEXT прыгая исключением. Неплохо. Это реально используется? А можно создать свой собственный тип исключения, Exception::TODO? А что мне нравится, я правда столько не выпью, но в аду как в аду Но наш кокретный гений Michael Fruergaard Pontoppidan по ходу математик, а не кибернетик. Заменять метод - это фу, потому что тогда кто-то покажется нелепым. Цитата:
Overlayering gives you the ability to replace any method. You take a copy of the original method and can edit it as you please. There is some tooling on top that gives a better experience, but at the end of the day customizations done this way are intrusive, and cannot be upgraded automatically. (For example, when the original code is changed, those changes must be merged in.)
If CoC allowed skipping the execution of standard code, you could take a copy of the standard code, edit it in any way you want, place it in a wrapper method and voila – you had overlayering in disguise. If we allowed this, we would be back to square one. CoC would have the exact same replacing semantics and problems as overlayering – just without the tooling. Последний раз редактировалось ax_mct; 04.10.2017 в 23:12. |
|
04.10.2017, 23:16 | #42 |
Участник
|
Это пример того что это технически возможно на PU10, используется или нет я хз, мало ли кулибинов на свете. Я бы лично не стал использовать ни то ни это по причинам вышеизложенным.
|
|
05.10.2017, 00:42 | #43 |
Banned
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: Link (1), ax_mct (10), gl00mie (2). |
05.10.2017, 03:55 | #44 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ax_mct (2). |
05.10.2017, 08:55 | #45 |
Участник
|
*Теоретически* (то есть отвлекааясь от Аксапты данной нам в ощущениях) при создании расширения надо руководствоваться публичным контрактом метода включая побочные эффекты а не его исходным кодом (реализацией).
Контракт может быть описан как неформально (в XML документации) так и формально (например, набором тестов, Code Contracts). Цитата:
Ничего страшного в подмене нет. Это даст больше управляемости и надежности. А проверять конфликты можно и компилятором.
Цитата:
Ничего страшного в подмене нет. Это даст больше управляемости и надежности. А проверять конфликты можно и компилятором.
Последний раз редактировалось belugin; 05.10.2017 в 09:15. |
|
|
За это сообщение автора поблагодарили: Vadik (1), mazzy (2). |
05.10.2017, 09:13 | #46 |
Участник
|
Цитата:
Сообщение от EVGL
Это все только слова и теоретические рассуждения. На практике все происходит с точностью до наоборот, и я могу это доказать на цифрах. При переходе с 7.1 на 7.2 наше приложение согласно отчету анализа обновления было затронуто 119 (прописью: сто девятнадцать) уничтоженными полями или таблицами, и это только data dictionary.
Практически сильно следят за обратной совместимостью при разработке хотфиксов и CU - то есть про обновления в рамках одной версии. При разработке следующей версии есть предупреждения которые можно игнорировать. Мне самому интересно, как можно совместить подход в котором:
Теоретически надо отделять те куски которые вендор может изменить, от тех которые он будет поддерживать и следить за этим. Для разделения у нас есть public protected private и internal (причем последнее заработало на всех уровнях только в последних PU). |
|
|
За это сообщение автора поблагодарили: Link (1). |
05.10.2017, 20:34 | #47 |
Участник
|
то есть мне после его инсталляции нужно будет все доработки переписывать?
__________________
Felix nihil admirari |
|
05.10.2017, 20:42 | #48 |
Участник
|
вот это прямо золотые слова! это ж похоже на одного из трёх китов ООП!
__________________
Felix nihil admirari |
|
05.10.2017, 20:47 | #49 |
Участник
|
Цитата:
"кривой говнокод" в данном случае он лишь с точки зрения бизнес-логики, в том плане, что я сам решил, что так можно. с точки зрения будущего апгрейда, (edited: нам всё равно, что там в методе поменяетсятак что в этом смысле это лучше, чем дуплицировать код исходного метода и пытаться его полностью исключить из исполнения. ) подумал: нет, не всё равно, могут быть проблемы. я не узнал, сорян. можешь дать толковую ссылку? спасибо
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 05.10.2017 в 20:56. Причина: логическая ошибка |
|
05.10.2017, 22:08 | #51 |
Участник
|
Цитата:
Цитата:
Will the approach work? Probably: The arguments are collected in an X++ struct (i.e. name / value pairs). Will we guarantee that it will work forever? No.
Идея то не нова и была полезна до CoC, а щас никчему. Помимо видео от Вани\mfp, https://docs.microsoft.com/en-us/dyn...d-wrapping-coc Последний раз редактировалось skuull; 05.10.2017 в 23:22. |
|
05.10.2017, 23:13 | #52 |
Banned
|
Цитата:
Чтение из файла например. А вот создание строки заказа уже по сути интерфейс к процессу. А там где процесс без исходного кода никак. Ничем. Да, хуже. От того что пытаются уйти от ошибок компиляции сам по себе оверлееринг никуда не исчезает. Его просто не видно. А со старым оверлеерингом - было видно. Ведь какая цель у нас программистов в большинстве случаев? Именно что логический оверлей какого-то процесса, просто потому что это в сути стоящих перед нами задач. Мало того что процессную систему прибили ООП так теперь еще и запретили менять процессы. Без возможности оверлееринга/подмены мы не можем вносить изменения в процесс, мы можем только подключать свои собственные независимые процессы. Это может быть нормально само по себе, но это совершенно недостаточно для (1 закона Кибернетики) тех требований которые предьявляет наш типичный клиент. Ладно бы не дурили голову себе и другим и закрыли систему намертво, это было бы и честно и логично. Но продолжать пропагандировать систему как платформу для разработки - это разрывает мозг. Вот EVGL хорошо иллюстрирует. Цитата:
Это все только слова и теоретические рассуждения. На практике все происходит с точностью до наоборот, и я могу это доказать на цифрах. При переходе с 7.1 на 7.2 наше приложение согласно отчету анализа обновления было затронуто 119 (прописью: сто девятнадцать) уничтоженными полями или таблицами, и это только data dictionary. Весь код, который это использовал - расширения, перекрытия, классы с бизнес-логикой - может идти лесом. Т.е. мастера по redesign / reengineering в Microsoft плевали на доработки и партнерские решения. Они ломали и будут ломать, с корнем удалять, менять внутреннюю логику. При этом самое худшее, что может случиться, это формально компилируемый код расширений, который просто перестал вызываться или работать из-за изменения порядка исполнения объектов.
Последний раз редактировалось ax_mct; 05.10.2017 в 23:17. |
|
|
За это сообщение автора поблагодарили: Link (1). |
06.10.2017, 01:06 | #53 |
Участник
|
спасибо за ссылки
__________________
Felix nihil admirari |
|
06.10.2017, 01:12 | #54 |
Участник
|
Цитата:
Сообщение от skuull
Идея то не нова
заодно узнал про статические переменные класса...
__________________
Felix nihil admirari |
|
06.10.2017, 01:34 | #55 |
Участник
|
Цитата:
When the call to the next DoSomething method occurs, the system randomly picks another method in the CoC
я вот набросал рапчик: X++: [Wrappable(true)] [HookableAttribute(false)] str Yahooyeyou() { return "For the features that are described in this topic, the Microsoft Visual Studio X++ editor doesn't yet offer complete support for cross-references and Microsoft IntelliSense." }
__________________
Felix nihil admirari |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
06.10.2017, 04:10 | #56 |
Участник
|
Видимо правду говорят, что в Канаде сплошь лес да медведи
1.Оборачиваються protected методы. 2.Доступ к protected полям класса. 3.Ненадо мучать пре-пост аргументы. 4.Можно добавлять состояние (фишка не СоС но там может пригодиться) 5.Удобный синтаксис 6.Извращенцы могут скипнуть next. |
|
06.10.2017, 04:26 | #57 |
Banned
|
Способом доступа к переменным. Так мы берем и хакаем через Args, а так мы имеем право сделать обертку и использовать члены напрямую.
Но все равно данный паттерн "обход базового метода с временным присвоением внутреннего условия" он заслуживает патента. У меня сейчас на четвертые сутки запуска на клиенте AX2012 самоудалилось немало заказов на живом приложении. Вылечилось одной строчкой кода для обхода стандартного удаления заголовка интер. закупки при удалении оригинального заказа. Как с таким справится ь в AX7 мне даже страшно ум приложить. По данному паттерну мне в СоС надо X++: RecId recId = _salesTable.RecId;
_salesTable.RecId = 0
next purchTableDelete(_salesTable)
_salesTable.RecId = recId; А overlayering это слишком тупо, да. X++: void purchTableDelete(SalesTable _salesTable) { InterCompanyPurchSalesReference interCompanyPurchSalesReference; PurchTable purchTable; if(!_salesTable) { return; } if (_salesTable.SkipUpdate == InterCompanySkipUpdate::Internal || _salesTable.SkipUpdate == InterCompanySkipUpdate::Both || !this.canCreatePurchOrder()) { return; } while select PurchId from interCompanyPurchSalesReference index hint SalesPurchIdx where interCompanyPurchSalesReference.SalesId == _salesTable.SalesId { select forupdate purchTable index hint PurchIdx where purchTable.PurchId == interCompanyPurchSalesReference.PurchId && purchTable.InterCompanyOrder; if (purchTable.isInterCompanyOrder() && purchTable.SalesOSInterOrigin != SalesOSInterOrigin::Sourcing) // добавлено { purchTable.SkipUpdate = InterCompanySkipUpdate::Internal; purchTable.delete(); } } } Хороший рябчик, да |
|
06.10.2017, 08:36 | #58 |
Участник
|
Цитата:
Цитата:
А вот создание строки заказа уже по сути интерфейс к процессу. А там где процесс без исходного кода никак.
Цитата:
Ничем. Да, хуже. От того что пытаются уйти от ошибок компиляции сам по себе оверлееринг никуда не исчезает. Его просто не видно. А со старым оверлеерингом - было видно.
Цитата:
Ведь какая цель у нас программистов в большинстве случаев? Именно что логический оверлей какого-то процесса, просто потому что это в сути стоящих перед нами задач.
Цитата:
Без возможности оверлееринга/подмены мы не можем вносить изменения в процесс, мы можем только подключать свои собственные независимые процессы.
Цитата:
Вот EVGL хорошо иллюстрирует.
|
|
06.10.2017, 09:50 | #59 |
NavAx
|
Я бы хотел поднять вопрос об использовании args.getArg(identifierStr(SomeIdentifier)) в пре/пост-хендлерах.
X++: [PreHandlerFor(tableStr(InventTrans), tableMethodStr(InventTrans, checkUpdateSplit))] public static void InventTrans_Pre_checkUpdateSplit(XppPrePostArgs args) { Qty splitQty = args.getArg(identifierStr(_splitQty)); if (splitQty > 10) { do something .... } ..... } DAX не выдаст ошибку, компилятор не предупредит, все будет красиво со стороны разработчика. Это потенциальная дыра. |
|
06.10.2017, 15:08 | #60 |
Banned
|
Цитата:
Но адаптирование той же AX под бизнес-процессы клиента это не реализация интерфейсных задач, а именно что изменение самих процессов. Разработка с типом "Изменение процесса". Насчет что "иногда", сложно сказать. Понятно что иногда изменений "Интерфейс" это может быть 70% задач и 30% на "Изменение процесса", но не в процентах дело, а в важности их для клиента. Цитата:
Как результат ничего кроме помех разделение на открытые-закрытые куски не принесет. Цитата:
Сообщение от raz
Я бы хотел поднять вопрос об использовании args.getArg(identifierStr(SomeIdentifier)) в пре/пост-хендлерах.
... Если имя параметра поменяется, то ошибку может обнаружить только пользователь, т.к. что будет не так считаться/работать. DAX не выдаст ошибку, компилятор не предупредит, все будет красиво со стороны разработчика. Это потенциальная дыра. |
|
Теги |
chain of command, extensions |
|
|