|
![]() |
#1 |
Талантливый разгвоздяй
|
Я бы сказал, что у вас с Иваном разные подходы. Глядя на информативность 6 кликов (из них 1 двойной тратится на выделение переменной), могу сказать, что метод Ивана более информативен
![]()
Обычно на это уходит 12 кликов (1 двойной на выделение переменной). Последний раз редактировалось Kabardian; 06.01.2010 в 17:44. |
|
![]() |
#2 |
Участник
|
Цитата:
Цитата:
Кроме того, поиск не работает в предках и потомках. Кроме того, перекрестные ссылки дают возможность отделить места, где переменная читается, от мест, где она изменяет значение. Поэтому насчет информативности - тут можно поспорить ![]() |
|
![]() |
#3 |
Талантливый разгвоздяй
|
Скрипт Ивана ищет и в предках тоже -- я проверял.
Ок, засчитывается ;--), 1:1. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#4 |
Участник
|
Цитата:
Сообщение от mazzy
![]() Эх, еще бы и для потомков...
Но может вывести ложные срабатывания. Поскольку находит вхождение в комментариях, в строках, а также в более длинных названиях переменных (Например, ищем SysDictClass, а найдет mySysDictClass и SysDictClass_Old) Кроме того, поиск не работает в предках и потомках. Кроме того, перекрестные ссылки дают возможность отделить места, где переменная читается, от мест, где она изменяет значение. Поэтому насчет информативности - тут можно поспорить ![]() К примеру, скажем, что нам необходимо в определенном классе изменить все упоминания "ItemId" на "ProductNumber". Врядли бы кому-то было приятно позже читать код, в котором используются только переменные productNumber, но во всех комментариях идет упоминание ItemId Аналогично, при рефакторинге абсолютно все равно, читается из переменной значение, или изменяется. |
|
|
За это сообщение автора поблагодарили: Kabardian (3). |
![]() |
#5 |
Microsoft Dynamics
|
А с перекрестных ссылок - еще один клик и ты в самом коде на нужном месте. О других плюсах верно сказал 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(); } Последний раз редактировалось Timofey_k; 07.01.2010 в 09:01. |
|
![]() |
#6 |
Талантливый разгвоздяй
|
Цитата:
Цитата:
Use // for both single and multiline (block) comments.
Используйте // для одно- и многострочных комментариев. X++: /* ... */ |
|
Теги |
developer tool, editor script, tools, законченный пример, инструменты, полезное, разработка |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|