我正在研究要与MATLAB Compiler一起部署的相当复杂的GUI程序。(有充分的理由使用MATLAB来构建此GUI,但这不是这个问题的重点。我意识到GUI的构建不是此语言的强项。)
在GUI的功能之间共享数据,甚至在应用程序的GUI之间传递数据的方法有很多种:
setappdata/getappdata/_____appdata -将任意数据关联到句柄guidata-通常与GUIDE一起使用;“存储或检索GUI数据”到句柄结构将set/get操作应用于UserData句柄对象的属性在主函数中使用嵌套函数;基本上模拟“全局”作用域变量。在子功能之间来回传递数据我的代码的结构不是最漂亮的。现在,我已经将引擎与前端隔离了(很好!),但是GUI代码非常像意大利面条。这是借用Android语言的“活动”的骨架:
function myGui fig = figure(...); % h is a struct that contains handles to all the ui objects to be instantiated. My convention is to have the first field be the uicontrol type I'm instantiating. See draw_gui nested function h = struct([]); draw_gui; set_callbacks; % Basically a bunch of set(h.(...), 'Callback', @(src, event) callback) calls would occur here %% DRAW FUNCTIONS function draw_gui h.Panel.Panel1 = uipanel(... 'Parent', fig, ... ...); h.Panel.Panel2 = uipanel(... 'Parent', fig, ... ...); draw_panel1; draw_panel2; function draw_panel1 h.Edit.Panel1.thing1 = uicontrol('Parent', h.Panel.Panel1, ...); end function draw_panel2 h.Edit.Panel2.thing1 = uicontrol('Parent', h.Panel.Panel2, ...); end end %% CALLBACK FUNCTIONS % Setting/getting application data is done by set/getappdata(fig, 'Foo'). end
我以前编写的代码中没有嵌套任何内容,因此我最终h到处来回传递(因为需要重绘,更新等内容)并setappdata(fig)存储实际数据。无论如何,我一直将一个“活动”保存在一个文件中,并且我相信这将来将成为维护的噩梦。回调与应用程序数据和图形句柄对象都在交互,我认为这是必要的,但是这阻止了代码库的两个“一半”的完全分离。
因此,我在这里寻求一些组织/ GUI设计帮助。即:
有没有我应该用来组织的目录结构?(回调与绘图功能?)与GUI数据进行交互并将其与应用程序数据隔离的“正确方法”是什么?(当我引用GUI数据时,我指的set/get是处理对象的属性)。如何避免将所有这些绘图功能放入一个包含数千行的巨型文件中,并且仍然有效地来回传递应用程序和GUI数据?那可能吗?持续使用会带来性能损失set/getappdata吗?我的后端代码(3个对象类和一堆帮助器函数)应该采用什么结构,以使其从GUI角度更易于维护?我不是专业的软件工程师,我只知道足够危险,所以对于那些经验丰富的GUI开发人员(无论使用哪种语言),我相信这些都是相当基本的问题。我几乎觉得MATLAB中缺少GUI设计标准(是否存在?)严重干扰了我完成此项目的能力。这是一个MATLAB项目,比我以前从事的任何项目都要庞大得多,而且我以前从未对带有多个图形窗口等的复杂UI进行过多考虑。