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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.12.2015, 13:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,459 / 846 (79) +++++++
Регистрация: 28.10.2006
mfp: X++ in AX7: Extension methods
Источник: http://blogs.msdn.com/b/mfp/archive/...n-methods.aspx
==============


Have you ever experienced a Microsoft provided class or table missing that vital method that would just make your life easier? If so, you might have been tempted to add it yourself using overlayering. And you surely have paid the upgrade price!

You are about to be pleased. In AX7 X++ supports extension methods, similarly to C#.

Suppose we want to add a fullName method to the DirPersonName table. Here is how you do it, without touching the DirPersonName table. Create this new class:




static class MyDirPersonName_Extension
{
static public PersonName fullName(DirPersonName _person)
{
return strFmt('%1 %2 %3', _person.FirstName, _person.MiddleName, _person.LastName);
}
}


Things to remember:

  1. The class must be postfixed with "_extension".
  2. The class must be static.
  3. The extension methods must be static.
  4. The type of the first parameter determines which type is extended.
Now you can enjoy your extension method:

DirPersonName dirPersonName;

while select dirPersonName
{
info(dirPersonName.fullName());
}


Notice:

  1. When calling extension methods, you don't provide the first parameter – that gets inferred from the instance's type.
  2. If the extension method took any additional parameters – they (of course) needs to be provided.
  3. This doesn't break encapsulation. The extension method only has access to public fields and methods on the type.


THIS POST APPLIES TO MICROSOFT DYNAMICS AX7 TECHNICAL PREVIEW; IS PROVIDED AS-IS AND CONFERS NO RIGHTS.




==============
Источник: http://blogs.msdn.com/b/mfp/archive/...n-methods.aspx
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 16.12.2015, 17:50   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
дока из c#
https://msdn.microsoft.com/ru-ru/library/bb383977.aspx

вот как подобная задача решена в Котлине
https://kotlinlang.org/docs/reference/extensions.html
Старый 17.12.2015, 12:23   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
?
Как-то вопросы возникают по этому примеру...

- Как найти в АОТ этот класс расширений учитывая что он фактически никак не привязан (или эта тема не раскрыта) к оригинальной таблице DirPersonName (название класса MyDirPersonName_Extension)

- Если кто-то перекроет этот метод на таблице (или он просто появится в следующем хот фиксе) - как это будет разруливаться? Не усложнит ли это только апгрэйд?

Я не знаком с данной концепцией в C# и сужу только по данному примеру, поэтому заранее прошу прощения за возможно глупый вопрос...
__________________
Zhirenkov Vitaly
Старый 17.12.2015, 13:12   #4  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 513 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от ZVV Посмотреть сообщение
Как-то вопросы возникают по этому примеру...

- Как найти в АОТ этот класс расширений учитывая что он фактически никак не привязан (или эта тема не раскрыта) к оригинальной таблице DirPersonName (название класса MyDirPersonName_Extension)

- Если кто-то перекроет этот метод на таблице (или он просто появится в следующем хот фиксе) - как это будет разруливаться? Не усложнит ли это только апгрэйд?

Я не знаком с данной концепцией в C# и сужу только по данному примеру, поэтому заранее прошу прощения за возможно глупый вопрос...
Рискну предположить, что так же, как и EvenHandlers в 2012, т.е. ручками открывать классы в АОТ и вбивать имя объекта, смотреть есть ли класс с _extension и уже там искать метод. Возможно будет какой то индикатор на методе указывающий на существование его в классе _extension. К слову в DEV Tools есть быстрая навигация практически к любому связанному объекту, в том числе к коду EvenHandlers, если API будет позволять, сделать подобное в 7ке не должно составить труда.

Мне кажется, что как EvenHandlers так и _extension облегчают апгрейд в случае, если логика не поменялась. Но если нужно будет менять код, то усилий потребуется побольше. К примеру у моего нынешнего клиента может быть 2-3 различных EvenHandlers на метод, т.е. что бы иметь общую картину логики в этом методе, нужно обойти все EvenHandlers и сам метод. Думаю было бы существенно проще, если бы можно было видеть сразу сам метод и весь код из EvenHandlers и _extension в редакторе.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: ZVV (2).
Старый 17.12.2015, 13:15   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ZVV Посмотреть сообщение
- Как найти в АОТ этот класс расширений учитывая что
обычно в таких случаях помогает IDE
в аксапте должны быть перекрестные ссылки. но пока через жопу.

