【问题标题】:Best way to organize MATLAB classes? [closed]组织 MATLAB 类的最佳方式? [关闭]
【发布时间】:2011-02-01 07:24:04
【问题描述】:

MATLAB 有两种组织类的方式:

@-目录:

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

单个文件:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    但是,我的大部分代码都使用旧的多文件组织。部分原因是我们的代码库是在几年前开始使用新样式的。但部分是为了性能。新的单文件组织仅适用于新样式的 MCOS Matlab 类,并且由于更高的方法调度开销,它们比旧样式的 Matlab 类慢。例如。这是一个基准 sn-p 显示无操作 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 微秒

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

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

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

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

    【讨论】:

      【解决方案2】:

      我发现@-directories 是一个最好忘记的组合(例如,公共/私人,那是什么?)。在最新的版本中(我相信自 2007b 以来),the best way to organize your classes is with packages。这提供了一个更干净的命名空间。我认为在一个文件中处理整个类可以更容易地了解类在做什么,并且在重构时减少 1000% 的烦人(想象在更改变量名后更改 8 个文件)。

      【讨论】:

      • 希望重构,您可以使用 sedperl -pi -e 如果您在 Git 上使用 bar 重命名一千个文件的 foo 就像这样简单:git ls-files | xargs perl -pi -e s/foo/bar/g。你在 Windows 上?没问题,只需安装 Cygwin 或 MinGW。我想你的最后一个论点是无效的。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 只有在添加/删除属性或方法,或者更改方法签名时,才会强制重新加载类文件。如果您更改方法内部的某些内容,Matlab 会抛出警告,但它仍然使用文件的更新版本。因此,除了警告之外,在必须清除类方面没有区别。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-20
        • 2017-08-30
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2021-11-20
        相关资源
        最近更新 更多