ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1175
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Avatar von Licorice
    Licorice ist offline Allrounder
    Registriert seit
    Sep 2011
    Ort
    (Thüringen)
    Beiträge
    8
    Ich möchte hier gerne eine Diskussion rund um das Thema 'sauberer Code' im Bezug auf GUI Applikationen starten.
    Zum einen geht es um allgemeine Entwurfstechniken, zum anderen habe ich auch viele konkrete Fragen.

    Vorab: Ich bin [noch] kein professioneller Entwickler. (Aber studiert)
    Habe demnach noch Wissenslücken und mir fehlt praktische Erfahrung.
    Ich entwickle im Moment eher für mich selbst oder eine kleine Gruppe von Leuten als Single Developer.


    Mein Anliegen: Ich möchte mit diesem Thread mehr über das Code Design von GUI Applikationen erfahren. Das darf, angefangen beim allgemeinen Vorgehen, auch ruhig weiter ins Detail gehen, bis zum Design von Datenstruktur abhängigen Dialogen etc.
    Externe Quellen (Literatur, Threads, etc.) sind natürlich auch erwünscht. Trotzdem geht es mir auch um EURE Erfahrungen und euer Wissen.

    Sekundäres Ziel: Dieser Thread soll so gestaltet sein, dass Leute, die ihn über die Suche finden, das Wissen sofort sehen und anwenden können, ohne sich durch lästigen Offtopic zu wühlen. Trennt also bitte eure Posts inhaltlich.
    Vielen Dank im Voraus.
    Meine Probleme:

    Meine größten Probleme liegen im Moment noch darin GUI Code von Anwendungsspezifischem Code besser zu trennen. Ich bringe gerne zu viel Code in einer Klasse unter. Das erschwert den Austausch der Oberfläche oder der Logik.

    Beispiel: Es geht um die Entwicklung eher kleinerer Tools. Bestehend aus einem Hauptfenster und einigen Dialogen, sekundären Fenstern und ein bisschen Logik und spezifischen Algorithmen.


    Die Logik, Algorithmen und die Datenstruktur ist nicht das Problem. Diese lassen sich ja einfach in verschiedene Klasse auslagern.
    Problematisch wird es wenn die GUI mit dem Rest vereint werden soll.

    Dialoge lassen sich im Grunde auch recht einfach Designen. Man spendet ihnen Set- und Get- Methoden und gibt ihnen ein internes Verhalten, welches man ja direkt in der Dialog-Klasse implementieren kann. (Beispielsweise soll sich ein Button bei Klick auf eine Checkbox deaktivieren o.ä.)


    Im Gegenzug dazu steht das Hauptfenster der Anwendung. Das besteht meist aus einer etwas komplexeren Oberfläche, die sich mitunter auch in verschiedenen Zuständen befinden und verschiedene Inhalte haben kann.

    Alle Listener auf Buttons, die MenuItems des Hauptmenüs und sonstige GUI Elemente werden nun meist in einer Init-Methode dieses Hauptfensters registriert. (Das macht der GUI Builder schon so)
    Darin wird dann eine anonyme Implementation des Action Interfaces übergeben, in der wiederum eine extra dafür definierte Methode innerhalb der Hauptfenster Klasse aufgerufen wird.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    // Beispiel
    public class MainWindow extends JFrame {
        private JButton buttonOk;
        
        /** GUI Init Methode */
        private void init() {
            // Neuen Button erzeugen
            buttonOK = new JButton("Ok");
            
            // Action Listener registrieren
            buttonOK.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    // Aufruf der internen Methode zur Eventbehandlung
                    buttonOkActionPerformed(evt);
                }
            });
            
            // <mor init code>
        }
        
        /** Event Methode */
        private void buttonOkActionPerformed(ActionEvent evt) {
            // Code der bei Button Klick ausgeführt wird
            // ...
            // Hier möchte ich nun _eigentlich_ keinen Code schreiben, 
            // der z.B. meine Datenstruktur in eine Datei schreibt 
            // oder sonstige Aufrufe auf externe Klasse machen...
        }
    }

    Frage bis hier: Ist das vernünftig?
    Oder sollte man selbst für das Hauptfenster eine eigene Controller-Klasse implementieren, die sich bei allen GUI Elementen des Hauptfensters als Listener registriert? Dann müsste man also der Hauptfenster Klasse logischerweise public Methoden spendieren, die die Listenerregistrierung an die internen GUI Elemente weitergeben, richtig!?
    Wäre das eine bessere Lösung oder gibt es noch eine Dritte? Wie wird das in der Praxis denn meistens gelöst?

    Um nicht schon alles vorweg zu nehmen, belasse ich es erst mal hierbei. Dennoch habe ich sicher noch mehr Fragen.

    Also... Wie strukturiert ihr denn so eure Anwendungen angefangen von der main-Methode bis zum GUI-Start?

    Zum Schluss: Ich entwickle mit Netbeans. Nutze dort den GUI Builder. Programmiere meist mit SWING.
     
    Freue mich über eine Bewertung oder ein Danke.

  2. #2
    genodeftest ist offline Mitglied Smaragd
    Registriert seit
    Jun 2009
    Beiträge
    1.023
    Hi
    1. Code-Design bei GUIs ist stark vom Framework abhängig. Wenn du dir SWT-Code ansiehts, sieht das aus wie C oder C++, entsprechend ähnlich den dort üblichen Programmierstilen.
    2. Hilfreich und sinnvoll ist das MVC-Modell, siehe https://en.wikipedia.org/wiki/Model–view–controller . MVC ist aber in Swing nur teilweise umgesetzt und auch unter Umständen schwierig zu realisieren.
    3. Ich würde das init-Zeug in den Constructor packen, es sei denn, Teile der Initialisierung müssen evtl. auch zur Laufzeit des Objekts noch mal durchgeführt werden. Ohne inits ist der Code übersichtlicher.
    4. zu der anonymen inneren Klasse in der init()-Methode: Eigentlich ist der Listener ein Teil des Controls (nach MVC) und damit nicht ideal im Modell aufgehoben. Außerdem sind nach manchen Code Conventions anonyme innere Klassen ungern gesehen. als Alternative würde ich dir eine „normale“, aber statische innere Klasse vorschlagen, die das Interface für den Listener implementiert.
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.

  3. #3
    Avatar von Fabio Hellmann
    Fabio Hellmann ist offline Mitglied Platin
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    528
    Hi,
    also ich für meinen Teil versuche GUIs so weit wie möglich mit MVC zu umzusetzen. Das funktioniert allerdings nicht immer. Aber in diesem Zusammenhang kann ich den Eventbus von Guava empfehlen. Damit geht das meiste viel einfacher.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Homepage: Fabio Hellmann
    Projekt: Student Organizer
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

Thema nicht erledigt

Ähnliche Themen

  1. CSS Design - Footer Code
    Von futufry im Forum CSS
    Antworten: 5
    Letzter Beitrag: 04.11.07, 13:59
  2. Code-Design Frage, jdbc und ResultSet
    Von DarthShader im Forum Java
    Antworten: 4
    Letzter Beitrag: 01.05.07, 17:17
  3. CSS Design - Code
    Von futufry im Forum CSS
    Antworten: 9
    Letzter Beitrag: 02.10.06, 12:04
  4. Trennung von Code und Design
    Von sisela im Forum PHP
    Antworten: 10
    Letzter Beitrag: 17.06.05, 18:13

Stichworte