如何在MATLAB中可视化项目结构?

时间:2010-02-24 14:20:14

标签: matlab refactoring visualization

我已经拥有数千行Matlab代码,有些作为> 900行函数和一些充满function_name.m文件的目录。很难弄清楚一切正在做什么(或与之相关)或找出依赖关系。您可以建议将函数结构可视化,例如从哪个函数调用哪些函数以及按什么顺序调用?

7 个答案:

答案 0 :(得分:44)

Port to NumPy。

(笑话。)

通常在Matlab中,您将一些文件编写为函数,一些文件作为脚本编写。脚本执行的操作包括加载要处理的数据,并将其提供给函数,并对其进行绘图。

要组织一些事情,我将从顶级脚本开始,找出哪些函数进行加载,绘图,处理等。将脚本保存在顶级目录中,并尝试将这些函数分离到子目录中,根据功能的目的。将函数的依赖项放入同一子目录中。尝试使目录中的代码不依赖于父目录(或表兄弟目录)中的任何内容。

每当你弄清楚函数的功能及其参数是什么时,写一个doc注释。

这假设编写代码的人是合理的。如果没有,Matlab可以很容易地把所有东西都放到一个目录中,让所有东西都依赖于摇摇晃晃的代码塔中的其他东西,所以你最终可能会进行大量的重构。

答案 1 :(得分:14)

您的代码是否附带了不错的帮助文字?在这种情况下,m2html将是一个很好的帮助,因为它允许您创建链接的HTML帮助以便于浏览。

此外,它允许您创建依赖图,这有助于您更好地了解组织代码的方式。

答案 2 :(得分:13)

我在The MathWorks的各种角色中不得不多次处理这个问题。这就是我为MATLAB代码所做的大事:

  1. 备份,也许两次!
  2. 全选,Ctrl-I为智能缩进
  3. 全选,Ctrl-J包装评论

  4. 如果我感觉基于纸张 - 打印出所有文件,并获得一组荧光笔 - 手动关注,突出显示长期变量和重要的函数调用。

  5. ~~~ AND / OR ~~~

    5如果我感到幸运,请开始在调试器中运行代码,逐步完成 一次一行(进入用户编写的子功能)

    此时,我可以通过控制结构跟踪典型的流程。我可能不知道一切都做了什么,但我对正在发生的事情有一个很好的了解。

    通常,我的目标是找到一个错误,解决它并继续前进。你的目标可能完全不同。这是我用来快速理解多年来发送的不同MATLAB代码片段的方法。

答案 3 :(得分:7)

理查德约翰逊的

MATLAB Programming Style Guidelines是一个很好的资源。

答案 4 :(得分:7)

关于Matlab编码约定的一些建议:

  1. 使用addpath避免文件混乱并协助函数taxnomony

  2. 分解功能脚本的section_或为条件运行设置,这也有助于插件/输出模块和重用或代码引用。

  3. 使用配置文件打开和关闭选项

  4. 概述了构造的架构设置,以及运作方式
  5. 保留状态/自述文件(将自己视为新用户,如果您回到代码3,您将如何协助将其作为新用户自己的模块或部分解决方案的一部分进行无缝兼容?几个月后感到迷茫或无法追查 - 有些事情是错误的。)我的建议是:记录日记以改进你对维持巧妙项目的想法。继续完善你的艺术!
  6. 对于方程式,使用乳胶作为文档(并将其保存在附近的文件夹中,例如文档,确保它们易于访问和跟踪 - 如果您必须在驱动器上使用'搜索',项目管理有问题)
  7. 将代码分解为短模块,用于本地化和更短的代码,滚动更少,代码更容易跟踪。
  8. 使用有意义的变量和函数名称(java风格似乎很好,例如'backupUPDataForVerification'),不要限制缩短单词,你以后会受苦
  9. 在设计时,重新考虑是否应该使用函数,脚本或OO(面向对象)
  10. 不要急于过早优化,因为速度matlab不是最好的选择。如果你真的必须,保留一个非优化版本进行左右可读性比较,故障排除和调试不会少骂。
  11. 始终,始终,始终注释您的代码。永远不要以没有时间为借口,以后会浪费更多时间。
  12. 为了区分,考虑为代码修改设置一个新节点,例如。设置树以区分版本。

  13. 使用单独的文件夹输入/输出,图像,中间结果等。

  14. 使用时间戳跟踪您的版本

  15. 与其他人分享您的代码,如果他们发现难以维护,使用或修改,请重新考虑如何优化您的构建。

答案 5 :(得分:3)

我同意大多数关于Matlab的评论不是非常支持现代软件源代码结构,但我不认为用一点纪律强加你自己的一些结构太难了。

将源文件组织到目录层次结构中,就像使用其他编程语言编写的任何程序的源文件一样。您不需要坚持层次结构,如果您愿意,可以选择自己的结构。使用setpath命令(或其他任何命令)告诉Matlab在工作时查找m文件的位置。

熟悉Matlab分析器工具,它可以为您提供调用图(非常图形化,更像是gprof的调用图),这有助于破译意大利面条代码。

当然,我们所有的m文件都在存储库中,我们为此提供服务。我们在其中一个网络驱动器上保留了一个私有工具箱,所有用户都可以直接在该工具箱中调用“已发布”的代码。

答案 6 :(得分:3)

支持一切是正确的。创建原始源树的原始tarball,然后将其全部放入源代码控制中,以便跟踪和回滚更改。

查看Matlab的depfun()和depdir(),它们检测静态依赖项。它可以帮助您查看Matlab函数之间的依赖关系。通过对所有文件进行“depfun -toponly”和一些字符串修改,您可以构建一个直接依赖项列表,并将其放入GraphViz文件中,以生成代码库调用连接的大型有向图。图中的集群可能是划分代码的好地方。 (编辑:参见Jonas的解决方案;看起来像m2html为你做这个。)

如果你有足够的自由来重写代码,可以考虑将一些代码重写为对象,使用带有类方法和私有函数的无状态实用程序类作为将相关函数打包在一起并提供一些封装的方法。我使用过这种方式组织的大型Matlab代码库,它可以正常工作。在经典的Matlab中,类是你做某种包的唯一方法。我相信Matlab的新OO系统也支持命名空间。

如果您不想将代码转换为OO,则可以在子目录中组织相关功能。这有助于组织它至少进行源代码浏览。

所有功能都应该有一些matlab的标准帮助文本格式,包括H1行。如果他们不这样做,请将评论贴在你在那里学到的东西上。然后使用“contentsrpt”工具自动生成类或目录的目录文件。

祝你好运。