我得到了数千行Matlab代码的所有权,其中有一些长达900多行的函数以及几个目录充满了function_name.m
文件。很难弄清楚每个函数在做什么(或与何相关)或找出依赖关系。你会建议使用什么来可视化函数结构,例如哪些函数被调用以及以什么顺序调用?
我得到了数千行Matlab代码的所有权,其中有一些长达900多行的函数以及几个目录充满了function_name.m
文件。很难弄清楚每个函数在做什么(或与何相关)或找出依赖关系。你会建议使用什么来可视化函数结构,例如哪些函数被调用以及以什么顺序调用?
将代码移植到NumPy。
(开个玩笑。)
通常在Matlab中,一些文件被编写成函数,而另一些则被编写成脚本。脚本用于加载要处理的数据并将其输入函数进行图形绘制等操作。
为了组织代码,可以从顶层脚本开始查找执行加载、绘图、处理等操作的函数。将脚本放置在一个顶级目录中,然后尝试将函数根据其用途分离到子目录中。将函数的依赖项放置在同一子目录下。尽可能使得每个目录中的代码都不依赖于父目录(或者是表亲目录)中的任何代码。
每当确定一个函数的功能和参数时,请编写文档注释。
这假设编写代码的人是明智的。如果不是这样,Matlab会让你很容易地把所有东西都塞进一个目录中,并且让所有东西都依赖于彼此,形成一个不稳定的代码堆栈,因此你可能需要进行大量的重构。
addpath
和rmpath
。很遗憾。 - ptomato我在MathWorks的不同角色中曾多次处理这个问题。以下是我为大型MATLAB代码所采取的做法:
~~~ 或者 ~~~
5 如果我感到幸运,就开始在调试器中运行代码,一次执行一行(也会跟踪用户编写的子函数)。
此时,我可以通过控制结构的典型流程进行跟踪。我可能不知道每个部分具体是如何实现的,但我有一个相当清晰的思路。
通常,我的目标是找到一个bug,解决它并继续进行。你的目标可能完全不同。这是我多年来用来快速理解数百个不同的MATLAB代码的方法。
你的代码是否具有良好的帮助文本?如果是这样,m2html将是一个很好的帮助工具,因为它允许你创建链接的HTML帮助文本以便于浏览。
此外,它还允许你制作依赖图,这有助于更好地理解如何组织代码。
以下是Matlab编程规范的一些建议:
使用addpath避免文件混乱,并协助函数分类
将功能脚本分解为section_或设置条件运行,这也有助于插入/拔出模块和重复使用或引用代码。
使用配置文件打开和关闭选项
对于差异化,考虑设置新节点进行代码修改,例如设置树来区分版本。
使用单独的文件夹进行输入/输出、图像、中间结果等。
使用时间戳跟踪您的版本
与他人共享您的代码,如果他们发现很难维护、使用或修改,请重新考虑如何改进您的构建。
备份一切是正确的。创建原始源代码树的纯净tarball,然后将其全部放入源代码控制中,以便您可以跟踪和回滚更改。
查看Matlab的depfun()和depdir(),它们可以检测静态依赖项。它可以帮助您查看Matlab函数之间的依赖关系。通过在所有文件上使用“depfun -toponly”并进行一些字符串操作,您可以构建一个立即依赖性列表,并将其放入GraphViz文件中以生成代码库调用连接的大型有向图。图中的集群可能是分割代码的好地方。(编辑:请参见Jonas的解决方案;看起来m2html为您执行此操作。)
如果您有很大的自由度来重写代码,请考虑将其中一些代码重写为对象,使用无状态实用程序类作为打包相关功能的方法,并提供一些封装的私有函数和类方法。我曾经使用过这种方式组织大型Matlab代码库,效果还不错。在经典Matlab中,类是某些类型包的唯一方法。我相信Matlab的新OO系统也支持命名空间。
如果您不想将代码转换为OO,则可以将相关函数组织到子目录中。这有助于至少为源代码浏览组织它。
所有函数都应该有Matlab标准帮助文本格式的一些文档,包括H1行。如果没有,请将您在那里学到的注释放在那里。然后使用“contentsrpt”工具自动生成类或目录的目录文件。
祝你好运。