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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.01.2010, 17:28   #1  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от Timofey_k Посмотреть сообщение
Поиск по тексту - это как-то не элегантно :-)
Я бы сказал, что у вас с Иваном разные подходы. Глядя на информативность 6 кликов (из них 1 двойной тратится на выделение переменной), могу сказать, что метод Ивана более информативен :
  • Перекрестные ссылки (Cross-reference)
  • Найти (Find), самое ценное — вырезки из кода:


Обычно на это уходит 12 кликов (1 двойной на выделение переменной).
Миниатюры
Нажмите на изображение для увеличения
Название: Find.png
Просмотров: 695
Размер:	14.4 Кб
ID:	5494   Нажмите на изображение для увеличения
Название: Cross-reference .png
Просмотров: 533
Размер:	13.1 Кб
ID:	5496  


Последний раз редактировалось Kabardian; 06.01.2010 в 17:44.
Старый 06.01.2010, 21:19   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Timofey_k Посмотреть сообщение
Скрип строит перекрестные ссылки для всего AOT объекта (если вызван из статического метода, то только по данному методу) и для всех его предков (если объект - класс).
Эх, еще бы и для потомков...

Цитата:
Сообщение от Kabardian Посмотреть сообщение
Я бы сказал, что у вас с Иваном разные подходы. Глядя на информативность 6 кликов (из них 1 двойной тратится на выделение переменной), могу сказать, что метод Ивана более информативен
Но может вывести ложные срабатывания. Поскольку находит вхождение в комментариях, в строках, а также в более длинных названиях переменных (Например, ищем SysDictClass, а найдет mySysDictClass и SysDictClass_Old)

Кроме того, поиск не работает в предках и потомках.
Кроме того, перекрестные ссылки дают возможность отделить места, где переменная читается, от мест, где она изменяет значение.

Поэтому насчет информативности - тут можно поспорить
__________________
полезное на axForum, github, vk, coub.
Старый 07.01.2010, 00:22   #3  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кроме того, поиск не работает в предках и потомках.
Скрипт Ивана ищет и в предках тоже -- я проверял.
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кроме того, перекрестные ссылки дают возможность отделить места, где переменная читается, от мест, где она изменяет значение.

Поэтому насчет информативности - тут можно поспорить
Ок, засчитывается ;--), 1:1.
За это сообщение автора поблагодарили: mazzy (2).
Старый 07.01.2010, 11:22   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от mazzy Посмотреть сообщение
Эх, еще бы и для потомков...


Но может вывести ложные срабатывания. Поскольку находит вхождение в комментариях, в строках, а также в более длинных названиях переменных (Например, ищем SysDictClass, а найдет mySysDictClass и SysDictClass_Old)

Кроме того, поиск не работает в предках и потомках.
Кроме того, перекрестные ссылки дают возможность отделить места, где переменная читается, от мест, где она изменяет значение.

Поэтому насчет информативности - тут можно поспорить
На самом деле, при массовом рефакторинге как раз необходимо, чтобы в результат поиска попали и комментарии, и переменные, которые называются так же, но с добавлением суффикса/префикса.

К примеру, скажем, что нам необходимо в определенном классе изменить все упоминания "ItemId" на "ProductNumber".
Врядли бы кому-то было приятно позже читать код, в котором используются только переменные productNumber, но во всех комментариях идет упоминание ItemId

Аналогично, при рефакторинге абсолютно все равно, читается из переменной значение, или изменяется.
За это сообщение автора поблагодарили: Kabardian (3).
Старый 07.01.2010, 08:50   #5  
Timofey_k is offline
Timofey_k
Microsoft Dynamics
Аватар для Timofey_k
Соотечественники
Сотрудники Microsoft Dynamics
 
