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

jjk*_*ker 17 oop matlab code-organization organization matlab-class

MATLAB有两种组织类的方法:

@ -directories:

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

单个文件:

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

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

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

And*_*nke 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

在进行大量方法调用的代码库中,这会对性能产生重大影响.(另请参阅MATLAB OOP缓慢或我做错了什么?)

另外一个NIT是Matlab的自动压头将缩进一个类定义每一个部分和每一个方法,让你的所有可执行代码基线是二制表位,浪费的屏幕房地产8列.

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

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


Nic*_*lko 6

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


Jon*_*nas 5

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

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