Конференция "Прочее" » Диаграмма зависимостей модулей на паскале
 
  • zamtmn © (23.04.17 18:22) [0]
    Может кому пригодится https://sourceforge.net/projects/zcad/files/podgb.7z/download
    Строит полную зависимость модулей и вычленяет из  нее "циклические" зависимости.
    Результат выдает в виде
    DiGraph Classes {
    edge [style=solid]
    EnvironmentOpts_37_0 -> EditorToolbarStatic_14_1 [label=13]
    edge [style=dotted]
    EditorToolbarStatic_14_1 -> EnvironmentOpts_37_0 [label=13]
    edge [style=solid]
    ConvertDelphi_43_0 -> ConvertSettings_26_1 [label=14]
    edge [style=solid]
    ConvertDelphi_43_0 -> ConvCodeTool_23_0 [label=14]
    edge [style=solid]
    ConvertDelphi_43_0 -> MissingPropertiesDlg_36_0 [label=9]
    edge [style=solid]
    ConvertDelphi_43_0 -> UsedUnits_20_0 [label=14]
    edge [style=dotted]
    ConvertSettings_26_1 -> ConvertDelphi_43_0 [label=2]
    edge [style=solid]
    ConvCodeTool_23_0 -> ConvertSettings_26_1 [label=9]
    edge [style=solid]
    MissingPropertiesDlg_36_0 -> ConvertSettings_26_1 [label=14]
    edge [style=solid]
    MissingPropertiesDlg_36_0 -> ConvCodeTool_23_0 [label=14]
    edge [style=solid]
    MissingPropertiesDlg_36_0 -> FormFileConv_12_0 [label=13]
    edge [style=solid]
    MissingPropertiesDlg_36_0 -> UsedUnits_20_0 [label=14]
    edge [style=solid]
    FormFileConv_12_0 -> ConvCodeTool_23_0 [label=13]
    edge [style=solid]
    UsedUnits_20_0 -> ConvCodeTool_23_0 [label=14]
    edge [style=solid]
    UsedUnits_20_0 -> ConvertSettings_26_1 [label=14]
    }


    визуализировать его можно в graphviz`е или онлайн http://www.webgraphviz.com
    Надписи у ребер - количество оставшихся циклических зависимостей если эту зависимость устранить. импорта проектов с делфи  нет, только из лазаря, но можно выкрутится использовав
    File=/путь/к/проекту/*.pas;*.dpr
    Paths=/путь/к/проекту/
    Compiler options=-Sd -Fi/путь/к/проекту/include
  • Юрий Зотов © (23.04.17 18:32) [1]
    А в какая от этого практическая польза? Циклические зависимости и компилятор вполне успешно вычисляет.
  • zamtmn © (23.04.17 18:38) [2]
    >>А в какая от этого практическая польза?
    Имхо полезно при рефакторинге видеть как оно взаимодействует.

    >>Циклические зависимости и компилятор вполне успешно вычисляет.
    Я дельфи давно невидел, емнип он раньше молча глотал циклические зависимости (те что в implementation ессно, те что в interface - ошибка). Сейчас он генерирует варнинги на это дело?
  • Юрий Зотов © (23.04.17 19:16) [3]
    Сейчас он генерирует варнинги на это дело?

    Не знаю. Ну пусть даже и глотает - так и что? Разве программа от этого становится хуже?
  • zamtmn © (23.04.17 19:22) [4]
    >>Разве программа от этого становится хуже?
    Лучше точно  не становится))
    ИМХО это показатель плохой "структурированности"
    Когда 2 модуля осознано "ссылаются" друг на дружку - наверно ниче страшного. А вот когда зацикливание проходит через десяток модулей - его без визуализации представить трудно, а избавится от него еще сложней.
  • Игорь Шевченко © (23.04.17 19:28) [5]
    zamtmn ©   (23.04.17 19:22) [4]

    В IDE Delphi встроен анализ всяческих метрик для оценки сложности кода.
    (Project|QA Metrics, Project!QA Audits). Считается, что неглупые люди писали.

    Одно из двух - либо аналог вашего построителя зависимостей там есть, либо эти зависимости в пень никому не уперлись и упрощать программу следует, руководствуясь другими критериями.
  • Kerk © (23.04.17 19:41) [6]
    Вот такая еще есть
    http://www.easy-ip.net/delphi-unit-dependency-scanner.html


    > Игорь Шевченко ©   (23.04.17 19:28) [5]

    Забыл самого главного их конкурента)))))
  • zamtmn © (23.04.17 20:04) [7]
    Игорь Шевченко
    >>Одно из двух - либо аналог вашего построителя зависимостей там есть
    Перед следующим постом потрудитесь узнать есть он там или нет.
    >>либо эти зависимости в пень никому не уперлись и упрощать программу следует, руководствуясь другими критериями.
    Критериев много, неспорю. Если вас не напрягает что программа из модульной превращается в монолитный кусок - рад за вас.

    Kerk
    На уникальность я не претендую.
  • Игорь Шевченко © (23.04.17 21:40) [8]
    Kerk ©   (23.04.17 19:41) [6]


    > Забыл самого главного их конкурента)))))


    Icarus ?

    Ты кстати свою штуку забросил ?
  • Kerk © (23.04.17 22:48) [9]

    > Игорь Шевченко ©   (23.04.17 21:40) [8]

    Чего это я забросил? На прошлой неделе релиз был.
  • Игорь Шевченко © (23.04.17 23:02) [10]
    Kerk ©   (23.04.17 22:48) [9]


    > На прошлой неделе релиз был.


    Писем давно не приходило, значит, забросил.
  • Kerk © (23.04.17 23:03) [11]
    Рассылками теперь TMS занимается, не я. Возможно, ты как обладатель бесплатной лицензии не попал в базу при импорте. Я проверю :)
  • Игорь Шевченко © (23.04.17 23:05) [12]
    Kerk ©   (23.04.17 22:48) [9]

    Так это у TMS release был. А старые подписчики, кто без TMS владел версией, им теперь как быть ?
    И заодно, если не затруднит, ссылку на what's new in this release, а то по TMS-вскому сайту я нифига не понял.
  • Otrek © (24.04.17 00:01) [13]
    Удалено модератором
  • zamtmn © (24.04.17 14:36) [14]
    >>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`у
  • Игорь Шевченко © (24.04.17 15:46) [15]
    zamtmn ©   (24.04.17 14:36) [14]

    В jcl с этим беда, согласен.
  • Kerk © (24.04.17 16:03) [16]
    Полезной была бы вот какая фича. Иногда в программу по длинной цепочке uses попадают одновременно модули vcl и fmx. За такое хотелось бы бить по рукам, но отследить очень сложно бывает.
  • zamtmn © (24.04.17 19:21) [17]
    Kerk ©   (24.04.17 16:03) [16]
    Да, наверно приделаю "распознавание" к чему модуль относится по названию с "коллапсом" модулей принадлежащих чемуто одному в один "квадратик" в графе.

    Также добавлю возможность "выдрать" "подграф" цепочек ссылок на определенный модуль
  • zamtmn © (24.04.17 19:22) [18]
    Игорь Шевченко ©   (24.04.17 15:46) [15]
    Думаю подобные "проблемные" места найдутся в большинстве больших проектов
  • zamtmn © (25.04.17 15:22) [19]
    >>Kerk ©   (24.04.17 16:03) [16]
    >>Полезной была бы вот какая фича.
    Приделал фичу в несколько переработаном виде. Добавил параметры SourceUnit и DestUnit.
    Указав SourceUnit - увидим связи им порожденные
    Указав DestUnit - увидим связи на нем заканчивающиеся - аналог предложеной тобой фичи.
    Указав оба параметра - увидим как связаны между собой юниты - как на приложеном скриншоте

    http://imgur.com/a/Nyxn1
  • Kerk © (25.04.17 17:47) [20]
    А можно сделать чтобы .dproj/.dpr можно было открывать?
  • zamtmn © (25.04.17 18:05) [21]
    Можно, если ктонибудь сделает чето аналогичное http://svn.shamangrad.net/zcad/trunk/other/pudgb/ulpiimporter.pas для .dproj/.dpr
    только у меня дельфи нет))
  • Kerk © (25.04.17 18:37) [22]

    > 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 должно скомпилироваться без проблем.
  • Kerk © (25.04.17 18:50) [23]
    С dproj я пожалуй погорячился. Я как-то пытался с ними работать, но они отличаются от версии к версии. Геморрой, в общем :) Без особой надобности туда лучше не лезть.
  • Игорь Шевченко © (25.04.17 19:03) [24]
    Kerk ©   (25.04.17 18:50) [23]

    А DProj для анализа и не нужен
  • zamtmn © (25.04.17 19:55) [25]
    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]
    надо для автоматической настройки путей. но всё можно и руками
  • Игорь Шевченко © (25.04.17 21:58) [26]

    > надо для автоматической настройки путей. но всё можно и
    > руками


    DCC_UnitSearchPath, DCC_IncludePath
  • zamtmn © (25.04.17 22:07) [27]
    >>DCC_UnitSearchPath, DCC_IncludePath
    да, прочитать пару элементов, разматать пару макросов. Для лазаруса у меня это сделано, для Delphi нет возможности сделать
  • zamtmn © (28.04.17 11:08) [28]
    Kerk ©   (25.04.17 18:37) [22]
    >>DelphiAST умеет превращать вот такой DPR:

    Посмотрел AST - это парсер, а не средство чтения DProj. Я использую парсер из поставки fpc, так что не подойдет
  • zamtmn © (03.05.17 20:30) [29]
    Добавил возможность "кластеризации" графа. Юниты расположенные по одному пути находятся внутри кластера, название кластера это путь к этим юнитам (слэши заменены на нижний прочерк изза особенностей языка графвиза) то что было на скрине [19] в "кластерном" варианте выглядит так http://imgur.com/a/Ijz08
  • zamtmn © (04.05.17 00:44) [30]
    Если сравнить "кластеризированую" картинку из [29] (можно и без кластеров, но это не так наглядно) c деревом наследования классов http://imgur.com/a/mzKBb то видно основную "нитку" (красная почеркушка) и понятно что от остальных связей лучше постараться избавится. От всех избавится не получится, но от помеченых 1 и 2 вполне можно.
    1 - связь образована изза одной единственной глобальной переменной в модуле uzglviewareageneral и приносит столько мусора. Переместил переменную в другой модуль и готово.
    2 - для избавления нужны более глобальные изменения, оставлю это на потом))
    В результате без 1 получилась более-менее годная картинка http://imgur.com/a/Ggz67
  • Pavia © (05.05.17 12:21) [31]
    zamtmn не пойму откуда у вас циклические зависимости. Можете приложить простой пример с 2-3 циклами.
  • zamtmn © (05.05.17 21:36) [32]
    Pavia ©   (05.05.17 12:21) [31]
    В [30] циклов нет, это просто структура модулей проекта.
    Циклы есть в [14] Самый простой пример это 2 модуля uses друг друга в секции implementation.

    Или например:
    unit Unit1;

    {$mode objfpc}{$H+}

    interface

    uses
     Unit2;

    type
     TForm1 = class(TForm)
     private

     public

     end;

    var
     Form1: TForm1;

    implementation

    {$R *.lfm}

    end.


    unit Unit2;

    {$mode objfpc}{$H+}

    interface

    uses
     Unit3, Unit4;

    implementation

    end.



    unit Unit3;

    {$mode objfpc}{$H+}

    interface

    implementation
    uses
     unit1;

    end.



    unit Unit4;

    {$mode objfpc}{$H+}

    interface

    implementation
    uses
     unit1;

    end.




    Дает вот такое
    DiGraph Classes {
    edge [style=solid]
    Unit1_1_0 -> Unit2_2_0
    edge [style=solid]
    Unit2_2_0 -> Unit3_1_1
    edge [style=solid]
    Unit2_2_0 -> Unit4_1_1
    edge [style=dotted]
    Unit3_1_1 -> Unit1_1_0
    edge [style=dotted]
    Unit4_1_1 -> Unit1_1_0
    }

  • zamtmn © (15.05.17 09:51) [33]
    Ну и еще один довольно забавный пример использования.
    Я в качестве хобби делаю векторный редактор, когдато давно он для рисования использовал только 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 рендера картинки
  • zamtmn © (23.05.17 00:02) [34]
    Попытался сделать самостоятельную отрисовку графа http://imgur.com/a/yQ0tl
    Сделал вывод что svg отстойный формат((
  • Pavia © (23.05.17 00:09) [35]
    А как граф строили? Ручками или хитрым алгоритмом?
    Да я тоже от SVG не в восторге, а есть чем заменить?
  • zamtmn © (23.05.17 00:34) [36]
    svg файл с графом получен от графвиза.
    В общем случае - хз. Конкретно в данном случае все альтернативы тут http://www.graphviz.org/doc/info/output.html
 
Конференция "Прочее" » Диаграмма зависимостей модулей на паскале
Есть новые Нет новых   [118642   +46][b:0][p:0.003]