20 / 50 (2) ++++
Регистрация: 04.07.2006
Адрес: Sydney, Australia
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Найти (Find), самое ценное — вырезки из кода
А с перекрестных ссылок - еще один клик и ты в самом коде на нужном месте. О других плюсах верно сказал mazzy: ложных срабатываний гораздо меньше и сразу видно где переменная объявлена, где присвоено значение и т.п.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Эх, еще бы и для потомков...
Ну вот для потомков набросал. Для корректной работы иерархия типов должна быть обновлена. Если иерархия не построена, то в AX2009 автоматом запустится ее обновление (в AX4 этого нет и надо убрать строчку).
X++:
//Show cross-references, complete or filtered by selection, for a class and its super and descendant classes
#TreeNodeSysNodeType
void addIns_CrossReferencesSelected(Editor e)
{
    xRefUpdateTmpReferences     xTmpReferences = new xRefUpdateTmpReferences();
    TreeNode                    currentNode    = TreeNode::findNode(e.path());

    SysDictClass                sysDictClass;

    Args                        formRunArgs;
    FormRun                     formRun;
    FormDataSource              fds;

    xRefTmpReferences           refTable;

    xRefName                    selectedText;
    xRefPath                    currentNodePath;

    int                         startLine = e.selectionStartLine();
    int                         startCol  = e.selectionStartCol();
    int                         endCol    = e.selectionEndCol();

    void findDescendants(classId _classId)
    {
        xRefTypeHierarchy   typeHierarchy;
        TreeNode            descendantNode;
        ;
        while select typeHierarchy
            where typeHierarchy.BaseType == Types::Class &&
                  typeHierarchy.Parent == _classId
        {
            descendantNode = new SysDictClass(typeHierarchy.Id).treeNode();
            xTmpReferences.fillTmpxRefReferences(descendantNode);

            findDescendants(typeHierarchy.Id);
        }
    }
    ;
    if (e.selectionStartLine() == e.selectionEndLine() && startCol != endCol)
    {
        e.firstSelectedLine();
        selectedText = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol-startCol));
    }

    currentNodePath = currentNode.treeNodePath();
    if (currentNode.applObjectType() != UtilElementType::ClassStaticMethod &&
        currentNode.applObjectType() != UtilElementType::TableStaticMethod)
    {
        while(! currentNode.AOTObjectNode())
        {
            currentNode = currentNode.AOTparent();
        }
    }

    xTmpReferences.fillTmpxRefReferences(currentNode);

    if (xRefTypeHierarchy::findOrCreate(Types::Class, currentNode.applObjectId()).Children) //Remove for AX4
    {
        findDescendants(currentNode.applObjectId());
    }

    while (currentNode && currentNode.sysNodeType() == #NT_CLASS)
    {
        sysDictClass = new SysDictClass(new SysDictClass(currentNode.applObjectId()).extend());
        currentNode  = sysDictClass ? sysDictClass.treeNode() : null;

        if (currentNode)
        {
            xTmpReferences.fillTmpxRefReferences(currentNode);
        }
    }

    formRunArgs = new Args(formstr(xRefTmpReferences));
    formRunArgs.parmObject(xTmpReferences);
    formRun     = classfactory.formRunClass(formRunArgs);
    formRun.init();

    if (selectedText)
    {
        refTable = xTmpReferences.allTmpxRefReferences();

        select firstonly refTable
            where refTable.line   == startLine
               && refTable.Column == startCol
               && refTable.name   == selectedText
               && refTable.Path   == currentNodePath;

        fds = formRun.dataSource();
        fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, Kind)).value(queryValue(refTable.Kind));
        fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, name)).value(queryValue(refTable.name));
        fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, ParentName)).value(queryValue(refTable.ParentName));

        formRun.design().caption(strfmt("Complete cross-reference for %1 '%2'", refTable.Kind, refTable.name));
    }

    SysUtil::editPathLogicalPos(currentNodePath, startLine, startCol); //attempt to workaround AX2009 behaviour. Remove for AX4

    formRun.run();
    formRun.detach();
}
Обнаружил пренеприятную особенность в AX2009 - при вызове xTmpReferences.fillTmpxRefReferences для какого-нибудь объекта, окно редактора с этим объектом принудительно закрывается. Пришлось тупо добавить открытие редактора в код. В AX4 это не нужно. Да и вообще есть ощущение, что этот код в AX2009 работает медленнее, чем в AX4.

Последний раз редактировалось Timofey_k; 07.01.2010 в 09:01.
Старый 07.01.2010, 12:23   #6  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от Timofey_k Посмотреть сообщение
А с перекрестных ссылок - еще один клик и ты в самом коде на нужном месте.
Суть в обзорном просмотре всех возможных вхождений в коде. Здесь еще больше чувствуется польза best-practices, особенно касательно комментариев:
Цитата:
Use // for both single and multiline (block) comments.
Используйте // для одно- и многострочных комментариев.
Не смогут вкусить всю прелесть инструмента Найти / Find те, кто использует для тех же целей конструкцию вида
X++:
/* ... */
Теги
developer tool, editor script, tools, законченный пример, инструменты, полезное, разработка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kashperuk Ivan: AxGoToDeclarationI haven't posted in a while. W... Blog bot DAX Blogs 2 07.06.2010 00:06
Kashperuk Ivan: Running a class from AOT or "How to assign a class to an action menu item?" Blog bot DAX Blogs 0 22.10.2009 20:05
Kashperuk Ivan: “Go to main table” on a RunBase dialog control Blog bot DAX Blogs 0 25.08.2009 08:05
Kashperuk Ivan: Description of ClassBuild class:Today I want to ... Blog bot DAX Blogs 0 26.01.2007 05:51
axaptafreak: AOT search within search results Blog bot DAX Blogs 0 16.11.2006 17:40
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:38.