Quelle est la “bonne” façon d'organiser le code de la GUI?

Je suis en train de travailler sur un assez sophistiqué programme GUI être déployé avec MATLAB Compilateur. (Il y a de bonnes raisons de MATLAB est utilisé pour construire cette interface graphique, qui n'est pas le point de cette question. Je me rends compte GUI-bâtiment n'est pas un point fort pour cette langue.)

Il y a assez peu de moyens pour partager des données entre les fonctions dans une interface graphique, ou même de transmettre les données entre les Interfaces graphiques au sein d'une application:

  • setappdata/getappdata/_____appdata - associer des données arbitraires à une poignée de
  • guidata - généralement utilisé avec GUIDE; "store[s] ou de récupérer[s] GUI de données" à une structure de poignées
  • Appliquer un set/get fonctionnement de la UserData propriété d'un objet descripteur
  • Utiliser les fonctions imbriquées à l'intérieur d'une fonction principale; fondamentalement, émule "globalement" la portée des variables.
  • Transmettre les données entre les subfunctions

La structure de mon code n'est pas la plus jolie. Droit maintenant, j'ai le moteur séparé du front-end (bon!) mais le code de la GUI est joli comme des spaghettis. Voici un squelette d'une "activité", pour emprunter Android-parler:

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

J'ai déjà écrit de code où rien n'est imbriqué, j'ai donc fini par passer h en arrière et en avant partout (depuis choses nécessaires à la refonte, mise à jour, etc) et setappdata(fig) pour stocker des données réelles. En tout cas, j'ai été une "activité" dans un seul fichier, et je suis sûr que cela va être un entretien de cauchemar dans l'avenir. Les rappels sont en interaction à la fois avec les données de l'application graphique et de manipuler des objets, qui, je suppose, est nécessaire, mais c'est la prévention d'une ségrégation complète des deux "moitiés" de la base de code.

Donc je suis à la recherche pour certains d'organisation/GUI conception de l'aide ici. À savoir:

  • Est-il une structure de répertoire que je devrais utiliser pour l'organiser? (Rappels vs fonctions de dessin?)
  • Quelle est la "bonne façon" d'interagir avec l'interface graphique de données et de les garder séparés à partir de données de l'application? (Quand je parle de GUI de données je veux dire set/getting propriétés de manipuler des objets).
  • Comment puis-je éviter de mettre toutes ces fonctions de dessin dans un gigantesque fichier de milliers de lignes et toujours efficace de transmettre à la fois l'application et de l'interface de données d'avant en arrière? Est-ce possible?
  • Est-il des performances de la pénalité associée avec en permanence à l'aide de set/getappdata?
  • Est-il de toute la structure de mon code back-end (3 classes d'objet et un tas de fonctions d'assistance) devrait prendre pour rendre plus facile à maintenir à partir d'une interface graphique point de vue?

Je ne suis pas un ingénieur logiciel par le commerce, je sais juste assez pour être dangereux, donc je suis sûr que ce sont plutôt des questions de base les plus aguerris GUI développeurs (dans toutes les langues). J'ai presque envie de l'absence d'une interface graphique de conception standard dans MATLAB (n'existe?) est sérieusement interférer avec la capacité de réaliser ce projet. C'est un projet MATLAB qui est beaucoup plus massif que ce que j'ai jamais entrepris, et je n'ai jamais eu à donner beaucoup de pensée complexes de l'Isu avec de multiples figure de windows, etc., avant de.

InformationsquelleAutor Dang Khoa | 2013-11-19