Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller 如何在matlabgui中实现mvc设计思想&x27;s_Model View Controller_Design Patterns_Matlab - Fatal编程技术网

Model view controller 如何在matlabgui中实现mvc设计思想&x27;s

Model view controller 如何在matlabgui中实现mvc设计思想&x27;s,model-view-controller,design-patterns,matlab,Model View Controller,Design Patterns,Matlab,我是一名学生,正在从事一个项目,开发一个可视化工具,使用matlab中的mvc设计来分析数据。但是我遇到的问题是,我对编程很陌生,而matlab是我做的第一个真正的编程。我几乎完成了这些代码,但我担心它们不符合mvc设计模式,所以我需要改变这一点 我非常感谢尽可能多的插补将我与有用的材料联系起来,因为我在matlab中找不到任何mvc的插补,或者可能是在matlab中实现mvc的示例代码,以帮助我了解我目前如何进行挖掘和这样做,其中数据是一个带有.Name和.data文件的结构。函数/方法dat

我是一名学生,正在从事一个项目,开发一个可视化工具,使用matlab中的mvc设计来分析数据。但是我遇到的问题是,我对编程很陌生,而matlab是我做的第一个真正的编程。我几乎完成了这些代码,但我担心它们不符合mvc设计模式,所以我需要改变这一点

我非常感谢尽可能多的插补将我与有用的材料联系起来,因为我在matlab中找不到任何mvc的插补,或者可能是在matlab中实现mvc的示例代码,以帮助我了解我目前如何进行挖掘和这样做,其中数据是一个带有.Name和.data文件的结构。函数/方法datcorcoef和datCorrSum是我创建的函数,它们接受我的数据对象作为参数



我已经完成了如下的回调/控制

function vtDaCallbacks(action)
handles = guihandles(gcf);
vtDaUD = get(handles.dataAnalysisGUI,'UserData');
%tabdata=get(handles.vtDaTable,'data');
tab2Data.Data = get(handles.vtDaTable2,'data');
tab2Data.Name = get(handles.vtDaTable2,'columnname');


switch action
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%-----------------------Data AnalysisGUI menu callbacks-----------%%%
    case 'cIncreasing_callback'
        [newTabData,index] = sortaColumn(tab2Data,'ascend',1);
        vtDaUD.wd = dataselect(vtDaUD.opD,index);
        set(handles.vtDaTable2, 'data', newTabData.Data)
        set(handles.vtDaTable2, 'columnname', newTabData.Name)
        set(handles.vtDaTable2,'CellSelectionCallback',{@daTable2_callback,vtDaUD.wd});


    case 'cDecreasing_callback'
        [newTabData,index] = sortaColumn(tab2Data,'descend',1);
        vtDaUD.wd = dataselect(vtDaUD.opD,index);
        %[vtDaUD.wd,newTabData,newcolumnname] = sortta2(vtDaUD.opD,'descend',tab2Data,1);
        set(handles.vtDaTable2, 'data', newTabData.Data)
        set(handles.vtDaTable2, 'columnname', newTabData.Name)
        set(handles.vtDaTable2,'CellSelectionCallback',{@daTable2_callback,vtDaUD.wd});

    case 'dScatter_callback'
        dataDispGUI('dScatta','calnumpage2',vtDaUD.opD, 'Scatter Plots')

    case 'dTimeseries_callback'
        dataDispGUI('dTimeSeries2','calnumpage2',vtDaUD.opD, 'Time Series Plots')

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%-------------------Data AnalysisGUI uiobject callbacks-----------%%%

    case 'dataTable_callback'
        [indices,data1,data2] = daTable_callback(vtDa.opD);
        vtDaUD.data1=data1;
        vtDaUD.data2=data2;
        dsingTseries(y1,y2)

    case 'taskpopMenu_callback'
        val = get (handles.taskpopMenu,'value');
        switch val
            case 1
                Rsq = datcorrCoef(vtDaUD.opD);
                tab1data = datWrappa(Rsq);%vtDaUD.wd
                set(handles.vtDaPanel1,...
                    'title', 'Table of Cross Correlations between Data');
            case 2
                [maxT,lags,coeff]= datCrossCorr(vtDaUD.opD,30);
                tab1data = datWrappa(maxT);%vtDaUD.wd
                set(handles.vtDaPanel1,...
                    'title', 'Table of Max Lag between Data');
        end
        set(handles.vtDaTable, 'data', tab1data.Data)%vtDaUD.wd.Data
        set(handles.vtDaTable2,'data', vtDaUD.feel.Data)
        set(handles.vtDaTable2,'columnname', vtDaUD.feel.Name)
        set(handles.vtDaTable2,'CellSelectionCallback',{@daTable2_callback,vtDaUD.opD});



    case 'pushTimeseries_callback'
        dsingTseries(vtDaUD.opD,vtDaUD.varName,vtDaUD.indices)

    case 'pushScatter_callback'
        dsingScatta(vtDaUD.opD,vtDaUD.varName,vtDaUD.indices)

    case 'pushMaxlag_callback'
        dsingMlags(vtDaUD.opD,vtDaUD.varName,vtDaUD.indices)


