组织MATLAB类的最佳方法是什么?

时间:2010-03-26 18:04:05

标签: matlab oop organization code-organization matlab-class

MATLAB有两种组织类的方法:

@ - 目录:

@ClassName\
    ClassName.m
    Method1.m
    Method2.m

单个文件:

ClassName.m:
classdef ClassName
    methods
        % all methods included here
    end
end

第一种风格在新classdef语法之前就存在了,但似乎是一种更有条理的做事方式。第二种风格(单个文件中的所有内容)都是新的。

您使用哪种方法,为什么?

4 个答案:

答案 0 :(得分:18)

新的单文件样式有一些优点。它允许并鼓励您编写许多小方法,我认为这些方法会导致更好的代码。创建一个新文件,保存它,并将其添加到源代码控制(我们 所有使用源代码控制,对吧?)的麻烦很小,但是添加了几十个小方法就足够了它通常不鼓励我将一个类分解为更细粒度的功能。编辑整个类很方便浏览,搜索和替换,而不必打开十几个单独的编辑器选项卡,然后可以用它们来组织不同类的源代码。

对于较大的代码库,单文件样式可能具有性能优势。迭代源树的源代码控制和部署系统具有stat和diff操作等每个文件的成本。对于更大的代码库,比如数千种方法,这些方法可能很重要,尤其是在网络驱动器上。我怀疑使用Matlab编译器部署的应用程序也会产生性能影响。启动时间随着部署的代码库的大小而增加。这个成本的每个文件部分来自文件操作,因为文件(我认为)是单独加密的。我怀疑,但没有经过实验测试,使用单个文件类定义将降低编译的Matlab应用程序的启动成本。

但是,对于我的大部分代码,我都使用旧的多文件组织。部分原因是因为我们的代码库是在新版本通用之前的几年前启动的。但部分原因在于表现。新的单一文件组织仅适用于新式MCOS Matlab类,并且由于更高的方法调度开销,它们比旧式Matlab类慢。例如。这是一个基准片段,显示了do-nothing nop()方法的执行时间。

Calling each function/method 100000 times
nop() function:                 0.02715 sec   0.27 usec per call
nop(obj) method:                0.24629 sec   2.46 usec per call
classdef nop(obj):              0.98572 sec   9.86 usec per call
classdef obj.nop():             1.81307 sec  18.13 usec per call

在进行大量方法调用的代码库中,这会对性能产生重大影响。 (另见Is MATLAB OOP slow or am I doing something wrong?

另一个问题是Matlab的自动压缩器将缩进类定义中的每个部分和每个方法,因此所有可执行代码的基线都是两个制表位,浪费了8列屏幕空间。

总的来说,如果不是出于OO性能考虑,我可能会使用单个文件,而且我正在编写新的非性能关键类。

更新:它看起来像contentsrpt(),一个有用的文档生成器,不能与classdef文件中定义的函数一起使用;只有那些在单独的函数文件中。

答案 1 :(得分:6)

我发现@-directories是一个最好被遗忘的kludge(例如公共/私人,那是什么?)。在最常见的版本中(自2007b以来,我相信),the best way to organize your classes is with packages。这提供了更清晰的命名空间。我认为在一个文件中使用整个类可以更容易地了解类正在做什么,并且在重构时更容易烦恼1000%(想象一下在更改变量名后更改8个文件)。

答案 2 :(得分:5)

我使用单一文件方法。我发现当代码由单个文件组成时,组织代码会更容易一些,而单元格标题使得在方法之间轻松转换。另外,如果我创建一个新的@ -class,我可能需要在能够使用之前重新创建路径,而且我没有耐心等待。

说了这么多,我不认为单文件样式比多文件样式好多了;拥有大量小巧,易于查看的文件也可能非常有用。

答案 3 :(得分:1)

使用@ClassName目录的优点是,如果对classdef文件进行任何更改,matlab会强制您清除并重新加载类。如果将函数的实现放在单独的m文件中,并将方法签名放在classdef文件中,则无需清除该类就可以实现该实现。