如何在MATLAB中可视化项目结构?
我已经拥有了几千行Matlab代码,一些大于900行的函数和几个完整的function_name.m
文件。 很难弄清楚一切正在做什么(或涉及到)或找出依赖关系。 你会提出什么build议来形象化function结构,比如哪些function被调用,以及按什么顺序?
端口NumPy。
(玩笑。)
通常在Matlab中,你有一些文件写作function,一些作为脚本。 脚本可以像加载要处理的数据一样进行处理,然后将其提供给函数,并对其进行绘制。
为了组织事情,我将从顶层脚本开始,找出哪些函数进行加载,绘图,处理等。将脚本保存在顶层目录中,并尝试将function划分为子目录,根据目的function。 把一个函数的依赖关系放到同一个子目录下。 尝试使目录中的代码不依赖父目录(或表亲目录)中的任何内容。
每当你弄清楚一个函数做了什么以及它的参数是什么时,写一个doc注释。
这假设编写代码的人是合理的。 如果不是这样,Matlab可以很容易地把所有东西都放到一个目录中,并且一切都依赖于一堆代码,所以你最终可能会做很多重构。
你的代码是否有正确的帮助文本? 在这种情况下, m2html将是一个很好的帮助,因为它允许您创build链接的HTML帮助,以方便浏览。
此外,它允许您创build依赖关系图,这有助于您更好地了解如何组织代码。
在The MathWorks,我不得不多次处理这个问题。 这就是我为大部分MATLAB代码所做的事情:
- 支持它,也许两次!
- 全选,Ctrl-I进行智能缩进
-
select全部,按Ctrl-J来包装注释
-
如果我感觉基于纸张 – 打印所有文件,并获得一组荧光笔 – 手动跟踪,突出显示长期variables和重要的函数调用。
~~~和/或~~~
5如果我感觉很幸运,可以在debugging器中运行代码,一次一个脚本地执行代码(进入用户编写的子function)
在这一点上,我可以通过控制结构遵循典型的stream程。 我可能没有一个好主意,但我对发生的事情有一个相当好的想法。
通常情况下,我的目标是find一个错误,解决它并继续前进。 你的目标可能完全不同。 这是我用来快速理解多年来发送的不同的MATLAB代码的search方法。
理查德·约翰逊的MATLAB编程风格指南是一个很好的资源。
关于Matlab编码约定的一些build议:
-
使用addpath避免文件混乱,并协助functiontaxnomony
-
分解function脚本或设置条件运行,这也可以帮助插件/模块和重用或代码引用。
-
使用configuration文件打开和closures选项
- 对build筑的build筑devise以及工作方式有一个概述
- 保留一个状态/自述文件(把自己当作一个新用户,你将如何协助将其作为新用户自己的模块的一部分或无缝地部分解决scheme?如果你3个月后回到代码感觉失去或无法追踪 – 有些事情是错误的。)我的build议是:保留一份日记,以优化您对维护巧妙项目的想法。 继续完善你的艺术!
- 对于方程式,使用latex作为文档(并将其保存在附近的文件夹中,例如文档,确保它们易于访问和追踪 – 如果您必须在驱动器上使用“search”,则项目pipe理出现问题)
- 将代码分解为短模块进行本地化和更短的代码,滚动更less,代码将更容易追踪。
- 使用有意义的variables和函数名称(Java风格看起来不错,例如'backupDataForVerification'),不要缩短单词,你会稍后
- 在devise时,如果您应该使用函数,脚本或OO(面向对象)
- 不要急于过早的优化,对于速度的matlab不是最好的select。 如果你真的必须,保持一个没有优化版本的侧面可读性比较,故障排除和debugging将不会是一个诅咒。
- 始终,始终,总是评论你的代码。 不要用没有时间的借口,以后浪费更多的时间。
-
为了区别,考虑为代码修改设置新的节点,例如。 设置树来区分版本。
-
input/输出,图像,中间结果等使用一个单独的文件夹。
-
使用时间戳追踪你的版本
-
与其他人分享您的代码,如果他们发现难以维护,使用或修改,请重新思考如何优化您的构build。
一切都恢复正常。 创build原始源代码树的原始tarball,然后将其全部放在源代码pipe理中,以便跟踪和回滚您的更改。
看看Matlab的depfun()和depdir(),它们检测静态依赖关系。 它可以帮助你看到Matlab函数之间的依赖关系。 使用所有文件中的“depfun -toponly”和一个小string,你可以build立一个直接的依赖关系列表,并将其放入一个GraphViz文件中,以产生一个有关你的代码库的调用连接的有向图。 图中的集群可能是划分代码的好地方。 (编辑:见Jonas的解决scheme;看起来像m2html为你做这个。)
如果你有很大的自由度重写代码,考虑重写一些代码作为对象,使用类方法和私有函数的无状态实用程序类来打包相关函数并提供一些封装。 我已经用这种方式组织了大量的Matlab代码库,并且它工作正常。 在经典的Matlab中,类是你做某种程序包的唯一方法。 我相信Matlab的更新的OO系统也支持命名空间。
如果您不想将代码转换为OO,则可以在子目录中组织相关的function。 这有助于组织它至less用于源代码浏览。
所有的函数应该有Matlab的标准helptext格式的一些doco,包括一个H1行。 如果他们不这样做,那就把注意力放在你在那里学到的东西上。 然后使用“contentsrpt”工具自动生成目录文件的类或目录。
祝你好运。
我同意大多数关于Matlab的评论,并不支持现代软件源代码结构,但我不相信用一点自律来强加一些你自己的结构是很难的。
将源文件组织成一个目录层次结构,就像使用其他编程语言编写的任何程序的源文件一样。 你不需要坚持一个层次结构,如果你愿意,可以select你自己的结构。 使用setpath命令(或任何它被称为)来告诉Matlab在你工作时在哪里寻找你的m文件。
熟悉Matlab分析器工具,它可以给你调用图(不是非常graphics化,更像gprof的调用图),这有助于破译意大利面代码。
当然,我们所有的m文件都在存储库中,我们将它们用于存储。 我们在我们的networking驱动器上保留一个私人工具箱,所有用户可以直接在该工具箱中调用“发布”代码。