|
![]() |
#1 |
Участник
|
Цитата:
как смотришь на то, чтоб убрать весь "эмоциональный шум" из этой ветки? так чтоб читатели могли выцепить суть, не отвлекаясь на "куда катится этот мир".
__________________
Felix nihil admirari |
|
![]() |
#2 |
Участник
|
это не одобрение )
Цитата:
как смотришь на то, чтобы создать пост, в котором ты сделаешь выжимку, которую считаешь нужной, чтобы читатели могли выцепить суть? с удовольствием добавлю ссылку на твой пост. дело в том, что я не вижу никакого эмоционального шума в этой ветке. я вижу обсуждение на нескольких уровнях восприятия для разных категорий читателей. |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от mazzy
![]() это не одобрение )
удалять документы? ))))) как смотришь на то, чтобы создать пост, в котором ты сделаешь выжимку, которую считаешь нужной, чтобы читатели могли выцепить суть? с удовольствием добавлю ссылку на твой пост. дело в том, что я не вижу никакого эмоционального шума в этой ветке. я вижу обсуждение на нескольких уровнях восприятия для разных категорий читателей. я именно такой пост в оригинале и создал - с выжимкой. полностью согласен с вашими оценками о том, что в идеальном мире за такое бы сразу в адъ. но мы уже в аду.
__________________
Felix nihil admirari |
|
![]() |
#4 |
Banned
|
Цитата:
standard method() post()>Restore В принципе это самый что ни на есть workaround. Который великолепен если его воспринимать именно как workaround. А есть какой-то способ избежать вызова "standard method()" или подменить его? И интересно почему, если это в любом случае ад, не хотят давать возможность такого полного перекрытия? Ведь для этого не нужен именно overlay сверху, можно overlay и сбоку. Как понимаю ce.CancelSuperCall() помогает избежать вызов двух форм и добавили это как фикс, а не как часть общего дизайна. |
|
![]() |
#5 |
Участник
|
__________________
Felix nihil admirari |
|
![]() |
#6 |
Участник
|
Цитата:
Предположим, у вас есть метод X класса Y у метода есть его публичный интерфейс:
И есть реализация (например он может изменить приватную переменную невидимую снаружи). Если расширения смогут отменять вызов какого угодно метода, то состояние объекта может быть испорчено. Так как ваше расширение не может учесть внутреннее состояние объекта будущих версий. Например в версии 1 вы написали расширение отменяющее вызов метода x целиком и как-то сымитировали его работу без того, что нам надо. И есть реализация (например он может изменить приватную переменную невидимую снаружи). Если расширения смогут отменять вызов какого угодно метода, то состояние объекта может быть испорчено. Так как ваше расширение не может учесть внутреннее состояние объекта будущих версий. Например в версии 1 вы написали расширение отменяющее вызов метода x целиком и как-то сымитировали его работу через публичный интерфейс. В версии 1 sp 1 внутрь добавили кеш, которое ваше расширение обновить не может (не только потому, что оно не может модифицировать приватные поля, но и потому, что оно написано для версии 1, про sp1 не знает) в результате остальные методы класса берут данные из кеша устаревшие. Собственно, если сделать подмену произвольного метода, то это и будет практически оверлееринг, но без удобного способа смотреть изменения. Последний раз редактировалось belugin; 04.10.2017 в 21:23. |
|
![]() |
#7 |
Banned
|
Цитата:
Ничего страшного в подмене нет. Это даст больше управляемости и надежности. А проверять конфликты можно и компилятором. В этой теме рассматривается паттерн обхода который в данном конкретном случае безопасен, но при отсутствии возможности подмены всего метода целиком, это превратится в рутинный подход который иначе как суицидным не назовешь. Kashperuk пишет что в Platform Update 11 что-то такое появится. Радостно наблюдать как пишется новый продукт. https://docs.microsoft.com/en-us/dyn...tform-releases |
|
![]() |
#8 |
Участник
|
*Теоретически* (то есть отвлекааясь от Аксапты данной нам в ощущениях) при создании расширения надо руководствоваться публичным контрактом метода включая побочные эффекты а не его исходным кодом (реализацией).
Контракт может быть описан как неформально (в XML документации) так и формально (например, набором тестов, Code Contracts). Цитата:
Ничего страшного в подмене нет. Это даст больше управляемости и надежности. А проверять конфликты можно и компилятором.
Цитата:
Ничего страшного в подмене нет. Это даст больше управляемости и надежности. А проверять конфликты можно и компилятором.
Последний раз редактировалось belugin; 05.10.2017 в 09:15. |
|
|
За это сообщение автора поблагодарили: Vadik (1), mazzy (2). |
![]() |
#9 |
Banned
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: Link (1), ax_mct (10), gl00mie (2). |
![]() |
#10 |
Участник
|
Цитата:
Сообщение от EVGL
![]() Это все только слова и теоретические рассуждения. На практике все происходит с точностью до наоборот, и я могу это доказать на цифрах. При переходе с 7.1 на 7.2 наше приложение согласно отчету анализа обновления было затронуто 119 (прописью: сто девятнадцать) уничтоженными полями или таблицами, и это только data dictionary.
Практически сильно следят за обратной совместимостью при разработке хотфиксов и CU - то есть про обновления в рамках одной версии. При разработке следующей версии есть предупреждения которые можно игнорировать. Мне самому интересно, как можно совместить подход в котором:
Теоретически надо отделять те куски которые вендор может изменить, от тех которые он будет поддерживать и следить за этим. Для разделения у нас есть public protected private и internal (причем последнее заработало на всех уровнях только в последних PU). |
|
|
За это сообщение автора поблагодарили: Link (1). |
![]() |
#11 |
Участник
|
Цитата:
![]() |
|
|
За это сообщение автора поблагодарили: ax_mct (11). |
![]() |
#12 |
Участник
|
то есть мне после его инсталляции нужно будет все доработки переписывать?
__________________
Felix nihil admirari |
|
![]() |
#13 |
Участник
|
Цитата:
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). |
![]() |
#14 |
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. |
|
![]() |
#15 |
Участник
|
Это пример того что это технически возможно на PU10, используется или нет я хз, мало ли кулибинов на свете. Я бы лично не стал использовать ни то ни это по причинам вышеизложенным.
|
|
![]() |
#16 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ax_mct (2). |
![]() |
#17 |
Участник
|
Цитата:
"кривой говнокод" в данном случае он лишь с точки зрения бизнес-логики, в том плане, что я сам решил, что так можно. с точки зрения будущего апгрейда, (edited: нам всё равно, что там в методе поменяетсятак что в этом смысле это лучше, чем дуплицировать код исходного метода и пытаться его полностью исключить из исполнения. ) подумал: нет, не всё равно, могут быть проблемы. я не узнал, сорян. можешь дать толковую ссылку? спасибо
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 05.10.2017 в 20:56. Причина: логическая ошибка |
|
![]() |
#19 |
Участник
|
Цитата:
Цитата:
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. |
|
Теги |
chain of command, extensions |
|
|