model view controller - net - cómo implementar la idea del diseño de mvc en matlab gui
mvc tutoriales ya (3)
Lo que estás intentando es algo no trivial. El sistema de interfaz de usuario de MATLAB, GUÍA, no es tan flexible. Odio ser negativo sobre esto. Aprecio que estés intentando desarrollar una UI siguiendo un patrón, pero simplemente usaría GUIDE y me quedaría con los segmentos de códigos generados automáticamente.
Usar Java o C # para la interfaz de usuario y luego usar MATLAB Builder NE o MATLAB Builder Java para incorporar MATLAB para el trabajo pesado de procesamiento es una opción mucho mejor. No estoy seguro de que la versión para estudiantes incluya eso, pero eso es realmente lo que quieres.
Una de las lecciones más importantes que cualquier programador aprenderá es que cada idioma tiene fortalezas y debilidades. Intentar forzar un lenguaje a un paradigma para el que no fue diseñado es una batalla cuesta arriba, que generalmente terminará con más llanto y más regocijo.
Por favor, soy un estudiante que trabaja en un proyecto para desarrollar una herramienta de visualización para analizar datos usando un diseño de mvc en matlab. pero el problema que tengo es que soy nuevo en la programación y matlab es la primera programación real que estoy haciendo. He hecho bastante los códigos pero me temo que no están en un patrón de diseño de mvc, así que necesito cambiar esto.
Realmente agradecería la mayor cantidad posible de imputaciones para vincularme con materiales útiles, ya que no puedo encontrar ninguno para mvc en matlab o pueden ser códigos ejemplares que implementen mvc en matlab para ayudarme a dar una idea de cómo puedo hacer lo mío, presentemente y haciendo cosas como esta, donde los datos son una estructura con archivos para .Name y .Data. las funciones / métodos datcorrCoef y datCorrSum son funciones que he creado que aceptan mi objeto de datos como argumentos
function dataAnalysisGUI(data)
fdataAnalysisGUI = figure(''Name'',''Data Analysis '',...
''tag'',''dataAnalysisGUI'',...
''menu'',''none'',...
''units'',''normalized'',...
''NumberTitle'', ''off'')
%%% intialise the gui with data set to work with
vtDaUD.opD = data;
Rsq = datcorrCoef(vtDaUD.opD);
opit = datWrappa(Rsq);
vtDaUD.wd = opit;
vtDaUD.feel = datCorrSum(data);
%%%------------------- menus ------------------------------------------%%%
smh = uimenu(''Label'', ''Sort'', ''Tag'', ''daSortMenu'');
cmh = uimenu(smh, ''Label'', ''Sum of CorrCoeff '',...
''Tag'', ''correlation'');
uimenu(cmh, ''Label'', ''Increasing '',...
''Tag'', ''cIncreasing'',...
''callback'',''vtDaCallbacks(''''cIncreasing_callback'''')'');
uimenu(cmh, ''Label'', ''Decreasing '',...
''Tag'', ''cDecreasing'',...
''callback'',''vtDaCallbacks(''''cDecreasing_callback'''')'');
mmh = uimenu(smh, ''Label'', ''Max Lag '',...
''Tag'', ''maxLag'');
uimenu(mmh, ''Label'', ''Increasing '',...
''Tag'', ''mIncreasing'',...
''callback'',''vtDaCallbacks(''''mIncreasing_callback'''')'');
uimenu(mmh, ''Label'', ''Decreasing '',...
''Tag'', ''mDecreasing'',...
''callback'',''vtDaCallbacks(''''mDecreasing_callback'''')'');
dmh = uimenu(''Label'', ''Display'', ''Tag'', ''daDisplayMenu'');
uimenu(dmh, ''Label'', ''Scatter Plots '',...
''Tag'', ''dScatter'',...
''Callback'',''vtDaCallbacks(''''dScatter_callback'''')'');
uimenu(dmh, ''Label'', ''Cross Correlation '',...
''Tag'', ''dCrosscorr'',...
''callback'',''vtDaCallbacks(''''dCrosscorr_callback'''')'');
uimenu(dmh, ''Label'', ''Time Series '',...
''Tag'', ''dTimeseries'',...
''callback'',''vtDaCallbacks(''''dTimeseries_callback'''')'');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%------------------------ panels ------------------------------------%%%
vtDaPanel1 = uipanel(fdataAnalysisGUI,...
''Units'',''normalized'',...
''Position'', [.025 .035 .84 .95],...
''FontSize'',10,...
''tag'',''vtDaPanel1'',...
''backgroundcolor'',[0.8, 0.8,0.8],...
''title'', ''Table of Cross Correlations between Data'');
vtDaPanel2 = uipanel(fdataAnalysisGUI,...
''Units'',''normalized'',...
''Position'', [.87 .566 .12 .396],...
''tag'',''vtDaPanel2'',...
''backgroundcolor'',[0.8, 0.8,0.8],...
''title'', ''Analysis'');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%------------------------- objects -------------------------------%%%
uitable(''parent'', vtDaPanel1,...
''tag'',''vtDaTable'',...
''RearrangeableColumn'', ''on'',...
''clipping'',''off'',...
''Units'',''normalized'',...
''Position'',[.01 .2 .98 .8],...
''data'',opit.Data,...
''rowname'',opit.Name,...
''columnname'',opit.Name,...
''CellSelectionCallback'',{@daTable_callback,vtDaUD.opD});
uitable(''parent'', vtDaPanel1,...
''tag'',''vtDaTable2'',...
''RearrangeableColumn'', ''on'',...
''Units'',''normalized'',...
''Position'',[.01 .01 .98 .15],...
''data'',vtDaUD.feel.Data,...
''rowname'',''Sum of Corr. Coeff'',...
''columnname'',vtDaUD.feel.Name,...
''TooltipString'',''select column header to drill down'',...
''CellSelectionCallback'',{@daTable2_callback,vtDaUD.opD});
uicontrol(vtDaPanel2, ''Style'', ''popupmenu'',...
''tag'',''taskpopMenu'',...
''Units'',''normalized'',...
''Position'', [.10 .75 .8 .1],...
''String'', {''Correlation Coeff'';''Max lags''},...
''Callback'', ''vtDaCallbacks(''''taskpopMenu_callback'''')'');
uicontrol(vtDaPanel2, ''Style'', ''text'',...
''tag'',''staticTxt2'',...
''Units'',''normalized'',...
''Position'', [.10 .86 .8 .05],...
''String'', {''Task''});
uicontrol(vtDaPanel2, ''Style'', ''text'',...
''tag'',''staticTxt3'',...
''Units'',''normalized'',...
''Position'', [.10 .61 .8 .05],...
''String'', {''Mini Display''});
uicontrol(vtDaPanel2, ''Style'', ''pushbutton'',...
''tag'',''pushTimeseries'',...
''Units'',''normalized'',...
''Position'', [.10 .5 .8 .1],...%[450 350 100 50]
''String'', {''TimeSeries''},...
''Callback'', ''vtDaCallbacks(''''pushTimeseries_callback'''')'');
uicontrol(vtDaPanel2, ''Style'', ''pushbutton'',...
''tag'',''pushScatter'',...
''Units'',''normalized'',...
''Position'', [.10 .35 .8 .1],...
''String'', {''Scatter''},...
''Callback'', ''vtDaCallbacks(''''pushScatter_callback'''')'');
uicontrol(vtDaPanel2, ''Style'', ''pushbutton'',...
''tag'',''pushMaxlag'',...
''Units'',''normalized'',...
''Position'', [.10 .2 .8 .1],...
''String'', {''Max Lag''},...
''Callback'', ''vtDaCallbacks(''''pushMaxlag_callback'''')'');
name = genvarname([''daGUI'' data.Name{2}]);%name = datname(''daGUI'',lenght(data.Name));
vtDaUD.varName = name;
eval([name ''= data.Data'']);
assignin(''base'',name,data.Data);
set(fdataAnalysisGUI,''UserData'',vtDaUD)
y he hecho la devolución de llamada / control de la siguiente manera;
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)
donde nuevamente tengo otras funciones que operan con mi objeto de datos aquí en el controlador; realmente frustrado por todo el asunto! por favor avíseme si no estoy lo suficientemente claro acerca de la descripción de mi problema para que pueda por favor ayudarme. gracias
Acabo de ver hacer MVC en Matlab y he llegado a un patrón que creo que funcionará dadas las limitaciones de Matlab. El principal problema es que los archivos GUI son manejadores de objetos gráficos y no clases. Sin embargo, si ajusta la GUI en una clase de vista, puede suscribirse a propiedades observables en una clase de modelo. Debe dejar de utilizar la estructura de identificadores en la GUI para almacenar todos sus datos de usuario ... que no coinciden con el patrón de diseño. La buena noticia es que las clases de Matlab soportan bastante bien los eventos y los oyentes, incluidas las propiedades observables a las que aludí.
La demostración de mi solución se puede encontrar en Matlab Central File Exchange en http://www.mathworks.com/matlabcentral/fileexchange/40294-model-view-control-pattern-using-guide .
Una descripción más detallada de la implementación se encuentra en una publicación de blog en http://myunscriptedblog.blogspot.com/2013/02/mvc-in-matlab.html
Para MVC necesita orientación de objeto adecuada. OO en MATLAB está disponible en las versiones más nuevas, puede hacerlo como lo haría MVC en Java. Pero no se "siente" bien en MATLAB (así que no creo que tu instructor haya querido decir esto) porque sería excesivo en la mayoría de los casos simples y para UI complejas / grandes. MATLAB es demasiado lento y tiene problemas de rendimiento en algunos escenarios.
De lo contrario, puede usar funciones anidadas (cierres en CS). Con cierres, algunas funciones OO pueden ser "emuladas". El único problema es que todo debe permanecer en un archivo m.
- Modelo: variable de ámbito anidado (aquí denominado "this")
- Vista: uicontrols (y otros elementos de la interfaz de usuario)
- Controlador: devoluciones de llamada
Aquí hay un ejemplo muy básico, simplemente llénelo con los datos de su modelo y vea los resultados de la interfaz de usuario:
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