代码之家  ›  专栏  ›  技术社区  ›  Dan Vinton

Matlab GUI应用程序中的软件工程和模式?[关闭]

  •  10
  • Dan Vinton  · 技术社区  · 16 年前

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

    Matlab文档在如何从技术上做到这一点方面做得很好,但很少提及“工程”过程,特别是:

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

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

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

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

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

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

    3 回复  |  直到 16 年前
        1
  •  10
  •   Nigel Davies    12 年前

    这是一个非常合理的问题,只要稍加小心,就可以编写易于维护的GUI代码。一些建议:

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

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

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

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

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

        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
    
        2
  •  3
  •   Boris Gorelik    16 年前

    我假设你(Dan Vinton)在软件工程和设计模式方面有一些知识,你正在寻找MatLab世界中的常见实践。为此,我将查看GUI包MatLab工具箱,如优化、曲线拟合等。所有这些工具箱的GUI都附带了它们的源代码(它们是常规的MatLab脚本)。您还可以查看它或几个排名靠前的GUI包的源代码 MatLab Central 。这些将很好地代表MatLab中的常见实践。

        3
  •  0
  •   Jared    16 年前

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