|
![]() |
#1 |
Участник
|
Цитата:
1. Если удаление префикса не приводит к дублированию имен, то удаляем префикс 2. Если удаление префикса приводит к дублированию имен, то 2.1. Переносим префикс в конец имени делая из него суффикс 2.2. Сообщаем пользователю о возникшей коллизии, чтобы он пересмотре логику использования данного объекта ============================ Вообще-то, насколько я понимаю, в самом общем виде задача ставится так: как переименовать объект, чтобы все ссылки на него также переименовались. Как мне кажется, в общем случае, полностью автоматическими средствами этого не сделать. Далеко не все ссылки на объект можно изменить автоматически. Например, в коде метода. Т.е., в общем случае, часть ссылок будет переименована автоматически, но останется некая часть, которую придется выискивать и переименовывать вручную. Вопрос только в пропорциях. Лично я сделал бы следующее: 1) Перекрестные ссылки. Где используется объект. 2) Поиск по тексту внутри методов на случай, например, прямых SQL-запросов к серверу или обращение через _args.caller() 3) Дополнительный Job для поиска по свойствам, которые не учитываются в перекрестных ссылках и не могут быть найдены по тексту метода или средствами стандартного поиска (не знаю, FormRef, например, стандартный поиск найдет?) Фиксирую все найденные места использования. Переименовываю объект и повторяю цикл для нового имени. Далее сравниваю полученные списки использования и вручную корректирую те места, где "автомат" не справился. ========================== Возможно, лучшей стратегией было бы дать умереть таким объектам своей смертью. Т.е. создавать новые объекты и переливать в них данные из старых. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#2 |
Участник
|
Цитата:
Цитата:
Цитата:
у меня конечно были надежды на синтаксическое переименование... но что-то мне совсем не понравилось как оно работает. может чего не понимаю. Цитата:
Цитата:
Сообщение от Владимир Максимов
![]() Лично я сделал бы следующее:
1) Перекрестные ссылки. Где используется объект. 2) Поиск по тексту внутри методов на случай, например, прямых SQL-запросов к серверу или обращение через _args.caller() 3) Дополнительный Job для поиска по свойствам, которые не учитываются в перекрестных ссылках и не могут быть найдены по тексту метода или средствами стандартного поиска (не знаю, FormRef, например, стандартный поиск найдет?) Поиск - только расширенный по свойствам, а не по методам. Вручную?! Цитата:
В принципе я склоняюсь к этому же. Но все равно - может быть есть какой-то пакетный способ? Вдруг таки есть серебряная пуля, которая позволит "полтора ведра зелена вина одним махом"? Цитата:
Она всего лишь одна из баз. Связанная с кучей сервисов. |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Возможно, лучшей стратегией было бы дать умереть таким объектам своей смертью. Т.е. создавать новые объекты и переливать в них данные из старых.
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#4 |
Administrator
|
Вообще-то я больше склоняюсь к мысли Владимира Максимова:
Цитата:
Сообщение от Владимир Максимов
![]() 1) Перекрестные ссылки. Где используется объект.
2) Поиск по тексту внутри методов на случай, например, прямых SQL-запросов к серверу или обращение через _args.caller() 3) Дополнительный Job для поиска по свойствам, которые не учитываются в перекрестных ссылках и не могут быть найдены по тексту метода или средствами стандартного поиска (не знаю, FormRef, например, стандартный поиск найдет?) В п.2 конечно неплохо добавить еще использование [Sys]Dict* классов и вариантов тупого прописывания названия объектов в коде обычным текстом. Еще есть момент. Была у меня таблица DEV_SuperTable. Хочу ее переименовать в (к примеру) LedgerSuperTable. Очевидно, что я должен переименовать попутно: 1. Форму DEV_SuperTable (если есть). Необязательно, но по-хорошему - я должен переименовать все датасорсы (помимо исправления ссылок), чтобы на таблицу LedgerSuperTable не указывал датасорс DEV_SuperTable. Это потянет изменение в коде ссылок на этот датасорс. 2. Пункт меню DEV_SuperTable (если есть, причем - если я его не переименую - у меня могут быть проблемы при переходе к основной таблице). В самом пункте меню еще нужно изменить ссылку на форму 3. Теперь надо не забыть про сложные составные имена. Типа DEV_SuperPuperTable и DEV_SuperNotPuperTable. А также про DEV_LedgerSuperTable. Надо решить - как их нужно будет переименовывать Надеюсь - названия таблиц/полей не используются в хранимых процедурах, ОЛАП-кубах/отчетах, Reporting Services и прочих сторонних системах (кстати - ужас - на что толкает нас МС - отказ от использования перекрестных ссылок - т.к. внешние использования таблиц/полей, а теперь еще и Query в Visual Studio - естественно не будут учтены перекрестными ссылками) Поэтому - я наверное склоняюсь к правилу 20/80. Т.е. переименовать 80% объектов за 20% усилий. Просто пойти по перекрестным ссылкам. Если объект можно переименовать (проверяется возможность создания объекта в АОТ с таким именем) - то согласно перекрестным ссылкам переименовать объект и ссылки на него. Без заморочек с датасорсами и сложными названиями. Дальше вывести - список - чего осталось. Оценить масштабы бедствия. Что-то действительно руками (возможно) быстрее сделать. Масштабы бедствия не должны быть большими - иначе бы функциональность перекрестных ссылок была бы не показательна. Также вряд ли будет много пересечений со штатным функционалом. Обычно пересечения могут быть на наиболее используемых таблицах типа InventTable, Может даже InventTrans. Но вряд ли напишут "свой" класс с названием типа AddressEngineKernelInternational_RU. Еще можно датасорсы переименовать. Но это уже следует делать вторым проходом - когда уже переименованы сами объекты. Тут нужно не забыть "прошерстить" все контролы на форме и все обращения типа DEV_SuperTable_ds, DEV_SuperTable_q, DEV_SuperTable_qr
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#5 |
Участник
|
Цитата:
Сообщение от sukhanchik
![]() Еще есть момент. Была у меня таблица DEV_SuperTable. Хочу ее переименовать в (к примеру) LedgerSuperTable. Очевидно, что я должен переименовать попутно:
1. Форму DEV_SuperTable (если есть). .... 2. Пункт меню DEV_SuperTable ... 3. Теперь надо не забыть про сложные составные имена. Типа DEV_SuperPuperTable и DEV_SuperNotPuperTable. ... Предположим - у нас есть план переименования (какая-нибудь таблица, где однозначно сопоставлено старое имя объекта и новое) Как выполнить переименование? Хотя... Щас писал и подумал... А ведь если у нас есть таблица соответствий, то в ней можно и дубли отследить. ДО переименования. А затем выполнить замену в текстовом файле... Мысль интересная. |
|
![]() |
#6 |
Administrator
|
Ээээ а ведь так и штатный апгрейд 3.0 -> 4.0 по выравниванию полей проходил. Т.е. составлялся список полей к выравниванию, после чего производилось выравнивание.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#7 |
Участник
|
Цитата:
![]() Цитата:
Часть таблиц - синхронизируется автоматически, см. \Classes\Application\syncApplTables, вызываемый в \Classes\Application\new. А еще вроде таблицы синхронизируются перед сравнением, вызываемым из формы импорта проектов. Цитата:
PS. Вспоминаются давнишние рассуждения касаемо дефрагментации RecId (в частности, эти) - мне кажется, между этими задачами, если не вдаваться в технические детали, довольно много общего... |
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от gl00mie
![]() Снова хочется вспомнить статью Джоэла Спольски "Где грязь, там и деньги" (цитировалась тут). Нет у этой сложной задачи простого и ясного решения - нужно повозиться, найти все "частные случаи" - тогда, может, появится полуэвристическая методика, которая, впрочем, не факт что будет работать на 100% в других условиях. За эту "возню в грязи" клиент и платит деньги
![]() И давай не будем путать сложные задачи с нерешаемыми задачами. То, что задача сложная - вовсе не означает, что с ней надо возится бессистемно. Вернемся таки к методике. Похоже она таки есть. И сводится к замене в текстовом XPO-файле. Предлагаю на обсуждение черновой вариант: 0. Подготовительная фаза 0.1. выгружаем строки из формы Пути к объектам в Excel-таблицу (со слоями) 0.2. отделяем пути от названия объектов 0.3. в Excel копируем названия объектов во вторую колонку 0.4. [опционально] оставляем только строчки с названиями объектов, которые могут быть переименованы (изо всех слоев, все названия). Например, оставляем (названия форм, датасорсов, методов), названия (таблиц, полей, групп, индексов), названия menuItem и т.п. Убираем label, documentation, контролы внутри форм, элементы внутри enum и т.п. 1. план переименования 1.1. во второй колонке Excel проводим черновое переименование объектов 1.2. во второй колонке Excel формулой находим возможные (с учетом путей) конфликты, дубликаты 1.3. разрешаем конфликты, вводя суфиксы или сохраняя префиксы 1.4. повторяем 1.1-1.4 пока не будут разрешены все конфликты переименования 1.5. в результате получили план переименования: в большинстве объектов префиксы будут удалены, но в некоторых объектах названия изменятся более сложным образом 2. Исполнительная фаза (воможен алгоритм от lev) 2.1. выгружаем слой в XPO 2.2. переименовываем согласно плана переименования (переименовываются как свойства, так и строки кода). Можно выполнять как вручную, так и с помощью каких-нибудь интеллектуальных макросов (типа Emacs). Можно и программку написать 2.3. загружаем измененный XPO 2.4. если во время загрузки получаем конфликты, возвращаемся на шаг 1.1. 3. Проверка 3.1. проводим глобальную компиляцию с уровнем детализации = 4 и со включением заранее выбранного набора рекомендаций. 3.2. если компиляция выдала ошибки и/или рекомендации - разбираемся с ними (возможно возвращаясь на шаг 1.1) примерно так. т.е. все-таки работаем с текстовым XPO. но не механически, а на основании заранее подготовленного плана. инструменты: = excel = xpo = какой-нибудь продвинутый текстовый редактор, который умеет делать массовую замену по плану (текстовый файл) |
|
|
За это сообщение автора поблагодарили: lev (2). |
![]() |
#9 |
Участник
|
Хм, речь ведь о xRefPaths?.. к слову, я себе для облегчения перехода на новые SP/версии приделал показ самого верхнего слоя в xRefPaths, чтобы можно было отделить ссылки, ведущие к модификациям, от стандартного приложения, щас выложу... А еще можно подцепить xRefNames и взять оттуда для каждого уникального имени идентификатор, тип, название родительского объекта...
Цитата:
Сообщение от mazzy
![]() 0.2. отделяем пути от названия объектов
0.3. в Excel копируем названия объектов во вторую колонку 0.4. [опционально] оставляем только строчки с названиями объектов, которые могут быть переименованы (изо всех слоев, все названия). Например, оставляем (названия форм, датасорсов, методов), названия (таблиц, полей, групп, индексов), названия menuItem и т.п. Цитата:
Сообщение от mazzy
![]() 2. Исполнительная фаза
2.1. выгружаем слой в XPO 2.2. переименовываем согласно плана переименования (переименовываются как свойства, так и строки кода). Можно выполнять как вручную, так и с помощью каких-нибудь интеллектуальных макросов (типа Emacs). Можно и программку написать У меня лично был такой "опыт" простого текстового переименования. 3-ка, как выяснилось, допускает использование в именах объектов приложения (как минимум методов) ту же кириллицу. Такой код прекрасно работает, пока не начинаешь пытаться запустить его на 2009-й - та резонно ругается при компиляции на чужеродные символы, а когда их заменяешь, начинает ругаться на код, в котором остались ссылки на названия с кириллицей. Одному разработчику это надоело, и он прошелся поиском-и-заменой, перебив в существенной части кода русскую строчную "с" на латинскую заглавную "C" (а, может, забыл включить учет регистра), в результате чего код-то изменился, но изменились также обширные написанные на русском комментарии, которые стали выглядеть м... "страшненько" ![]() Последний раз редактировалось gl00mie; 28.10.2010 в 09:44. |
|
![]() |
#10 |
Участник
|
Когда-то делал такое, но без такой мегасистемы. Возможно, так на так и выйдет по времени.
Тк предпочитаю "чувствовать" код, а для этого его нужно читать и ручками холить и лееять. Итого алгоритм свелся к 1. выгрузить все в ХРО 2. Нотпад+ с УТФ поддержкой - Ктрл-R с не "заменить все", а с поштучной заменой, а то может найти не то по вхождениям. При этом шаг с ехелей и что на что - на бумажке или в голове 3. закачать все обратно - если там Глобал, Инфо и Апликатионс с Класс фактори не убиты, то проблем нет 4. Глоб компил и далее ходим и правим, че отвалилось (тут нужно иметь свой набор полезных тулов, тк на стандарте одни переходы через второй уровень поп-ап меню по ПКМ заколебет) На большом слое (ХРО за 60мб) такая процедура заминаем 1-2 дня одного человека (с опытом подъема на слои, у которого реальный норматив 10-15мин на элемент в среднем) Может даже и меньше занять по времени, но потом с чувством выполненного долга этот чел будет пинать балду, тк нервное напряжение сил и внимательность к мелочам утомляют. А обсуждать это дольше чем делать.... как-то не практично ![]() Но да, "семь раз отмерь - один раз закодь" - только у нас же не кирпичи, нам стену потом не ломать, что б на 50см сдвинуть, это все же строчки текста (хотя по времени равносильно может быть и по усталости исполнителя, но расходники не тратятся впустую). Касательно ХРО - пока он в текстовом файле, а от версии к версии сравнение АХ все хромает и хромает (когда ж элементы формы будут стрелками тягаться со свойствами и прочие прелести), то я лично пришел к тому, что для переноса ах4-фх2009 было пользительно пользовать вообще сравнение текстовых файлов (кодерские тулзы с подстветкой синтаксиса) - так можно кликами (или Алт + стрелочки) тягать код и свойства. Не всегда это быстрее сравнилки АХ, но по некоторым элементам дает прирост во времени в разы. Опять же не восстанавливать форму (а по сути кодя ее с нуля), а именно объединять код было-стало. |
|
![]() |
#11 |
Участник
|
Да, конечно.
про удаление, (не) синхронизацию и шаманство с базой - понял. Да Цитата:
Ага. Подумав хорошенько понял, что, в принципе, можно выгрузить и любым другим образом. Например, программно пробегаясь по дереву AOT при помощи TreeNode. Поэтому способ получения списка остается на усмотрение исполнителя-программиста. Как ему удобнее, пусть так и получает. Главное - получить полный список объектов, которые могут влиять на переименование. Цитата:
Цитата:
Не, "в голове" не надо. В том то и дело, что хочется найти методику, которая позволяет: = распределить работу между несколькими людьми = проконтролировать процесс исполнения = убедиться что выполнено все (ничего не забыто) Цитата:
тягаются. alt+стрелки. |
|