【问题标题】:Software engineering and patterns in Matlab GUI application? [closed]Matlab GUI 应用程序中的软件工程和模式? [关闭]
【发布时间】:2008-12-02 21:32:28
【问题描述】:

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

Matlab 文档对如何在技术上做到这一点有很强的说明,但很少提及“工程”过程,尤其是:

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

  • 如何最好地在文件系统上布局文件?

  • 如何实现典型的GUI模式如:MVC、观察者?

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

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

直接的建议或指向良好参考资料的指针会非常有帮助。谢谢。

【问题讨论】:

    标签: design-patterns matlab


    【解决方案1】:

    这是一个完全合理的问题,只要稍加注意,就可以编写易于维护的 GUI 代码。一些建议:

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

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

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

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

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

    功能我的组件(无花果,基本名称) sliderHandle = findobj(fig, 'tag', [basename 'Slider']); textHandle = findobj(fig, 'tag', [basename 'Label']); % 初始化... 设置(sliderHandle,'回调',@sliderCallback); % 用于回调的嵌套函数;注意使用sliderHandle 函数滑块回调(h,e) fprintf('当前值为 %g\n, get(sliderHandle,'Value')); 结尾 结尾

    【讨论】:

      【解决方案2】:

      我假设您(Dan Vinton)在软件工程和设计模式方面有一些知识,并且您正在寻找 MatLab 世界中的常见做法。为此,我将查看 MatLab 工具箱的 GUI 包,例如优化、曲线拟合等。所有这些工具箱的 GUI 都带有它们的源代码(它们是常规的 MatLab 脚本)。您还可以查看它或来自MatLab Central 的几个高级 GUI 包的源代码。这些将让您很好地展示 MatLab 中的常见做法。

      【讨论】:

      • 您的假设是正确的:多年来我一直很高兴地编写符合某些实践的软件,这些实践似乎无法移植到像 Matlab 这样的 OO 平台...
      【解决方案3】:

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

      【讨论】:

      • 感谢您的建议,但客户坚持认为 UI 是原生 Matlab 代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2012-08-10
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多