17

MATLAB 有两种组织类的方法:

@-目录:

@班级名称\
    类名.m
    方法1.m
    方法2.m

单个文件:

类名.m:
classdef 类名
    方法
        % 这里包含的所有方法
    结尾
结尾

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

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

4

4 回答 4

18

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

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

但是,我的大部分代码都使用旧的多文件组织。部分原因是我们的代码库是在几年前开始使用的,比新样式普遍可用。但部分是为了性能。新的单文件组织仅适用于新样式的 MCOS Matlab 类,并且由于更高的方法调度开销,它们比旧样式的 Matlab 类慢。例如,这是一个基准片段,显示了无操作 nop() 方法的执行时间。

调用每个函数/方法 100000 次
nop() 函数:每次调用 0.02715 秒 0.27 微秒
nop(obj) 方法:每次调用 0.24629 秒 2.46 微秒
classdef nop(obj):每次调用 0.98572 秒 9.86 微秒
classdef obj.nop():每次调用 1.81307 秒 18.13 微秒

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

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

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

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

于 2010-03-29T15:04:18.753 回答
6

我发现这@-directories是一个最好被遗忘的组合(例如公共/私人,那是什么?)。在最流行的版本中(我相信自 2007b 以来),组织课程的最佳方式是使用 packages。这提供了一个更干净的命名空间。我认为在一个文件中处理整个类可以更容易地了解类在做什么,并且在重构时减少 1000% 的烦人(想象在更改变量名后更改 8 个文件)。

于 2010-03-27T05:04:31.073 回答
5

我使用单文件方法。我发现当代码由单个文件组成时,它更容易组织代码,并且单元格标题使在方法之间跳转变得非常容易。另外,如果我创建一个新的@-class,我可能需要重新创建路径才能使用它,我对此没有耐心。

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

于 2010-03-27T04:10:38.400 回答
1

使用@ClassName 目录的优点是,如果您对classdef 文件进行任何更改,matlab 会强制您清除并重新加载一个类。如果您将函数的实现放在单独的 m 文件中,并且只将方法签名放在 classdef 文件中,您可以在不清除类的情况下随意处理实现。

于 2010-04-02T02:30:52.330 回答