|
![]() |
#1 |
Участник
|
Цитата:
X++: [ExtensionOf(classStr(Class1))] final public class Class1_Extension { public void run() { try { if (true) { throw Exception::Error; } next run(); } catch (Exception::Error) { info('Done!'); } } } ![]() Я так и не понял из ответов выше, зачем все это если есть CoC или просто автор еще про нее не узнал? Последний раз редактировалось skuull; 04.10.2017 в 22:19. |
|
|
За это сообщение автора поблагодарили: kashperuk (5), EVGL (10), trud (6), Link (1). |
![]() |
#2 |
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. |
|
![]() |
#3 |
Участник
|
Это пример того что это технически возможно на PU10, используется или нет я хз, мало ли кулибинов на свете. Я бы лично не стал использовать ни то ни это по причинам вышеизложенным.
|
|
![]() |
#4 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ax_mct (2). |
![]() |
#5 |
Участник
|
Цитата:
"кривой говнокод" в данном случае он лишь с точки зрения бизнес-логики, в том плане, что я сам решил, что так можно. с точки зрения будущего апгрейда, (edited: нам всё равно, что там в методе поменяетсятак что в этом смысле это лучше, чем дуплицировать код исходного метода и пытаться его полностью исключить из исполнения. ) подумал: нет, не всё равно, могут быть проблемы. я не узнал, сорян. можешь дать толковую ссылку? спасибо
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 05.10.2017 в 20:56. Причина: логическая ошибка |
|
![]() |
#7 |
Участник
|
спасибо за ссылки
__________________
Felix nihil admirari |
|
![]() |
#8 |
Участник
|
Цитата:
Цитата:
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. |
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от skuull
![]() Идея то не нова
заодно узнал про статические переменные класса...
__________________
Felix nihil admirari |
|
![]() |
#10 |
Участник
|
Цитата:
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). |
![]() |
#11 |
Участник
|
Видимо правду говорят, что в Канаде сплошь лес да медведи
![]() 1.Оборачиваються protected методы. 2.Доступ к protected полям класса. 3.Ненадо мучать пре-пост аргументы. 4.Можно добавлять состояние (фишка не СоС но там может пригодиться) 5.Удобный синтаксис ![]() 6.Извращенцы могут скипнуть next. |
|
![]() |
#12 |
Участник
|
Цитата:
2. доступ к полям класса - есть примерчик? 6. скипнуть некст - и чо будет? по-моему, это самое интересное. технически такая обёртка делается наследником класса с перекрытием метода и вызовом его супера, или есть какой-то другой подход?
__________________
Felix nihil admirari |
|
![]() |
#13 |
Участник
|
Цитата:
Ну есть у вас класс X++: class BusinessLogic1 { protected int a; } X++: [ExtensionOf(ClassStr(BusinessLogic1))] final class BusinessLogic1_Extension { public int getA() { return a; } } |
|
![]() |
#14 |
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(); } } } Хороший рябчик, да ![]() |
|
Теги |
chain of command, extensions |
|
|