30.05.2017, 00:28 | #41 |
Участник
|
Цитата:
Сообщение от ax_mct
Development tutorial: SysExtension framework in factory methods where the constructor requires one or more arguments
http://kashperuk.blogspot.co.uk/2017...extension.html |
|
30.05.2017, 09:17 | #42 |
Участник
|
Цитата:
Цитата:
Насыпать сахара, который предоставлял бы дефолтное поведение по-умолчанию.
Чего, как мне кажется не хватает, это вожможномсти посмотреть все экстеншены с ключами и валидации. Цитата:
Да много чего можно было бы сделать. И для этого не нужен был жесткий алгоритм, задействующий рефлекшен.
|
|
30.05.2017, 10:02 | #43 |
Участник
|
Цитата:
Цитата:
какая потребность есть у людей в Аксапте: = изменить или добавить функционал, который могут использовать пользователи == пользователи работают с функционалом через menuItem == menuItem вызывает классы через статический метод main (menuItem также используются для вызова форм) == права доступа к функционалу Аксапты настраивается через menuItem Вызывать класс напрямую вообще говоря моветон в Аксапте (хоть МС делает это сплошь и рядом в стандартном функционале, сволочи) Если вызывать напрямую, то нужно запрограммировать закат солнца вручную чтобы учесть настроенные права. Функционал аксапты можно и должно вызывать через menuItem. что делает МС, чтобы удовлетворить потребность людей? никакого сахара для работы с инфраструктурой аксапты минимализм и совершенно перпендикулярная остальной инфраструктуре технология атрибутов ну и так далее. Макс, участники, я знаю что технология атрибутов работает. Спасибо, что вы рассказываете и даете ссылки на документацию. Но я хотел сказать, что выбранный способ реализации - далеко не единственный. И далеко не оптимальный. Даже с тупой точки зрения выживания продукта. Просто никто не думал о том, как ЭТО будут использовать конечные потребители - в данном случае разработчики партнеров и клиентов. я собственно только об этом. Цитата:
Но не стоит ожидать, что остальные будут впечатлены - они то не смогут этим пользоваться. Цитата:
Причем, belugin - образец вполне адекватного и взшенного подхода. Спасибо тебе, Макс. Просто у него свои приоритеты. И не потому что он так решил, а потому что у него тоже есть начальство и тоже есть поставленные ему задачи и сроки. Ключевой вопрос - что и как надо сделать, чтобы приоритеты у архитекторов-разработчиков внутри МС были хотя бы немного похожими на приоритеты потребителей (в данном случае разработчики партнеров и клиентов)... Извините за дикий оффтопик. Последний раз редактировалось mazzy; 30.05.2017 в 10:08. |
|
30.05.2017, 12:56 | #44 |
Участник
|
Цитата:
Цитата:
что делает МС, чтобы удовлетворить потребность людей?
никакого сахара для работы с инфраструктурой аксапты минимализм и совершенно перпендикулярная остальной инфраструктуре технология атрибутов Цитата:
Просто никто не думал о том, как ЭТО будут использовать конечные потребители - в данном случае разработчики партнеров и клиентов.
|
|
30.05.2017, 13:12 | #45 |
Участник
|
info.add - является.
запуск закрытия склада - является запуск пересчета курсовой разницы - является запуск отчета GER - является. запуск из меню, из формы, как пакетное задание, в отдельном потоке и просто info.add - все это вызов класса. ты совершенно прав. что из этого уже делается через SysExtensionAppClassFactory::getClassFromSysAttribute? сколько нужно программировать чтобы вызвать классы при помощи SysExtensionAppClassFactory::getClassFromSysAttribute? Цитата:
но это вовсе не означает, что людям не нужно этого делать. что у людей нет потребности. или нет сценариев такого использования. это всего лишь означает, что предлагаемая технология очень ограничена. Цитата:
Макс, ты не переживай. Не ты один не видишь, к сожалению. Просто ты работаешь не так, как работают на проектах. И потребности, и приоритеты у тебя другие. |
|
30.05.2017, 13:27 | #46 |
Banned
|
Switch - это что, тоже технология? Вам нравится использовать эту технологию? Если нет, то почему?
Совершенно очевидно, для чего это было сделано. Все вклинивались в конструктор, теперь же этого делать не надо. Конечно, только там, где стандартный класс уже использует атрибуты. Где не использует - жалуйтесь разработчикам. Точно так же действуйте там, где необходим overlayering, а hook не предусмотрен - жалуйтесь. Может, сделают, скорее всего проигнорируют, но вы камень с души снимете, свою роль сыграете до конца. И вообще, читайте первоисточники: http://patents.justia.com/patent/9026989. Михаэль Галль и Михаель Понтоппидан зарегистрировали патент, завидуйте, придумывайте как сделать лучше и регистрируйте свои патенты. |
|
|
За это сообщение автора поблагодарили: mazzy (2), ax_mct (10). |
30.05.2017, 14:40 | #47 |
Banned
|
Цитата:
Сообщение от EVGL
И вообще, читайте первоисточники: http://patents.justia.com/patent/9026989.
Михаэль Галль и Михаель Понтоппидан зарегистрировали патент, завидуйте, придумывайте как сделать лучше и регистрируйте свои патенты. Это же начала конца света. Война патентов на уровне написания кода. Заслуживает отдельной темы разобраться. Звонок тревожный если ручки и до этого дотянулись. Прецендент. Ведь не придумали они это, а просто оформили. P.S. Или это не стремление корпорации зарабатывать на способах написания кода, а инициатива авторов реализации чтобы наоборот тянуть с Microsoft?? P.P.S. Assignee - MS, значит владелец патента - Microsoft. Завидовать авторам - не хочется. Хочется их казнить Patent History Patent number: 9026989 Type: Grant Filed: Jun 7, 2012 Date of Patent: May 5, 2015 Patent Publication Number: 20130332898 Assignee: Microsoft Technology Licensing LLC (Redmond, WA) Inventors: Michael Gall (Copenhagen), Michael Fruergaard Pontoppidan (Lynge), Lars Dragheim Blaaberg (Karlslunde), Arthur Greef (Burien, WA) Последний раз редактировалось ax_mct; 30.05.2017 в 15:02. |
|
30.05.2017, 16:13 | #48 |
Banned
|
Цитата:
Сообщение от ax_mct
Это же начала конца света. Война патентов на уровне написания кода.
Заслуживает отдельной темы разобраться. Звонок тревожный если ручки и до этого дотянулись. Прецендент. Ведь не придумали они это, а просто оформили. P.S. Или это не стремление корпорации зарабатывать на способах написания кода, а инициатива авторов реализации чтобы наоборот тянуть с Microsoft?? P.P.S. Assignee - MS, значит владелец патента - Microsoft. Завидовать авторам - не хочется. Хочется их казнить Корпорация Microsoft пополнила свой многотысячный багаж патентов, все правильно, рабочее время и интеллектуальный продукт принадлежит корпорации. Сами изобретатели повесили себе на грудь то есть LinkedIn, чтобы потом продать себя подороже. В чем проблема? |
|
30.05.2017, 16:35 | #49 |
Banned
|
Проблема в том что теперь нужно смотреть какой способ организации своего кода бесплатен, а какой нет. Я раньше вообще не подозревал что такие патенты существуют.
Создаю я скажем свой продукт или беру Open-source, продаю решение клиентам. А потом разоряюсь так как использовал способ написания кода который запатентован. Или в этом продукте который я использую такое содержится. Это что же мне все патенты читать? Причем разоряюсь еще до суда, так как почти уверен что мои профессиональные страховки на юридические услуги не учитывают нарушение авторских прав. Сорри за оффтоп. Пока непонятно тема это или нет. |
|
30.05.2017, 16:38 | #50 |
Участник
|
"вызывать его напрямую вообще говоря моветон в Аксапте" ? Ты предлагаешь через menuItem?
Цитата:
что из этого уже делается через SysExtensionAppClassFactory::getClassFromSysAttribute?
сколько нужно программировать чтобы вызвать классы при помощи SysExtensionAppClassFactory::getClassFromSysAttribute? Вот именно! Нигде!! Му-ха-ха-ха!!!! Программировать? Для расширения - просто пометить атрибутом, для того места, которое надо расширить - вызов метода. Если нужен новый тип данных для ключа, добавить атрибут для него. Цитата:
это всего лишь означает, что предлагаемая технология очень ограничена.
Цитата:
Да-да.
Макс, ты не переживай. Не ты один не видишь, к сожалению. Просто ты работаешь не так, как работают на проектах. И потребности, и приоритеты у тебя другие. |
|
|
За это сообщение автора поблагодарили: EVGL (1), Vadik (1). |
30.05.2017, 22:57 | #51 |
Участник
|
Цитата:
я говорил, что МС мог бы сделать более универсальный механизм, который учитывает инфраструктуру Аксапты. И мог бы насыпать синтаксического сахара. А также привел примеры того, как это делают другие. Цитата:
доведи свою мысль до вызова функцонала класса, пожалуйста. можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные. как ? как дать пользователю пользователю? как проверить права? как обеспечить, чтобы это расширение работало и в пакетных заданиях. для определенности, давай сформулирую условие на старо-программистком: = создать класс-потомок от CustVendAutoSettlement_Cust_RU (см. скриншот) = ovverride метод dialog* = ovverride метод query = новый функционал должен работать как в пакетном задании, так и при непосредственном запуске пользователем = новый функционал должен быть доступен только некоторым пользователям (желательно, чтобы система доступа была построена на стандартных правах аксапты) ============= говоришь, кто-то указал, что это final класс? ничего-ничего, на проекте можно [было] убрать это слово. давай будем считать, что этого слова там нет. ============= И какое же на твой взгляд? А какое предназначение было у конструкторов, которых не будет? Макс, легко. Обещаю, я сделаю это, после того, как ты покажешь как решить типовую задачу на типовом внедрении - как предоставить пользователю возможность запуска расширенного функционала тривиального семейства из 7-8 классов "просто пометив атрибутом". Последний раз редактировалось mazzy; 30.05.2017 в 23:01. |
|
31.05.2017, 00:45 | #52 |
Banned
|
Исходный вопрос превратился в "как обойтись без overlayering". Да никак, ответ все тот же: "Option 3: Admit that your solution is not feasible in Dynamics 365 for Operations". Поскольку хотя указанный класс и использует форму, которую можно расширить, то сам класс и все методы работы с query объявлены как protected. Game over.
Только на прошлой неделе имел подобный разговор. Архитектор Microsoft глубокомысленно заявлял, что методы ProjControlCalc заявлены как приватные, поскольку знающие разработчики в расчете на развитие системы прозорливо застолбили для себя возможность изменить внутреннюю реализацию и изменить контракт. Толкование хорошее, есть пища на часы телеконференций. Но мы-то знаем, что на самом деле модуль проектов из маркетинговых соображений отложен на пыльную полку и практически не развивается с 2014 года, а модификаторы методов - это отнюдь не скрижали и не голос из неопалимой купины, а быстрая тяп-ляп работа под конец рабочего дня. С тем же успехом модификаторы можно было расставлять по броску костей, но вдруг 10 лет спустя после написания кода верховный жрец-разработчик узрел их тайный смысл и произнес роковые слова: "ТАБУ!" |
|
31.05.2017, 01:53 | #53 |
Участник
|
Цитата:
Никак не подходит под патентованную технологию. Расст-елять! Неп-еменно расст-елять! А патентованная технология замечательная. Да-да. Ну, ничего, в данном случае можете снять мешающие вам final, protected можете использовать другое семейство классов с несколькими уровнями. Просто продемонстрируйте проектик с добавленной функциональностью, которую могут использовать пользователи со специальными правами, в которой используется мощнейшая технология атрибутов и SysExtensionAppClassFactory::getClassFromSysAttribute. Ведь это ж "просто пометить атрибутом". |
|
31.05.2017, 10:31 | #54 |
Участник
|
- "Вызывать класс напрямую - это моветон"
- "Info.add" это вызов класса => просто писать info.add это моветон. Я прошу показать бон тон. Цитата:
можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные.
как ? как дать пользователю пользователю? как проверить права? как обеспечить, чтобы это расширение работало и в пакетных заданиях. Вариант 2: Использовать SysIConditionalExtension Цитата:
говоришь, кто-то указал, что это final класс?
Цитата:
И какое же на твой взгляд?
А какое предназначение было у конструкторов, которых не будет? 2) Без конструкторов легко как и практически во всех компонентный моделях (метод init - те же самые RunBase получают параметры не из конструктора) |
|
31.05.2017, 10:31 | #55 |
Участник
|
Цитата:
В качестве простого наглядного примера, когда-то я как менеджер проекта добивался, чтобы члены проектной группы, которые должны общаться друг с другом, сидели не дальше двух метров друг от друга. |
|
31.05.2017, 10:50 | #56 |
Участник
|
Цитата:
Есть некоторые претензии к понятности того, что получилось, но они за счет 1) Больших методов в SubjedgerJournalizer 2) Быстродействия и нерасширяемости пакетных insert into (дублирование кода в extensions) 3) Нарушения принципа tell-don't-ask кое где. Это никак не связано с тем, создавать ли классы при помощи Case или при помощи атрибутов. Еще API расширений никак не противоречит оверллеерингу - это два ортогональных аспекта. Посмотрите, например на Linux - у программистов есть возможность как пользоваться API так и делать патчи. Большинство пользуется API, но для этого нужен хороший API |
|
31.05.2017, 11:15 | #57 |
Участник
|
Цитата:
info.add - это вызов метода класса через глобальную переменную infolog. в аксапте есть три общеизвестных глобальных предопределенных переменных - infolog, session, appl. ты точно хочешь продолжать защищать технологию атрибутов именно на этом примере? если хочешь продолжать, то обрати внимание, что метод info.add по идее должен был бы быть protected + нужно было бы объявлять friend классы (error, warning, info) для доступа к add. но в аксапте нет friend. Поэтому используется соглашение, что разработчики НЕ вызывают info.add, а должны пользоваться статическими методами Global::error, Global::warning, Global::info. Поэтому приведенный тобой пример предельно НЕ типичен для обычной работы обычных людей... Макс, я повторю вопрос - ты точно настаиваешь на этом примере в качестве обоснования технологи атрибутов? ===================== А бон тон очень просто - класс, у которого есть статический метод main с арзументом Agrs. для такого класса должен быть создан menuItem. вызвать класс через стандартную конструкцию new MenuFunction(menuitemDisplayStr(myMenuItem), MenuItemType::Display).run(args) К сожалению, среди разработчиков МС не принято беспокоится о правах доступа, поэтому часто вызывают класс напрямую через конструктор + run. Этот способ не назвать бон тоном, но по факту игнорировать этот способ нельзя - нужно думать о нем и поддерживать его тоже. Цитата:
Ты же сам сказал, что это "просто проставить атрибуты" Цитата:
Цитата:
Обрати внимание, что во всех статьях на эту тему рассматривается плоское одноуровневое наследование, а я спрашиваю про иерархию классов. Людям тоже придется иметь дело с иерахиями - их много в стандартной аксапте, их много в кастомизациях. Я думаю, что все уже давно увидели эту разницу и с нетерпением ждут ответа. Уверен, что ты легко приведешь изящный способ. Также обрати внимание, что ты отвечаешь про конструкторы. людям же нужно добавить функциональность, которую могут использовать пользователи. Нет, Макс, это не одно и то же. Нет, участники, это не придирка с словам и правописанию. Итак, формулировка: Цитата:
Сообщение от mazzy
Просто продемонстрируйте проектик с добавленной функциональностью, которую могут использовать пользователи со специальными правами,
в которой используется мощнейшая технология атрибутов и SysExtensionAppClassFactory::getClassFromSysAttribute. Ведь это ж "просто пометить атрибутом". Последний раз редактировалось mazzy; 31.05.2017 в 11:28. |
|
31.05.2017, 15:08 | #58 |
Banned
|
Цитата:
http://kashperuk.blogspot.co.uk/2017...extension.html является статьей двухмесячной давности. Основная описанная проблема - игнорирование аргументов с dictClass.makeObject(). SysExtension framework will instantiate a new instance of the corresponding class (dictClass.makeObject()), which ignores the constructor arguments. Предложенное решение - передавать обьект третьим параметром. In order to account for the constructor arguments we need to use an Instantiation strategy, which can then be passed in as the 3rd argument when calling SysExtensionAppClassFactory. Если посмотреть на сигнатуру SysExtensionAppClassFactory::getClassFromSysAttribute https://msdn.microsoft.com/en-us/lib...attribute.aspx то этот третий параметр существует как [SysExtAppClassDefaultInstantiation _defaultInstantiation]) Если проблема работы с многоуровневой иерархией решается то решается она через class SysExtAppClassDefaultInstantiation implements SysExtensionIInstantiationStrategy И вот эта самая Instantiation Strategy как-то и призвана решить все проблемы. X++: public class BaseClassWithArgInConstructor { //... public static BaseClassWithArgInConstructor construct(NoYesUnchanged _factoryType, str _argument) { NoYesUnchangedFactoryAttribute attr = new NoYesUnchangedFactoryAttribute(_factoryType); BaseClassWithArgInConstructor instance = SysExtensionAppClassFactory::getClassFromSysAttribute( classStr(BaseClassWithArgInConstructor), attr, [B]InstantiationStrategyForClassWithArg::construct(_argument)[/B]); return instance; } }. |
|
31.05.2017, 15:45 | #59 |
Участник
|
Цитата:
Сообщение от ax_mct
Приведенная ссылка
http://kashperuk.blogspot.co.uk/2017...extension.html является статьей двухмесячной давности. Извините. Цитата:
Ок. Верю. Вы утверждаете что "просто". Ок. Можно проектик? |
|
31.05.2017, 16:03 | #60 |
Участник
|
например, вот такой проектик.
собрал на коленке по-старому пока билдится этот ритейл, блин. заодно узнал, что новая аксапта пиливать хотела на параметры menuItem, если menuItem сделать стартовым объектом. пришлось сделать класс starterJob. С другой стороны, показал, как запускать через menuItem )))) ============================== состав проекта: С starterJob и объекты суффиксом MST - новые. остальные переопределенные думаю, тем у кого нет акс7, скриншотов хватит. чтобы увидеть исходные тексты без аксапты, скачайте aa.axpp, измените расширение на .zip и посмотрите в содержимое. ============================== Disclimer: проектик безумен ровно настолько, насколько безумен исходный текст семейства классов. У нормальных людей есть нормальные обвязки для args, параметров, запускачей и прочее. но и такие безумные поделки приходится развивать-поддерживать на проектах. Последний раз редактировалось mazzy; 31.05.2017 в 16:07. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
Теги |
sysextension framework, sysoperation framework, как правильно, полезное |
|
|