Цитата:
Сообщение от ZVV Посмотреть сообщение
- Если кто-то перекроет этот метод на таблице (или он просто появится в следующем хот фиксе) - как это будет разруливаться? Не усложнит ли это только апгрэйд?
обычные правила для разрешения конфликтов имен между локальными и глобальными объектами: в первую очередь ищутся локальные. если их нет, то ищутся глобальные (в данном случае extension)

в ax7 я не знаю способа явно вызвать extension-функцию, если есть метод с таким именем. но должен быть.

судя по моему небольшому опыту работы с extension methods в других IDE с другими языками - не, не усложняет. IDE хорошо показывает что происходит.
За это сообщение автора поблагодарили: ZVV (2).
Старый 17.12.2015, 13:16   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Link Посмотреть сообщение
Рискну предположить, что так же, как и EvenHandlers в 2012, т.е. ручками открывать классы в АОТ и вбивать имя объекта, смотреть есть ли класс с _extension и уже там искать метод.
Да, в ax7 я не знаю другого способа. Но это были беты... Может и доделают в финальной версии.
Старый 17.12.2015, 17:05   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
С учетом того, что для класса можно написать ровно один экстеншен (так как ровно одно имя подпадает под шаблон, не как в C#) мне кажется, единственное для чего можно использовать, как мне кажется, - это для некоторых общих действий для какого-то интерфейса.
За это сообщение автора поблагодарили: mazzy (2).
Старый 17.12.2015, 17:14   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от belugin Посмотреть сообщение
ровно одно имя подпадает под шаблон
?
В статье упоминается ограничение только на окончание метода *_Extension.
Старый 17.12.2015, 17:26   #9  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 513 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от belugin Посмотреть сообщение
С учетом того, что для класса можно написать ровно один экстеншен (так как ровно одно имя подпадает под шаблон, не как в C#) мне кажется, единственное для чего можно использовать, как мне кажется, - это для некоторых общих действий для какого-то интерфейса.
Я так понимаю, что не только для класса, а для любого объекта для которого можно создать экстеншн, он может быть только в одном экземпляре. И вся суть заключается в возможности выноса кастомного кода отдельно от стандарта. У меня нет доступа к 7ке, но предположу, что в самом стандарте экстеншены не используются?
По моему опыту экстеншены будут востребованы партнерами и клиентами которые заботятся о легком апгрейде и хотят отделить свои кастомизации от стандартного кода. В целом это оправданно для каких нибудь общих методов, а для специфических решений будут и дальше использовать event handlers.

Однако вопрос удобства анализа кода размазанного по экстеншенам и event hendler остается открытым. Было бы логично иметь доступ сразу ко всему коду объекта в редакторе.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 17.12.2015, 17:33   #10  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 513 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
?
В статье упоминается ограничение только на окончание метода *_Extension.
Точно.... хм, тогда получается, что единственный индикатор принадлежности метода это первый параметр. Если нет ограничений на количество классов-расширений для объекта, из этого вытекает, что нет и ограничений на принадлежность. Т.е. в один класс-расширение можно добавить метод для любого поддерживаемого объекта. Интересно как IntelliSense знает какие методы из расширений тянуть?
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 17.12.2015, 18:22   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
?
В статье упоминается ограничение только на окончание метода *_Extension.
Извиняйте, у меня устаревшие данные.

"The name of the extension class must end with the ten-character suffix _Extension. However, there’s no restriction on the part of the name that precedes the suffix."
За это сообщение автора поблагодарили: mazzy (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
mfp: X++ in AX7: Readonly keyword Blog bot DAX Blogs 3 15.12.2015 18:22
mfp: X++ in AX7: Client/Server keywords Blog bot DAX Blogs 23 15.12.2015 09:09
mfp: X++ in AX7: Static event subscription Blog bot DAX Blogs 0 11.12.2015 11:11
mfp: X++ in AX7: The var keyword Blog bot DAX Blogs 43 04.12.2015 10:19
mfp: X++ in AX7 Blog bot DAX Blogs 0 02.12.2015 22:13
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:55.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.