end
set(handles.dataAnalysisGUI,'UserData',vtDaUD)

在这里,我在控制器中再次具有与我的数据对象一起操作的其他功能;对整件事真的很沮丧!!如果我对我的问题描述不够清楚,请告诉我,这样你就可以帮助我了。谢谢你

你所尝试的是一件不平凡的事情。MATLAB的UI系统GUIDE并没有那么灵活。我讨厌对此持否定态度。我很感激您尝试按照一种模式开发UI,但我只想使用指南并继续使用自动生成的代码段

使用Java或C#作为UI,然后使用或引入MATLAB进行繁重的处理是一个更好的选择。我不确定学生版是否有这个功能,但这确实是你想要的


任何程序员都会学到的最重要的一课是每种语言都有优缺点。试图将一种语言强制转换为一种非设计使用的模式是一场艰苦的战斗,通常会以更多的欢呼而告终。

对于MVC,您需要正确的面向对象。MATLAB中的OO在较新版本中可用,您可以像在Java中使用MVC一样使用它。但是它在MATLAB中并不“感觉”正确(所以我不认为你的指导老师是这个意思),因为在大多数简单的情况下,对于复杂/大型UI来说,这是一种过度杀伤力

否则,可以使用嵌套函数(CS中的闭包)。通过闭包,可以“模拟”某些OO功能。唯一的问题是所有东西都必须保存在一个m文件中

  • 模型:嵌套范围变量(此处命名为“this”)
  • 视图:uicontrols(和其他ui元素)
  • 控制器:回调
这是一个非常基本的示例,只需将模型数据填入其中并查看ui即可:

    function mvc_test()

    //% THIS is nested scope variable
    this.model = getModel(); 
    this.view = getView();

    //% create model
    function model = getModel()
        model.data1 = 1;
    end

    //% create view
    function view = getView()
        view.hfig = figure();
        view.hbtn = uicontrol( 'style', 'push', 'string', 'click me', 'callback', @btn1_cb );
    end

    //% controller
    function btn1_cb(varargin)
        this.model.data1 = this.model.data1 + 1;
        set( this.view.hbtn, 'string', num2str(this.model.data1) );
    end
    end

我刚刚研究了在Matlab中进行MVC,并提出了一种模式,我认为考虑到Matlab的局限性,这种模式可以发挥作用。主要问题是GUI文件是图形对象句柄,而不是类。但是,如果将GUI封装在视图类中,则可以订阅模型类中的可观察属性。您必须放弃使用GUI中的句柄结构来存储所有用户数据……这与设计模式不符。好消息是Matlab类非常好地支持事件和侦听器,包括我提到的可观察属性

我的解决方案的演示可以在Matlab中心文件交换上找到。

上的一篇博客文章中对实现进行了更详细的描述,当您完成项目时,请让我们知道您的讲师对MATLAB中的MVC使用了哪些编程模式/技术!优秀的博客文章。因此,您可能希望将其放入您的答案中(以避免链接腐烂)。
    function mvc_test()

    //% THIS is nested scope variable
    this.model = getModel(); 
    this.view = getView();

    //% create model
    function model = getModel()
        model.data1 = 1;
    end

    //% create view
    function view = getView()
        view.hfig = figure();
        view.hbtn = uicontrol( 'style', 'push', 'string', 'click me', 'callback', @btn1_cb );
    end

    //% controller
    function btn1_cb(varargin)
        this.model.data1 = this.model.data1 + 1;
        set( this.view.hbtn, 'string', num2str(this.model.data1) );
    end
    end