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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.10.2017, 22:04   #1  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от ax_mct Посмотреть сообщение

А есть какой-то способ избежать вызова "standard method()" или подменить его?
Есть :
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!');
        }
    }
}
Такое же эксплуатирование деталей (кривых) реализации как и в этом блоге. В любой момент починят (или поменяют реализацию XppPrePostArgs) и все развалиться к чертям, но кого это останавливает ?

Я так и не понял из ответов выше, зачем все это если есть CoC или просто автор еще про нее не узнал?

Последний раз редактировалось skuull; 04.10.2017 в 22:19.
За это сообщение автора поблагодарили: kashperuk (5), EVGL (10), trud (6), Link (1).
Старый 04.10.2017, 23:04   #2  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от skuull Посмотреть сообщение
Я так и не понял из ответов выше, зачем все это если есть CoC или просто автор еще про нее не узнал?
CoC - Clash of Clans?

Как понимаю в 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.
https://blogs.msdn.microsoft.com/mfp...in-of-command/

Последний раз редактировалось ax_mct; 04.10.2017 в 23:12.
Старый 04.10.2017, 23:16   #3  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от ax_mct Посмотреть сообщение
P.S. вьехал в код - мы обходим вызов NEXT прыгая исключением. Неплохо. Это реально используется?
Это пример того что это технически возможно на PU10, используется или нет я хз, мало ли кулибинов на свете. Я бы лично не стал использовать ни то ни это по причинам вышеизложенным.
Старый 05.10.2017, 03:55   #4  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от ax_mct Посмотреть сообщение
А можно создать свой собственный тип исключения, Exception::TODO? А что мне нравится, я правда столько не выпью, но в аду как в аду
Вы можете ловить c sharp исключения в 7ке, значит должны мочь их кидать, создайте свой тип и попробуйте
За это сообщение автора поблагодарили: ax_mct (2).
Старый 05.10.2017, 20:47   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от skuull Посмотреть сообщение
В любой момент починят (или поменяют реализацию XppPrePostArgs) и все развалиться к чертям, но кого это останавливает ?
что значит "поменяют"? уберут метод добавления нового параметра? уберут метод доступа к объекту? как оно будет компилироваться в таком случае? это же не какие-то там недокументированные возможности, а как раз для того и предназначенные.

"кривой говнокод" в данном случае он лишь с точки зрения бизнес-логики, в том плане, что я сам решил, что так можно. с точки зрения будущего апгрейда, (edited: нам всё равно, что там в методе поменяетсятак что в этом смысле это лучше, чем дуплицировать код исходного метода и пытаться его полностью исключить из исполнения. ) подумал: нет, не всё равно, могут быть проблемы.

Цитата:
Сообщение от skuull Посмотреть сообщение
Я так и не понял из ответов выше, зачем все это если есть CoC или просто автор еще про нее не узнал?
я не узнал, сорян. можешь дать толковую ссылку? спасибо
__________________
Felix nihil admirari

Последний раз редактировалось wojzeh; 05.10.2017 в 20:56. Причина: логическая ошибка
Старый 05.10.2017, 21:00   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от wojzeh Посмотреть сообщение
я не узнал, сорян. можешь дать толковую ссылку? спасибо
https://blogs.msdn.microsoft.com/mfp...in-of-command/
Старый 06.10.2017, 01:06   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
спасибо за ссылки
__________________
Felix nihil admirari
Старый 05.10.2017, 22:08   #8  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от wojzeh Посмотреть сообщение
что значит "поменяют"? уберут метод добавления нового параметра? уберут метод доступа к объекту? как оно будет компилироваться в таком случае? это же не какие-то там недокументированные возможности, а как раз для того и предназначенные.
Ну такие ребята как Peter Villadsen конкретно про этот злобный хак говорят:
Цитата:
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.
Там как раз в соседней ветки возмущаются по поводу удаленных полей между релизами, так что могут поломать запросто, как поломали pack\unpack в PU10, а казалось бы фундаментальная фича. Edited: вот уже и в эту ветку притащили

Идея то не нова и была полезна до CoC, а щас никчему.

Цитата:
Сообщение от wojzeh Посмотреть сообщение
я не узнал, сорян. можешь дать толковую ссылку? спасибо
Помимо видео от Вани\mfp, https://docs.microsoft.com/en-us/dyn...d-wrapping-coc

Последний раз редактировалось skuull; 05.10.2017 в 23:22.
Старый 06.10.2017, 01:12   #9  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от skuull Посмотреть сообщение
Идея то не нова
so nothing stops us!! (<strike>Russian</strike> great minds think alike!

заодно узнал про статические переменные класса...
__________________
Felix nihil admirari
Старый 06.10.2017, 01:34   #10  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Цитата:
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   #11  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от wojzeh Посмотреть сообщение
заодно узнал про статические переменные класса...
Видимо правду говорят, что в Канаде сплошь лес да медведи

Цитата:
Сообщение от wojzeh Посмотреть сообщение
а чем это принципиально отличается от связки пре-пост?
1.Оборачиваються protected методы.
2.Доступ к protected полям класса.
3.Ненадо мучать пре-пост аргументы.
4.Можно добавлять состояние (фишка не СоС но там может пригодиться)
5.Удобный синтаксис
6.Извращенцы могут скипнуть next.
Старый 06.10.2017, 17:23   #12  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от skuull Посмотреть сообщение
Видимо правду говорят, что в Канаде сплошь лес да медведи
...
2.Доступ к protected полям класса.
...
6.Извращенцы могут скипнуть next.
я сам удивлён, как сдал экзамен по новой версии...

2. доступ к полям класса - есть примерчик?
6. скипнуть некст - и чо будет? по-моему, это самое интересное.

технически такая обёртка делается наследником класса с перекрытием метода и вызовом его супера, или есть какой-то другой подход?
__________________
Felix nihil admirari
Старый 06.10.2017, 23:22   #13  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от wojzeh Посмотреть сообщение
6. скипнуть некст - и чо будет? по-моему, это самое интересное.

технически такая обёртка делается наследником класса с перекрытием метода и вызовом его супера, или есть какой-то другой подход?
Наследник без супера это хороший вариант, плохой в этой же теме на 2 странице D365: passing through public method by means of Pre- and Post-event handlers

Цитата:
Сообщение от wojzeh Посмотреть сообщение
2. доступ к полям класса - есть примерчик?
Ну есть у вас класс
X++:
class BusinessLogic1
{
 protected int a;
}
и вы можете делать так
X++:
[ExtensionOf(ClassStr(BusinessLogic1))]
final class BusinessLogic1_Extension
{
    public int getA()
    {
        return a;
    }
}
Очень полезно когда работаешь с классами\формами где переменные protected и доступ через Pre\Post к ним нет.
Старый 06.10.2017, 04:26   #14  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а чем это принципиально отличается от связки пре-пост?
Способом доступа к переменным. Так мы берем и хакаем через 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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sertandev: AX7 Extensibility – Part 3 : Event handlers and delegates (hooks) Blog bot DAX Blogs 0 28.08.2017 19:11
ievgensaxblog: D365O. Trick to pass a value between Pre and Post event handler using XppPrePostArgs. Blog bot DAX Blogs 0 01.07.2017 10:13
How to cancel method execution in pre-event handler alicedr DAX: Программирование 6 01.01.2017 15:33
newdynamicsax: Pre / Post handlers and kernel classes. Blog bot DAX Blogs 0 25.04.2016 15:11

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

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

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