-
Может кому пригодится https://sourceforge.net/projects/zcad/files/podgb.7z/downloadСтроит полную зависимость модулей и вычленяет из нее "циклические" зависимости. Результат выдает в виде DiGraph Classes визуализировать его можно в graphviz`е или онлайн http://www.webgraphviz.comНадписи у ребер - количество оставшихся циклических зависимостей если эту зависимость устранить. импорта проектов с делфи нет, только из лазаря, но можно выкрутится использовав File=/путь/к/проекту/*.pas;*.dpr Paths=/путь/к/проекту/ Compiler options=-Sd -Fi/путь/к/проекту/include
-
А в какая от этого практическая польза? Циклические зависимости и компилятор вполне успешно вычисляет.
-
>>А в какая от этого практическая польза? Имхо полезно при рефакторинге видеть как оно взаимодействует.
>>Циклические зависимости и компилятор вполне успешно вычисляет. Я дельфи давно невидел, емнип он раньше молча глотал циклические зависимости (те что в implementation ессно, те что в interface - ошибка). Сейчас он генерирует варнинги на это дело?
-
Сейчас он генерирует варнинги на это дело?
Не знаю. Ну пусть даже и глотает - так и что? Разве программа от этого становится хуже?
-
>>Разве программа от этого становится хуже? Лучше точно не становится)) ИМХО это показатель плохой "структурированности" Когда 2 модуля осознано "ссылаются" друг на дружку - наверно ниче страшного. А вот когда зацикливание проходит через десяток модулей - его без визуализации представить трудно, а избавится от него еще сложней.
-
zamtmn © (23.04.17 19:22) [4]
В IDE Delphi встроен анализ всяческих метрик для оценки сложности кода. (Project|QA Metrics, Project!QA Audits). Считается, что неглупые люди писали.
Одно из двух - либо аналог вашего построителя зависимостей там есть, либо эти зависимости в пень никому не уперлись и упрощать программу следует, руководствуясь другими критериями.
-
-
Игорь Шевченко >>Одно из двух - либо аналог вашего построителя зависимостей там есть Перед следующим постом потрудитесь узнать есть он там или нет. >>либо эти зависимости в пень никому не уперлись и упрощать программу следует, руководствуясь другими критериями. Критериев много, неспорю. Если вас не напрягает что программа из модульной превращается в монолитный кусок - рад за вас.
Kerk На уникальность я не претендую.
-
Kerk © (23.04.17 19:41) [6]
> Забыл самого главного их конкурента)))))
Icarus ?
Ты кстати свою штуку забросил ?
-
> Игорь Шевченко © (23.04.17 21:40) [8]
Чего это я забросил? На прошлой неделе релиз был.
-
Kerk © (23.04.17 22:48) [9]
> На прошлой неделе релиз был.
Писем давно не приходило, значит, забросил.
-
Рассылками теперь TMS занимается, не я. Возможно, ты как обладатель бесплатной лицензии не попал в базу при импорте. Я проверю :)
-
Kerk © (23.04.17 22:48) [9]
Так это у TMS release был. А старые подписчики, кто без TMS владел версией, им теперь как быть ? И заодно, если не затруднит, ссылку на what's new in this release, а то по TMS-вскому сайту я нифига не понял.
-
Удалено модератором
-
>>Kerk © (23.04.17 23:03) [11]>>Игорь Шевченко © (23.04.17 23:05) [12]>>Otrek © (24.04.17 00:01) [13]>>Удалено модератором Я на этом форуме небыл лет десять, ниче не меняется))) В порядке полезности программы: Исходников больших проектов на дельфи у меня нет, поэтому попробовал на jcl\source\common http://imgur.com/a/gijuNзачем модулям ссылаться друг на друга в implementation одновременно (пунктирные связи)? подключив в свою программу например JclMath я автоматом получу еще кучу зависимостей и чето я сомневаюсь что все они реально нужны JclMath`у
-
zamtmn © (24.04.17 14:36) [14]
В jcl с этим беда, согласен.
-
Полезной была бы вот какая фича. Иногда в программу по длинной цепочке uses попадают одновременно модули vcl и fmx. За такое хотелось бы бить по рукам, но отследить очень сложно бывает.
-
Kerk © (24.04.17 16:03) [16] Да, наверно приделаю "распознавание" к чему модуль относится по названию с "коллапсом" модулей принадлежащих чемуто одному в один "квадратик" в графе.
Также добавлю возможность "выдрать" "подграф" цепочек ссылок на определенный модуль
-
Игорь Шевченко © (24.04.17 15:46) [15] Думаю подобные "проблемные" места найдутся в большинстве больших проектов
-
>>Kerk © (24.04.17 16:03) [16]>>Полезной была бы вот какая фича. Приделал фичу в несколько переработаном виде. Добавил параметры SourceUnit и DestUnit. Указав SourceUnit - увидим связи им порожденные Указав DestUnit - увидим связи на нем заканчивающиеся - аналог предложеной тобой фичи. Указав оба параметра - увидим как связаны между собой юниты - как на приложеном скриншоте http://imgur.com/a/Nyxn1
-
А можно сделать чтобы .dproj/.dpr можно было открывать?
-
-
> zamtmn © (25.04.17 18:05) [21]
DelphiAST умеет превращать вот такой DPR: program DelphiASTDemo;
uses // FastMM4, Forms, uMainForm in 'uMainForm.pas' {MainForm}, StringUsageLogging in 'StringUsageLogging.pas';
//... end. вот в такой XML: <?xml version="1.0"?>
<UNIT line="1" col="1" name="DelphiASTDemo">
<USES begin_line="3" begin_col="1" end_line="11" end_col="1">
<UNIT line="5" col="3" name="Forms"/>
<UNIT line="6" col="3" name="uMainForm" path="uMainForm.pas"/>
<UNIT line="7" col="3" name="StringUsageLogging" path="StringUsageLogging.pas"/>
</USES>
...
</UNIT> https://github.com/RomanYankovsky/DelphiASTПод FPC должно скомпилироваться без проблем.
-
С dproj я пожалуй погорячился. Я как-то пытался с ними работать, но они отличаются от версии к версии. Геморрой, в общем :) Без особой надобности туда лучше не лезть.
-
Kerk © (25.04.17 18:50) [23]
А DProj для анализа и не нужен
-
Kerk © (25.04.17 18:37) [22]ниче там такова страшного ненадо, просто прописать главный файл, пути к остальным файлам и инклудам. Сделал совсем простецкий вариант: http://svn.shamangrad.net/zcad/trunk/other/pudgb/udpropener.pasБинарник перевыложил. После открытия dpr параметры "опции компилятора" становятся >>-Sd -Sc -dWINDOWS -dMSWINDOWS -dWIN32 -dLCLWIN32 -dFPC -dCPU32 -dLCLWIN32 -Sd - совместимость с делфи -Sc - С style operators -d - разные предефайны, их надо привести в соответствие с делфи также возможно придется добавить ручками в опции компилятора пути к инклудам в виде -FiК:\инклудам\путь\пиши\сюда >>Игорь Шевченко © (25.04.17 19:03) [24]надо для автоматической настройки путей. но всё можно и руками
-
> надо для автоматической настройки путей. но всё можно и > руками
DCC_UnitSearchPath, DCC_IncludePath
-
>>DCC_UnitSearchPath, DCC_IncludePath да, прочитать пару элементов, разматать пару макросов. Для лазаруса у меня это сделано, для Delphi нет возможности сделать
-
Kerk © (25.04.17 18:37) [22] >>DelphiAST умеет превращать вот такой DPR:
Посмотрел AST - это парсер, а не средство чтения DProj. Я использую парсер из поставки fpc, так что не подойдет
-
Добавил возможность "кластеризации" графа. Юниты расположенные по одному пути находятся внутри кластера, название кластера это путь к этим юнитам (слэши заменены на нижний прочерк изза особенностей языка графвиза) то что было на скрине [19] в "кластерном" варианте выглядит так http://imgur.com/a/Ijz08
-
Если сравнить "кластеризированую" картинку из [29] (можно и без кластеров, но это не так наглядно) c деревом наследования классов http://imgur.com/a/mzKBb то видно основную "нитку" (красная почеркушка) и понятно что от остальных связей лучше постараться избавится. От всех избавится не получится, но от помеченых 1 и 2 вполне можно. 1 - связь образована изза одной единственной глобальной переменной в модуле uzglviewareageneral и приносит столько мусора. Переместил переменную в другой модуль и готово. 2 - для избавления нужны более глобальные изменения, оставлю это на потом)) В результате без 1 получилась более-менее годная картинка http://imgur.com/a/Ggz67
-
zamtmn не пойму откуда у вас циклические зависимости. Можете приложить простой пример с 2-3 циклами.
-
Pavia © (05.05.17 12:21) [31]В [30] циклов нет, это просто структура модулей проекта. Циклы есть в [14] Самый простой пример это 2 модуля uses друг друга в секции implementation. Или например: unit Unit1;
interface
uses
Unit2;
type
TForm1 = class(TForm)
private
public
end;
var
Form1: TForm1;
implementation
end.
unit Unit2;
interface
uses
Unit3, Unit4;
implementation
end.
unit Unit3;
interface
implementation
uses
unit1;
end.
unit Unit4;
interface
implementation
uses
unit1;
end.
Дает вот такое DiGraph Classes
-
Ну и еще один довольно забавный пример использования. Я в качестве хобби делаю векторный редактор, когдато давно он для рисования использовал только opengl, потом со временем научился использовать gdi. Но остался "пропитан" opengl кодом, который я постепенно "вычщал" До недавнего времени думал что вычистил всё и остались только "неустранимые" зависимости)) Но глянув зависимости получил такой ужас: http://imgur.com/a/MpHDD красное пятно сверху - главный файл программы, красное пятно снизу справа - gl.pas посередине "пути" по которым главный файл подключает gl.pas После нескольких исправлений всё встало на свои места http://imgur.com/a/e6syAТолько 4 "неустранимых" на данный момент "зависимости": uzcreginterface - показывает в интерфейсе программы версию gl и glu uzeffttf - использует glu для триангуляции ttf символов uzeentspline - использует glu для тесселяции сплайнов uzglviewareaogl - вариант opengl рендера картинки
-
-
А как граф строили? Ручками или хитрым алгоритмом? Да я тоже от SVG не в восторге, а есть чем заменить?
-
|