30.09.2021, 00:31 | #21 |
Administrator
|
Ну в Вашем случае получается, что есть последователи вашего закрытого кода. А это "в корне меняет ситуацию". Конечно в этом случае, когда потребители вашего закрытого кода "под боком" и могут "оперативно настучать" - Вам действительно приходится думать о поддержке. Но опять-таки... полагаю, что таких последователей у Вас если не всего один, то явно крайне мало по сравнению с MS. Т.е. можно в принципе попытаться "угадать", где делать точки расширения. MS-у в этом плане гораздо сложнее
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2021, 08:10 | #22 |
Участник
|
Какие-то точки расширения были продуманы, какие-то нет. Какие-то были лишние. Регулярное добавление свидетельствует только о том, что либо не все были продуманы заранее либо появися новый функционал.
|
|
30.09.2021, 08:11 | #23 |
Участник
|
Как интересно! А вы не могли бы описать подробнее ?
|
|
30.09.2021, 08:14 | #24 |
Участник
|
Не могут. Вернее могут, но это слишком дорого и трудозатратно. Т.е. по факту не могут. И на практике ищут обходные пути. Об этом многократно говорилось.
Пожалуй я соглашусь с Евгением (DSPIC), что если по умолчанию ставить везде protected вместо private, то всем будет намного легче. |
|
30.09.2021, 08:20 | #25 |
Участник
|
|
|
30.09.2021, 08:34 | #26 |
Moderator
|
Я тоже много раз читал рассуждения mazzy по поводу того что Аксапта использует древнюю явовскую VM, но никогда не читал что-то подобного в воспоминаниях участников процесса или даже архивных внутренних документах MS. При этом схожесть с явой в старой аксапте - она тоже достаточно относительная. Я бы скорее назвал X++ версии 2.5 "Visual Basic с явовским синтаксисом". Все-таки многие очень фундаментальные явовские идеи - типа интерфейсов, появились в языке только где-то в DAX2009 (хотя да - interface был reserved word со времен версии 2.1).
Последний раз редактировалось fed; 30.09.2021 в 10:19. |
|
30.09.2021, 08:36 | #27 |
Участник
|
Тут такая логическая цепочка: регулярные обновления => совместимость => органичение объема API.
При регулярных обновлениях надо быть обратно совместимым потому, что иначе расширения будут отваливаться. Теперь рассмотрим, что будет, если просто везде стаить public. Вот, допустим кто-то написал X++: public void foo(string bar) { ...- } X++: public void foo(string bar, int baz) X++: public void foo(string bar, int baz = 0) 1. Может быть расширение которое обернуло этот код и не прокидывает новый параметр 2. Если параметр baz логически обязательный, то все скомпилируется и сработает но неправильно. Фактически, это означает, что логически обязательный параметр вообще никак нельзя добавить без потери обратной совместимости. X++: public void foo(string bar) { this.fooWithBaz(bar, 0); } public void fooWithBaz(string bar, int baz) Еще можно сделать disposable context - фактически передавать дополнительные данные через статический метод, но будут пролемы с рекурсией. Можно изначально передавать параметры завернутые в parameter object. A самое главное, от логически обязательного параметра не спасает ничего. При этом всем этот метод в реальности, скорее всего, никакими расширениями не используется (потому, что большинство методов не используется) и делать его piblic значит просто закрыть себе возможность развития этого участка кода без какой бы то ни было выгоды для кого-то. |
|
|
За это сообщение автора поблагодарили: sukhanchik (6), DSPIC (5). |
30.09.2021, 08:40 | #28 |
Moderator
|
Цитата:
Сообщение от belugin
Они могут себе попросить точку расширения, которой им не хватает.
Мы регулярно их делаем. Но в целом соглашусь с другими ораторами: Запрос точки расширения могут себе позволить только ISV. В проектных условиях - cut and paste - наше все... |
|
|
За это сообщение автора поблагодарили: belugin (5). |
30.09.2021, 09:02 | #29 |
Участник
|
Цитата:
В Ax<=2012 своя ВМ и свой рантайм. Это можно даже по внешним свойствам догадаться. Оно ведет себя не как ява, а как динамический рантайм со статическим проверщиком типа тайпскрипт. final - оно ж прежде всего логическая вещь, а не для перформанса. |
|
30.09.2021, 09:35 | #30 |
Участник
|
Кстати, конкретно от модуля ER есть API которые бы вы хотели, но не просили официально?
|
|
30.09.2021, 10:07 | #31 |
Участник
|
Нужно было использовать запись ERFormatMappingTable, но не ту, что ER модуль предлагает. Детали не спрашивайте, у меня у самого вопросы к консультанту, но задачу нужно было решить. Поскольку модуль закрыт, пришлось прицепиться к навигационному методу solution, чтобы подставить нужную запись ERFormatMappingTable, из которой уже в стандартном коде будет найдена соответствующая ERSolutionTable через ERFormatMappingTable.solution().
X++: [ExtensionOf(tableStr(ERFormatMappingTable))] final class ERFormatMappingTableNNN_Extension { [PreHandlerFor(tableStr(ERFormatMappingTable), tableMethodStr(ERFormatMappingTable, solution))] public static void ERFormatMappingTable_Pre_solution(XppPrePostArgs args) { NNNEuSalesListReportingEngineContext context = NNNEuSalesListReportingEngineContext::current(); if (context != null && context.generatingReport && context.reportFormatMappingId != 0) { ERFormatMappingTable erFormatMappingTable = ERFormatMappingTable::find(context.reportFormatMappingId); ERFormatMappingTable callerERFormatMappingTable = args.getThis() as ERFormatMappingTable; callerERFormatMappingTable.data(erFormatMappingTable); } } } |
|
|
За это сообщение автора поблагодарили: belugin (5), Logger (5). |
30.09.2021, 10:14 | #32 |
Участник
|
Цитата:
а) возможность создавать свою среду разработки. Не уверен что сейчас это возможно без финтов. + б) возможность встроить свои форматы (как Excel и ко) Вроде писали что можно но не тестил. + но- по идее конечно могу выгрузить в формате xml или json и далее уже все сделать но выглядеть это будет колхозно. в) возможность связать явно маппинг и формат +++ Последний раз редактировалось axm2017; 30.09.2021 в 10:39. |
|
30.09.2021, 11:00 | #33 |
Участник
|
Разные случаи есть. Типичный случай когда человек не сильно погруженный в функционал полез менять что то в доступных методах. Ограничение позволяет ему выбрать правильное место по мысли автора кода.
|
|
|
За это сообщение автора поблагодарили: sukhanchik (3). |
30.09.2021, 14:43 | #34 |
Участник
|
Цитата:
Какие-то точки расширения были продуманы, какие-то нет. Какие-то были лишние
|
|
30.09.2021, 16:14 | #35 |
Участник
|
Цитата:
P.S. Вот тут "as XXX" лучше убрать имхо. Если что-то не так, то лучше получить invalidcastexception и знать в чем именно дело, чем nullreferenceexception и гадать то ли пришел null то ли не тот тип. X++: ERFormatMappingTable callerERFormatMappingTable = args.getThis() as ERFormatMappingTable; callerERFormatMappingTable.data(erFormatMappingTable); |
|
|
За это сообщение автора поблагодарили: Stitch_MS (3). |
30.09.2021, 16:23 | #36 |
Участник
|
Цитата:
Цитата:
б) возможность встроить свои форматы (как Excel и ко) Вроде писали что можно но не тестил. + но- по идее конечно могу выгрузить в формате xml или json и далее уже все сделать но выглядеть это будет колхозно.
Цитата:
в) возможность связать явно маппинг и формат +++
|
|
30.09.2021, 17:57 | #37 |
Участник
|
Цитата:
Например, через reflection в нужные моменты временно активировать кредит-чекпоинты для типа proforma confirmation в настройках, а потом постить этот документ для original SO, чтобы сработал кредит-чек и, если надо, заблокировал его. Или, скажем, при нажатии Release to warehouse в intercompany SO, переходить в original SO, запускать кредит-чек для чекпоинта Release to warehouse, и если там получался кредит-холд, перебрасывать этот кредит-холд в IC SO. Так чтобы в итоге задолженность конечного покупателя не дала отпустить товар на склад в другой компании. |
|
30.09.2021, 18:41 | #38 |
Участник
|
Цитата:
Сообщение от sukhanchik
Грубо говоря - мне дали задачу, я написал класс, в котором 20 методов private и 10 методов public / protected. Если я обычный программист - я не думаю о последователях - ибо их нет, а расставлять точки расширения наобум - это бестолковая задача. А вот если я программист MS - я обязан дополнительно подумать об (условно) 5 точках расширения, которые я должен заложить в свой код.
Потом возникает вопрос частоты обновлений, тут на помощь приходит микросервисная архитектура. Делается микросервис(идельно - работающий только на Тир2, что отсекает большую часть разработчиков из репортинга багов ), который уже отдельная команда пилит по своему расписанию. Т.е. архитектура системы подстраивается под структуру огранизации разрабатывающей ПО, вроде такой закон даже есть Вообще модификаторы идеально были сделаны в начальной версии АХ, т.е. private не запрещал вызов метода, а выдавал ошибку BP. Это как бы на порядок лучше использование Reflection. |
|
|
За это сообщение автора поблагодарили: sukhanchik (3), vmoskalenko (5). |
30.09.2021, 19:02 | #39 |
Участник
|
Ладно со старыми методами, там private по-умолчанию переехал из 12-й, это можно объяснить (не)злым умыслом. Но в новых модулях, кторые пишутся с нуля.. смотрим написанный недавно с нуля Asset leasing:
- все классы помечены internal final class AssetLease* Все методы: -все что можно private - там где нельзя поставить private по смыслу - internal - нельзя ни то, ни другое - [Hookable(false)] ну т.е. не то что точки не заложены, а модуль целиком и полностью с особой паранойей закрыт изначально. Допускаю, что это задумано для того, чтобы репортили баги вместо заплаток, потому что модуль сырой, но тенденция однако может распространиться на все остальное. |
|
30.09.2021, 19:37 | #40 |
Участник
|
|
|
|
|