Как визуализировать структуру проекта в MATLAB? [закрытый]



Я стал владельцем нескольких тысяч строк кода Matlab, некоторые из них как >900 линейных функций и несколько каталогов, полных function_name.m файлы. Трудно понять, что все делает (или связано) или выяснить зависимости. Что бы вы предложили для визуализации структуры функций, например, какие функции вызываются из которых и в какой последовательности?

786   7  

7 ответов:

порт для NumPy.

(шутка.)

обычно в Matlab у вас есть некоторые файлы, написанные как функции, а некоторые как скрипты. Скрипты делают такие вещи, как загрузка данных, которые вы хотите обработать, и передать их в функции, и построить график.

для организации вещей я бы начал с сценария верхнего уровня и выяснил, какие функции выполняют загрузку, графику, обработку и т. д. Храните сценарии в каталоге верхнего уровня и попытайтесь разделить функции на подкаталоги, согласно цели функции. Поместите зависимости функции в один и тот же подкаталог. Постарайтесь сделать так, чтобы код в каталоге не зависел от чего-либо в Родительском каталоге (или двоюродном каталоге).

всякий раз, когда вы выясняете, что делает функция и каковы ее аргументы, напишите комментарий к документу.

Это предполагает, что человек, который написал код, был разумным. Если нет, Matlab позволяет легко погрузить все в один каталог и иметь все зависите от всего остального в шаткой башне кода, поэтому вы можете в конечном итоге сделать много рефакторинга.

ваш код поставляется с приличным текстом справки? В таком случае, m2html будет большим подспорьем, так как он позволяет создавать связанные html-справки для удобного просмотра.

кроме того, он позволяет создавать графики зависимостей, которые помогут вам понять немного больше, как вы можете организовать код.

Мне приходилось иметь дело с этой проблемой много раз в моих различных ролях в MathWorks. Это то, что я делаю для больших кусков кода MATLAB:

  1. резервное копирование, может быть, в два раза!
  2. выберите Все, Ctrl-I для интеллектуального отступа
  3. выберите Все, Ctrl-J, чтобы обернуть комментарии

  4. Если я чувствую себя бумажным-распечатайте все файлы и получите набор маркеров-следуйте вручную, выделяя долгосрочные переменные и важные вызов функции.

~~~ И / ИЛИ ~~~

5 Если мне повезет, запустить код в отладчике, пошагово по одной строке за раз (шагая в подфункции, которые были написаны пользователем)

на этом этапе я могу пройти и следовать типичному потоку через структуру управления. Возможно, я не очень хорошо представляю, что все делает, но у меня есть приличное представление о том, что происходит.

нормально, моя цель состоит в том, чтобы найти ошибку, решите ее и двигайтесь дальше. Ваши цели могут быть совершенно разные. Это метод, который я использовал, чтобы быстро понять hundereds различных частей кода MATLAB, которые я был отправлен на протяжении многих лет.

руководство по стилю программирования MATLAB Ричард Джонсон является хорошим ресурсом.

некоторые предложения по соглашению о кодировании Matlab:

  1. используйте addpath, чтобы предотвратить захламление файлов и помочь в функциях taxnomony

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

  3. использовать файл config для включения и выключения функции

  4. обзор архитектуры установки конструкции, а также modus operandi
  5. сохраняйте файл status / readme ( относитесь к себе как к новому пользователю, как бы вы помогли сделать его легко усваиваемым как часть собственного модуля нового пользователя или часть решений? если вы вернетесь к коду через 3 месяца, чувствуя себя потерянным или неспособным отследить - что-то не так.) Мое предложение: ведите дневник, чтобы уточнить свои мысли о поддержании искусных проектов. Продолжайте совершенствовать свое искусство!
  6. для уравнений, используйте латекс для документация (и храните ее в соседней папке под названием, например. документы, убедитесь, что они легко доступны и отслеживаются - если вам нужно использовать "поиск" на вашем диске, что-то не так с управлением проектами)
  7. разбейте коды на короткие модули для локализации и более короткие коды, с меньшей прокруткой, коды будет легче отслеживать.
  8. используйте значимые переменные и имена функций (стиль java кажется хорошим, например. 'backedupDataForVerification'), не скупитесь на сокращение слова, вы будете страдать позже
  9. при проектировании, переосмыслить, если вы должны использовать функции, сценарии или OO (объектно-ориентированный)
  10. не спешите с преждевременной оптимизацией, поскольку скорость matlab не является лучшим выбором. Если вам действительно нужно, держите версию none optimized для сравнения читаемости из стороны в сторону, устранение неполадок и отладка не будут менее проклятием.
  11. всегда, всегда, всегда комментируйте свои коды. Никогда не используйте оправдание отсутствия времени, вы будете тратить больше время позднее.
  12. для дифференциации рассмотрите возможность установки нового узла для модификации кода, например. установите дерево для различения версий.

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

  14. используйте метку времени для отслеживания версий

  15. поделитесь своими кодами с кем-то еще, если им трудно поддерживать, использовать или изменять, переосмыслить, как уточнить ваш опирающийся.

Я согласен с большинством комментариев о том, что Matlab не очень поддерживает структурирование исходного кода современного программного обеспечения, но я не считаю, что слишком сложно навязать какую-то собственную структуру с небольшой дисциплиной.

Организуйте свои исходные файлы в иерархию каталогов, как вы бы исходные файлы для любой программы, написанной на другом языке программирования. Вам не нужно придерживаться иерархии, выберите свою собственную структуру, если хотите. Используйте setpath команда (или как бы это ни называлось), чтобы сказать Matlab, где искать ваши M-файлы, когда вы работаете.

познакомьтесь с инструментом MATLAB profiler, который может дать вам графики вызовов (не очень графически, больше похоже на графики вызовов gprof), который является некоторой помощью в расшифровке кода спагетти.

конечно, все наши м-файлы в репозитории, и мы обслуживаем их оттуда. Мы сохраняем частный набор инструментов на одном из наших сетевых дисков, и все пользователи могут звонить "выпущенный" код в этом наборе инструментов напрямую.

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

посмотрите на depfun() и depdir () Matlab, которые обнаруживают статические зависимости. Это может помочь вам увидеть зависимости между функциями Matlab. С помощью "depfun-toponly" для всех файлов и небольшой строки munging вы можете построить список непосредственных зависимостей и бросить его в файл GraphViz, чтобы создайте большой ориентированный график соединений вызовов вашей кодовой базы. Кластеры на графике могут быть хорошим местом для разделения кода. (EDIT: см. решение Джонаса; похоже, что m2html делает это за вас.)

Если у вас есть много возможностей для перезаписи кода, рассмотрите возможность перезаписи некоторых из кода как объектов, используя служебные классы без состояния с методами класса и частными функциями как способы упаковки связанных функций вместе и обеспечения некоторой инкапсуляции. Я работал с большие кодовые базы Matlab организованы таким образом, и все работает нормально. В классическом Matlab классы - это ваш единственный способ сделать какие-то пакеты. Я считаю, что новая система OO Matlab также поддерживает пространство имен.

Если вы не хотите конвертировать код в OO, вы можете организовать связанные функции в подкаталогах. Что помогает организовать его для просмотра исходного кода, по крайней мере.

все функции должны иметь некоторый doco в стандартном формате helptext Matlab, включая H1 линия. Если они этого не делают, придерживайтесь комментариев о том, что вы узнаете там. Затем используйте инструмент "contentsrpt" для автоматического создания файлов оглавления для классов или каталогов.

удачи.

Comments

    Ничего не найдено.