Matlab GUI应用程序中的软件工程和模式?

时间:2008-12-02 21:32:28

标签: design-patterns matlab

我被要求使用Matlab和GUIDE开发一个简单的GUI应用程序,它将与一个单独的后端引擎(也就是Matlab)进行交互。我来自Java和.Net背景。

Matlab文档强有力地说明了如何在技术上做到这一点,但对“工程”过程几乎没有提及,特别是:

  • 如何打包/命名空间函数或创建库?

  • 如何最好地在文件系统上放置文件?

  • 如何实现典型的GUI模式,例如:MVC,observer?

  • 这些问题在Matlab开发中是否有意义?

  • 还有其他常见的习语/陷阱吗?

直接建议或指向优秀参考资料的指针将非常有帮助。感谢。

3 个答案:

答案 0 :(得分:10)

这是一个非常合理的问题,并且可以编写易于维护的GUI代码。一些建议:

  • 将GUI布局代码和“业务逻辑”放在不同的m文件中。 (有关示例代码,请参阅this FileExchange submission)。相关地,使用嵌套函数来维护GUI状态,而不是使用setappdata和getappdata传递或传递结构。

  • 通常,使用nestedanonymous functions进行回调。嵌套函数类似于Java中的内部类,匿名函数实现了词法闭包(如Ruby中的块)。

  • 使用exceptions优雅地处理错误。

  • 为每个GUI对象(例如,滑块,轴)提供唯一且有意义的标记。例如,“frequencySlider”或“dataAxes”。这有助于加强GUI布局和逻辑之间的分离。

  • GUIDE提供的gui控件相当低级,但您可以通过为各种控件选择系统标记名称来实现可重用的高级组件(例如,滑块的'frequencySlider'和'frequencyLabel'对于相关的文本标签)。组件初始化例程可以使用findobj查找组件的各个部分并初始化它们。 E.g。

    function myComponent(fig, basename)
       sliderHandle = findobj(fig, 'tag', [basename 'Slider']);
       textHandle = findobj(fig, 'tag', [basename 'Label']);
       %  initialize ...
       set(sliderHandle, 'Callback', @sliderCallback);

       % nested function for callback; note use of sliderHandle
        function sliderCallback(h,e)
            fprintf('current value is %g\n, get(sliderHandle,'Value'));
        end

      end
  • 如果您使用的是R2008a或更高版本,则会对OO开发提供大量额外支持:

答案 1 :(得分:3)

我认为你(Dan Vinton)在sw工程和设计模式方面有一些知识,你正在寻找MatLab世界中的常见做法。为此,我将看一下GUI包MatLab工具箱,例如优化,曲线拟合等。所有这些工具箱的GUI都带有源代码(它们是常规的MatLab脚本)。您还可以查看它或来自MatLab Central的几个高级GUI包的源代码。这些将为您提供MatLab中常见做法的良好表现。

答案 2 :(得分:0)

我没有在matlab中创建GUI的经验,但如果你的公司将花费mony,那么matlab for .net可能是一个更快的选择。它将允许您编写将在.net组件中敲击的matlab代码,该组件可以从.net调用,这意味着您可以使用任何.net语言编写GUI。它的链接如下。 http://www.mathworks.com/products/netbuilder/