|
![]() |
#1 |
Участник
|
Цитата:
Цитата:
Насыпать сахара, который предоставлял бы дефолтное поведение по-умолчанию.
Чего, как мне кажется не хватает, это вожможномсти посмотреть все экстеншены с ключами и валидации. Цитата:
Да много чего можно было бы сделать. И для этого не нужен был жесткий алгоритм, задействующий рефлекшен.
|
|
![]() |
#2 |
Участник
|
Цитата:
Цитата:
какая потребность есть у людей в Аксапте: = изменить или добавить функционал, который могут использовать пользователи == пользователи работают с функционалом через menuItem == menuItem вызывает классы через статический метод main (menuItem также используются для вызова форм) == права доступа к функционалу Аксапты настраивается через menuItem Вызывать класс напрямую вообще говоря моветон в Аксапте (хоть МС делает это сплошь и рядом в стандартном функционале, сволочи) Если вызывать напрямую, то нужно запрограммировать закат солнца вручную чтобы учесть настроенные права. Функционал аксапты можно и должно вызывать через menuItem. что делает МС, чтобы удовлетворить потребность людей? никакого сахара для работы с инфраструктурой аксапты минимализм и совершенно перпендикулярная остальной инфраструктуре технология атрибутов ну и так далее. Макс, участники, я знаю что технология атрибутов работает. Спасибо, что вы рассказываете и даете ссылки на документацию. Но я хотел сказать, что выбранный способ реализации - далеко не единственный. И далеко не оптимальный. Даже с тупой точки зрения выживания продукта. Просто никто не думал о том, как ЭТО будут использовать конечные потребители - в данном случае разработчики партнеров и клиентов. я собственно только об этом. Цитата:
Но не стоит ожидать, что остальные будут впечатлены - они то не смогут этим пользоваться. Цитата:
Причем, belugin - образец вполне адекватного и взшенного подхода. Спасибо тебе, Макс. Просто у него свои приоритеты. И не потому что он так решил, а потому что у него тоже есть начальство и тоже есть поставленные ему задачи и сроки. Ключевой вопрос - что и как надо сделать, чтобы приоритеты у архитекторов-разработчиков внутри МС были хотя бы немного похожими на приоритеты потребителей (в данном случае разработчики партнеров и клиентов)... Извините за дикий оффтопик. Последний раз редактировалось mazzy; 30.05.2017 в 10:08. |
|
![]() |
#3 |
Участник
|
Цитата:
![]() Цитата:
что делает МС, чтобы удовлетворить потребность людей?
никакого сахара для работы с инфраструктурой аксапты минимализм и совершенно перпендикулярная остальной инфраструктуре технология атрибутов Цитата:
Просто никто не думал о том, как ЭТО будут использовать конечные потребители - в данном случае разработчики партнеров и клиентов.
|
|
![]() |
#4 |
Участник
|
info.add - является.
запуск закрытия склада - является запуск пересчета курсовой разницы - является запуск отчета GER - является. запуск из меню, из формы, как пакетное задание, в отдельном потоке и просто info.add - все это вызов класса. ты совершенно прав. что из этого уже делается через SysExtensionAppClassFactory::getClassFromSysAttribute? сколько нужно программировать чтобы вызвать классы при помощи SysExtensionAppClassFactory::getClassFromSysAttribute? Цитата:
но это вовсе не означает, что людям не нужно этого делать. что у людей нет потребности. или нет сценариев такого использования. это всего лишь означает, что предлагаемая технология очень ограничена. Цитата:
Макс, ты не переживай. Не ты один не видишь, к сожалению. Просто ты работаешь не так, как работают на проектах. И потребности, и приоритеты у тебя другие. |
|
![]() |
#5 |
Участник
|
"вызывать его напрямую вообще говоря моветон в Аксапте" ? Ты предлагаешь через menuItem?
Цитата:
что из этого уже делается через SysExtensionAppClassFactory::getClassFromSysAttribute?
сколько нужно программировать чтобы вызвать классы при помощи SysExtensionAppClassFactory::getClassFromSysAttribute? Вот именно! Нигде!! Му-ха-ха-ха!!!! Программировать? Для расширения - просто пометить атрибутом, для того места, которое надо расширить - вызов метода. Если нужен новый тип данных для ключа, добавить атрибут для него. Цитата:
это всего лишь означает, что предлагаемая технология очень ограничена.
Цитата:
Да-да.
Макс, ты не переживай. Не ты один не видишь, к сожалению. Просто ты работаешь не так, как работают на проектах. И потребности, и приоритеты у тебя другие. |
|
|
За это сообщение автора поблагодарили: EVGL (1), Vadik (1). |
![]() |
#6 |
Участник
|
Цитата:
я говорил, что МС мог бы сделать более универсальный механизм, который учитывает инфраструктуру Аксапты. И мог бы насыпать синтаксического сахара. А также привел примеры того, как это делают другие. Цитата:
доведи свою мысль до вызова функцонала класса, пожалуйста. можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные. как ? как дать пользователю пользователю? как проверить права? как обеспечить, чтобы это расширение работало и в пакетных заданиях. для определенности, давай сформулирую условие на старо-программистком: = создать класс-потомок от CustVendAutoSettlement_Cust_RU (см. скриншот) = ovverride метод dialog* = ovverride метод query = новый функционал должен работать как в пакетном задании, так и при непосредственном запуске пользователем = новый функционал должен быть доступен только некоторым пользователям (желательно, чтобы система доступа была построена на стандартных правах аксапты) ============= говоришь, кто-то указал, что это final класс? ничего-ничего, на проекте можно [было] убрать это слово. давай будем считать, что этого слова там нет. ============= И какое же на твой взгляд? А какое предназначение было у конструкторов, которых не будет? Макс, легко. Обещаю, я сделаю это, после того, как ты покажешь как решить типовую задачу на типовом внедрении - как предоставить пользователю возможность запуска расширенного функционала тривиального семейства из 7-8 классов "просто пометив атрибутом". Последний раз редактировалось mazzy; 30.05.2017 в 23:01. |
|
![]() |
#7 |
Участник
|
- "Вызывать класс напрямую - это моветон"
- "Info.add" это вызов класса => просто писать info.add это моветон. Я прошу показать бон тон. Цитата:
можно на примере расширить периодическое сопоставление по клиентам, например. Некоторым пользователям можно запускать специальное сопоставление по клиентам. со специальными полями в диалоге, которые устанавливает специальное условия в query. Остальные поля - стандартные.
как ? как дать пользователю пользователю? как проверить права? как обеспечить, чтобы это расширение работало и в пакетных заданиях. Вариант 2: Использовать SysIConditionalExtension Цитата:
говоришь, кто-то указал, что это final класс?
Цитата:
И какое же на твой взгляд?
А какое предназначение было у конструкторов, которых не будет? 2) Без конструкторов легко как и практически во всех компонентный моделях (метод init - те же самые RunBase получают параметры не из конструктора) |
|
![]() |
#8 |
Участник
|
Цитата:
В качестве простого наглядного примера, когда-то я как менеджер проекта добивался, чтобы члены проектной группы, которые должны общаться друг с другом, сидели не дальше двух метров друг от друга. |
|
![]() |
#9 |
Участник
|
Цитата:
Сообщение от mazzy
![]() какая потребность есть у людей в Аксапте:
= изменить или добавить функционал, который могут использовать пользователи == пользователи работают с функционалом через menuItem == menuItem вызывает классы через статический метод main (menuItem также используются для вызова форм) == права доступа к функционалу Аксапты настраивается через menuItem Вызывать класс напрямую вообще говоря моветон в Аксапте (хоть МС делает это сплошь и рядом в стандартном функционале, сволочи) Если вызывать напрямую, то нужно запрограммировать закат солнца вручную чтобы учесть настроенные права. Функционал аксапты можно и должно вызывать через menuItem. что делает МС, чтобы удовлетворить потребность людей? никакого сахара для работы с инфраструктурой аксапты минимализм и совершенно перпендикулярная остальной инфраструктуре технология атрибутов Есть станадртный класс BankDepositSlip у которого нет наследников но он помечен X++: [Microsoft.Dynamics.AX.Platform.Extensibility.ExportInterfaceAttribute, System.ComponentModel.Composition.ExportMetadataAttribute('BankCreateDepositSlip', 'BankDepositSlip'), System.ComponentModel.Composition.ExportAttribute('Dynamics.AX.Application.BankDepositSlip')] X++: public static void main(Args args) { BankDepositSlip instance; if (args && args.record()) { instance = BankDepositSlip::construct(args.record(), args.parm()); if (instance.prompt()) { instance.runOperation(); } } } protected static BankDepositSlip construct(LedgerJournalTrans _ledgerJournalTrans, str _variationName = 'BankDepositSlip') { BankDepositSlip instance; SysPluginMetadataCollection meta = new SysPluginMetadataCollection(); meta.SetManagedValue('BankCreateDepositSlip', _variationName); instance = SysPluginFactory::Instance('Dynamics.AX.Application', classstr(BankDepositSlip), meta); Debug::assert(instance != null); instance.initInstance(_ledgerJournalTrans); return instance; } а) создать наследник пометив его другим атрибутом б) создать новый menuItem с новым параметром. Не все так плохо как хотелось бы ![]() |
|
|
За это сообщение автора поблагодарили: mazzy (2), sukhanchik (4), Ace of Database (2). |
![]() |
#10 |
Участник
|
Цитата:
да, можно передавать строковый тег. но обычно стратегия определяется не menuItem, а datasource: если стоим на одной записи, то делаем одно, если на другой, то делаем другое, если вызываем из другой таблицы, то третье и так далее. а в менюИтемах задаются режимы обработки. Цитата:
собственно, как и раньше, имеем: = эта штука работает на refleaction (со всеми вытекающими последствиями) = вместо конструктора должен быть отдельный класс-запускач (дополнительно к адаптерам, хендлерам, хандлерам, хелперам добавляется еще и strategy) = отдельный класс-запускач ломает систему перекрестных ссылок - теперь понять где что используется и как работает намного сложнее да, в platform update 7 они таки сделали.
Но: = никакой параллельности или асинхронности в фреймворке не предполагается = за уникальностью ключа должен следить сам программист = ключ - строка, с позиционными значениями (почему не аксаптовский контейнер, не xml, не json, не другой сериализуемый объект? почему не использовать имя класса в качестве ключа?) = вся стратегия определения ключа должна находится в одном месте - попытка сделать делегирование принятия решения о ключе приводит к возвращению к иерерхии конструкторов, только в отдельном классе. Другими словами, все равно есть длинный список параметров с заданными позициями. но у них нет дефолтных значений. Та-дам! А весь конструктор должен быть в одном методе. Со всеми пересечениями кода. Та-дам! самое интересное, что эта штука не решает проблему подключения кода от разных производителей. особенно, если разные производители добавлят классы с разными строками-ключами в середину иерархии. или добавят одинаковые ключи для разных классов. мы все еще на уровне "надо сделать атрибут"? да, все уже в курсе. вопрос - какой? как? какова методика добавления класса в иерархию с атрибутами? как добавлять в середину иерахии? как добавлять класс листом в иерархию? кто следит за уникальностью? что должно произойти с методом, который вычисляет ключ после добваления новый классов в иерархию? насколько эта байда проще-легче, чем просто код конструкторов? причем хорошо бы иметь проектик с общей кодовой базой. как предмет для обсуждения. вот-вот! именно! можно. спасибо. только у нас щас должен быть engineering complete. боюсь, что на этой неделе я только урывками во время компиляции. но тема - интересная. в идеале нужен проект на семействе классов с иерархией. спасибо. Цитата:
подумайте еще. для дальнейшего предметного обсуждения: 1. выберите пример с иерархическим семейством, а не плоским. 2. подумайте что будет, если в эту иерархию добавляет новые классы не один программист, а хотя бы два независимых программиста. 3. подумайте как предоставить эту расширенную функциональность пользователями. и главное: а чем получившаяся конструкция по сути отличается от старых добрых конструкторов? (не считая дополнительной трудоемкости и отвалившихся перекрестных ссылок, конечно) Последний раз редактировалось mazzy; 01.06.2017 в 09:01. |
|
![]() |
#11 |
Участник
|
Цитата:
Сообщение от mazzy
![]() ...
= отдельный класс-запускач ломает систему перекрестных ссылок - теперь понять где что используется и как работает намного сложнее ... и главное: а чем получившаяся конструкция по сути отличается от старых добрых конструкторов? (не считая дополнительной трудоемкости и отвалившихся перекрестных ссылок, конечно) ... |
|
![]() |
#12 |
Участник
|
можно. можно много было чего сделать.
если всего-лишь начать думать о том, как "это" будут использовать люди. ответ получен: |
|
![]() |
#13 |
Участник
|
Да, спасибо. Думаю, что остальным тоже будет интересно:
Ответ глубоко в недрах фреймворка: Да, похоже изначально в качестве ключа предполагалось просто имя класса. Да, поддерживаются N-элементов. Пока реализовано для случая N=1. |
|
![]() |
#14 |
Участник
|
Цитата:
_baseCLassName это имя базового класса или интерфейса X++: /// <summary> /// Searches for extensions for elements. /// </summary> /// <returns> /// The search result that contains elements that match the search attribute instance[. /// </returns> public SysExtensionCacheValue search() ![]() |
|
![]() |
#15 |
Участник
|
Именно!
Внутри оно работает с именами классов. Ключ ТУПО преобразуется к именам. В текущей реализации Platform 7 ключ не имеет никакой семантики. Скрипач (отдельный ключ) не обязателен. да-да. именно во множественном числе. Последний раз редактировалось mazzy; 01.06.2017 в 11:20. |
|
![]() |
#16 |
Участник
|
Цитата:
Цитата:
собственно, как и раньше, имеем:
= эта штука работает на refleaction (со всеми вытекающими последствиями) = вместо конструктора должен быть отдельный класс-запускач (дополнительно к адаптерам, хендлерам, хандлерам, хелперам добавляется еще и strategy) Stragegy не обязательно. У тебя нет параметров в конструкторе (не путать с методом construct). Если параметры есть, достаточно добавить метод init(параметры). Цитата:
= отдельный класс-запускач ломает систему перекрестных ссылок - теперь понять где что используется и как работает намного сложнее
Цитата:
Но:
= никакой параллельности или асинхронности в фреймворке не предполагается Цитата:
= за уникальностью ключа должен следить сам программист
![]() Цитата:
= ключ - строка, с позиционными значениями (почему не аксаптовский контейнер, не xml, не json, не другой сериализуемый объект? почему не использовать имя класса в качестве ключа?)
![]() Цитата:
= вся стратегия определения ключа должна находится в одном месте - попытка сделать делегирование принятия решения о ключе приводит к возвращению к иерерхии конструкторов, только в отдельном классе.
Цитата:
Другими словами, все равно есть длинный список параметров с заданными позициями. но у них нет дефолтных значений. Та-дам!
Цитата:
А весь конструктор должен быть в одном методе. Со всеми пересечениями кода. Та-дам!
Цитата:
самое интересное, что эта штука не решает проблему подключения кода от разных производителей.
особенно, если разные производители добавлят классы с разными строками-ключами в середину иерархии. или добавят одинаковые ключи для разных классов. Цитата:
вопрос - какой? как? какова методика добавления класса в иерархию с атрибутами?
Цитата:
подумайте еще.
для дальнейшего предметного обсуждения: 1. выберите пример с иерархическим семейством, а не плоским. 2. подумайте что будет, если в эту иерархию добавляет новые классы не один программист, а хотя бы два независимых программиста. 3. подумайте как предоставить эту расширенную функциональность пользователями. Цитата:
и главное: а чем получившаяся конструкция по сути отличается от старых добрых конструкторов? (не считая дополнительной трудоемкости и отвалившихся перекрестных ссылок, конечно)
|
|
![]() |
#17 |
Участник
|
да. disclimer написан для тех, у кого уже есть подобные технологии. я извиняюсь за безумную реализацию. я просто расширил то, что есть в МС-коде. извините за этот бред.
да, примером можно продолжать пользоваться. да, это типовой пример. просто МС изначально забыл валюту в автосопоставлении. в результате стандартный код автоспосотавляет все вперемешку. обычно людям нужно автоматом сопоставлять только проводки в одной валюте. разные валюты обычно сопоставляются в специальном режиме. Цитата:
ключевое слово "сделать". если нужно "сделать", то зачем нужен какой-то левый ключ? давайте будем "сделать" сразу имя класса? и атрибутов писать не нужно. Снова приношу свои извинения за безумную реализацию от МС. Нет, у меня не нужен класс запускач. Достаточно menuItem, который подцепляется к главному меню или к формам. класс запускач нужен только для запуска класса из Visual Studio. MenuItem можно сделать стартовым объектом в VS. Но в этом месте бага - параметры menuItem при старте из VS не учитываются. Сотрудники МС не используют этот сценарий )))) Да. Нет ))) На реальных проектах простейший случай без стратегии - скорее исключение. На реальных проектах именно "стратегия" и зашита-размазана в конструкторах. Каждый конструктор отвечает за свою часть. В фреймворке один стратегия должна знать обо всех классах иерархии. Цитата:
но как часто используется именно этот сценарий? Цитата:
Сейчас в аск7 82 класса-потомка от SysExtensionIAttribute выбери любой из них, который реализует несколько уровней иерархии. Покажи как это просто. Ты говоришь "просто добавить атрибуты". Ты говоришь "просто смотреть" Сделай проектик. Покажи как это просто. вот на конструкторах по старому я сделал минут за 15 со скриншотами и написанием поста. Раз это так просто, наверняка займет меньше времени. И в самом деле! Чего это я? Видать Котлинов всяких наелся... Цитата:
Да-да. Я вижу это "что угодно". Строка с ; Это пипец и детский сад какой-то. Цитата:
Да. Согласен. Составной ключ. Содержит некие абстрактные параметры. Цитата:
Кем и как? Бгггг!! Макс, другие доказывающие - можно проектик? Цитата:
Именно. Ребяты, такое ощущение, что вы продолжаете доказывать что фреймворк работает в принципе. Да все читающие эту ветку верят что работает. Если вспомнить, исходный вопрос ветки был: "Какая цель создания экземпляров классов через расширенные атрибуты? Чем не устраивает старый дедовский способ construct?" Ребяты, прошу вас, не надо примеров "я создал пример из трех классов, я добавил атрибуты". такие примеры ничего не показывают. Давайте рассматривать нормальный промышленный случай: = есть семейство классов с несколькими уровнями иерархии = есть несколько программистов = которые добавляют/изменяют функционал этого семейства (одновременно или последовательно). в пределе это программисты разных партнеров, которые делают разные типовые решения. а некий программист заказчика ставит эти пересекающиеся типовые решения [из разных моделей]. (в целях упрощения, для данной ветки можно предположить, что модель одна, чтобы рассмотреть только механизм инстанцирования класса) = как облегчить работу этих людей? вы говорите ключи-атрибуты. Ок, пусть. Как должны выглядеть эти ключи, чтобы разные люди могли добавлять классы-потомки и не мешать друг-другу? Как должны выглядеть эти ключи, чтобы в принципе была возможность рефакторинга? (да, я знаю что МС не рефакторит, но у партнеров и у заказчика то могут работать нормальные люди) Зачем вообще нужны специальные ключи вместо имен классов? Последний раз редактировалось mazzy; 01.06.2017 в 11:14. |
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
![]() |
#18 |
Banned
|
Каждый берет по вопросу. Чур это мой
![]() 1. Ключ как внешнее имя 2. Можно менять в рантайме 3. Можно по условиям By decoupling the base class from derived classes using instances of such attributes, a developer does not modify computer program code defining the base class when adding customized extensions to that base class. The attributes can be specified at run time to specify or to alter the run time behavior of the application. This framework also allows the application to conditionally instantiate an element based on its attributes. Object extensions using attributes to decouple base classes from derived classes http://patents.justia.com/patent/9026989 |
|
![]() |
#19 |
Участник
|
Цитата:
Цитата:
Снова приношу свои извинения за безумную реализацию от МС.
Нет, у меня не нужен класс запускач. Достаточно menuItem, который подцепляется к главному меню или к формам. Цитата:
Нет )))
На реальных проектах простейший случай без стратегии - скорее исключение. На реальных проектах именно "стратегия" и зашита-размазана в конструкторах. Каждый конструктор отвечает за свою часть. Цитата:
В фреймворке один стратегия должна знать обо всех классах иерархии.
Цитата:
ты снова прав для случая без параметров.
но как часто используется именно этот сценарий? 1. Во базовый класс добавляется метод init с нжными параметрами 2. Сразу после создания он вызывается. Цитата:
выбери любой из них, который реализует несколько уровней иерархии.
Если первое, то атрибуты никак не должны эту иерархию отражать, если второе, то то есть отдельная обертка для иерархических атрибутов, которая, правдя использована неколько раз там где надо делать классы ключами. Цитата:
Покажи как это просто.
Ты говоришь "просто добавить атрибуты". Ты говоришь "просто смотреть" Сделай проектик. Покажи как это просто. ![]() Цитата:
И в самом деле! Чего это я? Видать Котлинов всяких наелся...
Цитата:
Я смотрю актуальную аксапту. 7.2.1785.0
Да-да. Я вижу это "что угодно". Строка с ; Это пипец и детский сад какой-то. Цитата:
Кем и как? Бгггг!!
Цитата:
вспомнить, исходный вопрос ветки был: "Какая цель создания экземпляров классов через расширенные атрибуты? Чем не устраивает старый дедовский способ construct?"
- путем сведения общего пттерна "case" к частному "содание по ключу" позволяет автоматически сливать изменения в коде. Цитата:
Ребяты, прошу вас, не надо примеров "я создал пример из трех классов, я добавил атрибуты". такие примеры ничего не показывают.
Цитата:
Давайте рассматривать нормальный промышленный случай:
= которые добавляют/изменяют функционал этого семейства (одновременно или последовательно). в пределе это программисты разных партнеров, которые делают разные типовые решения. а некий программист заказчика ставит эти пересекающиеся типовые решения [из разных моделей]. (в целях упрощения, для данной ветки можно предположить, что модель одна, чтобы рассмотреть только механизм инстанцирования класса) = как облегчить работу этих людей? ![]() Как раз паттерн позволяет вынести реализации каких-то веще в модели. Например в настройках можно добавить baseenum с форматомданных, а вам класс который реализует вывод в него вынести в расширение в другой модели. Цитата:
Как должны выглядеть эти ключи, чтобы разные люди могли добавлять классы-потомки и не мешать друг-другу?
Я предпочитаю привязываться к именам классов и таблиц. Цитата:
Как должны выглядеть эти ключи, чтобы в принципе была возможность рефакторинга? (да, я знаю что МС не рефакторит, но у партнеров и у заказчика то могут работать нормальные люди)
Цитата:
Зачем вообще нужны специальные ключи вместо имен классов?
Еще можно использовать сами классы в качестве ключей - посмотри SysClassNameAttribute |
|
|
За это сообщение автора поблагодарили: macklakov (10). |
Теги |
sysextension framework, sysoperation framework, как правильно, полезное |
|
|