2009-03-08 14 views
13

Ich möchte gerne einige Meinungen zur Hand Codierung Ihrer GUIs wie man es normalerweise tun, wenn Java oder Qt mit C++, vs mit einem GUI-Designer-Tool tun? Beispiele für GUI-Designer-Tools wären MFC GUI-Designer, Qt-Designer, Interface Builder (Apple).Handcode-GUI oder GUI-Designer-Tool verwenden

Ich war ein Fan von Hand-Codierung, aber aus den jüngsten Erfahrungen habe ich gewechselt. Das Problem, das ich bei der Handcodierung gesehen habe, ist, dass es ziemlich schnell und flexibel ist, die GUIs zu schreiben, aber sobald Sie eine GUI ändern müssen, die vor langer Zeit geschrieben wurde, kann es sehr schwierig sein. Das richtige Element in einem großen Panel zu finden, kann schwierig sein.

Das zweite Problem ist, dass es viel zu einfach ist, viel Logik in der GUI-Erstellung und Layout-Code hinzuzufügen. Ich musste oft die Wartung von GUI-Code übernehmen, der wirklich schwer wiederzuverwenden ist, weil sein Verhalten mit seinem Aussehen vermischt ist und das Layout und das Verhalten von Mixen die Klasse oft sehr groß und schwer verständlich macht.

Die Verwendung eines GUI-Designer-Tools erzwingt eine viel klarere Trennung zwischen Aussehen und Logik.

Antwort

4

Ich bin der festen Überzeugung, dass Sie einen Interface Builder verwenden sollten, anstatt eine GUI manuell zu programmieren. Wie in der Frage erwähnt, ist es eine viel sauberere Trennung und sobald etwas bearbeitet werden muss, ist es viel einfacher.

Der Qt Designer bekam diese Funktion eine Klasse aus einer .ui Datei 1) zu schaffen, aber ich denke, dass diese Funktion nicht verwendet, ist der beste Weg, da dies schafft nur mehr codiert, die nicht existieren sollten . Das Geschwindigkeitsproblem beim Erstellen des Fensters aus einer .ui -Datei ist vernachlässigbar, da das Fenster nur einmal geladen werden muss.

Dies ist PyQt, aber etwas Ähnliches ist möglich, in C++:

class SelectDateDialog(QDialog): 
    def __init__(self): 
     QDialog.__init__(self) 
     uic.loadUi("resources/SelectDate.ui", self) 

Wesentliches dies die gleiche Wirkung wie mit allen UI-Code in die __init__() Methode hat, aber die UI fast vollständig von der getrennt Code.

1).ui Dateien sind XML-Dateien, die eine Benutzeroberfläche

+0

Ja, das ist meine bevorzugte Vorgehensweise bei der Verwendung von Qt. Sehr dynamische UI Ich werde Hand Code, aber ich werde versuchen, an einen Designer für den Rest zu bleiben. Die Transformation und XML-Datei, wenn die Bibliothek geändert wird, sollte auch viel schneller sein als die Umwandlung von C++ - Code, der eine GUI beschreibt. –

2

Es hängt von der Situation wirklich ab. Ich denke, beide haben ihren Platz, und ich verwende normalerweise einen hybriden Ansatz.

Es gibt immer einige Dinge, die der GUI-Builder nicht ausführen kann (z. B. die Farbe in UIcholor-Konstante in Interface Builder festlegen). Auf der anderen Seite ist der Großteil der UI-Arbeit ziemlich banal (zum Beispiel statische Labels hinzufügen).

Ich bevorzuge die banalen Sachen im GUI-Builder und die interessanteren Dinge im Code.

Außerdem finde ich gelegentlich, dass ich das XML, das vom GUI-Generator (Interface Builder und Lichtung in meinem Fall) erzeugt wurde, manuell bearbeite.

+0

Ich denke GUIs sollten in etwas leicht lesbar wie XML definiert werden, so dass Sie es von Hand ändern können, wenn Sie müssen. Der Vorteil von XML im Vergleich zu z. C++ - Code ist, dass es vom Designer leicht analysiert werden kann. –

3

Lustig genug ist es umgekehrt für mich gegangen. Aus der Sicht von Winforms ist der Code, der vom Designer erzeugt wird, ziemlich laut, wobei vielleicht ein Viertel oder die Hälfte aller Eigenschaftseinstellungen wirklich notwendig sind. Das Erstellen von ziemlich großen Steuerelementen ist auch eine Versuchung bei der Arbeit mit einem Designer. Das Ändern einer Hierarchie von Steuerelementen im Winforms-Designer ist in meinen Augen ein Albtraum.

In meinem letzten Projekt habe ich zusätzliche APIs erstellt, um Splitter in Formularen, Dockmanagern, Menüs, Symbolleisten usw. deklarativ einzurichten. Dies ist so, dass sie die Trennung von Bedenken weiter verstärken werden.

Ich versuche auch, viel mehr auf Auto-Layout-Funktionen zu verlassen, die zwar in WPF viel schöner sind, aber auch in Windows Forms.

+0

Ich stimme Ihren Kommentaren zu Geräuschen, die durch die Verwendung von Buildern entstehen, vollkommen zu. Dies trifft auch auf Java zu - man endet normalerweise mit Dutzenden von JLabels als Felder Ihrer Klasse, obwohl sie niemals wirklich benötigt werden. –

+0

Ich glaube nicht, dass das vom Designer erzeugte Rauschen eine Rolle spielt, solange Sie diesen Code als Blackbox behandeln und nicht in irgendeiner Weise per Hand bearbeiten müssen. Vorzugsweise sollten GUIs zur Laufzeit durch Parsen einer Auszeichnungssprache erstellt werden. Z.B. XML wie XAML, XUL (Firefox) oder Qt Designer XML. –

0

Meine Meinung dazu: 1. Hand codierte Code GUI ist viel mehr wiederverwendbar 2. Layout-Probleme einfacher sind mit Designer

3

ich Ihnen dringend, auf OS X Interface Builder verwenden würde empfehlen, es zu tun durch Hand ist in Ordnung, wenn Sie lernen wollen, aber Sie werden sich eine Menge Kopfschmerzen ersparen, indem Sie es bei tatsächlichen Projekten verwenden. Es ist wirklich sehr mächtig.

Wie für Java und C++, hängt es davon ab, was Sie tun und auf welchen Plattformen. Für einfache Anwendungen können Sie den UI-Code nie sehen. Bei komplizierten Anwendungen und Rich Clients müssen Sie jedoch in der Regel einen Teil des Codes manuell ausführen.

15

Ich würde immer von Hand-Code des GUI-Design, wo es keine Standard (oder de-facto-Standard) GUI-Auszeichnungssprache (wie bei Java). Der Grund dafür ist, dass ich festgestellt habe, dass Sie mit einem GUI-Builder-Design-Tool an die Verwendung einer bestimmten IDE gebunden sind. Im Laufe der Zeit wird sich die beste IDE für GUI-Design und/oder Code ändern und jedem Entwickler sollte frei sein, die IDE zu wählen, die sie am wohlsten fühlen mit.

Wo ich im Moment arbeite, haben wir viele Legacy-GUIs, die mit NetbeansMatisse GUI-Builder geschrieben wurden (entgegen meiner Empfehlung zu der Zeit :-). Diese sind jetzt fast nicht mehr zu erreichen, da alle Entwickler entweder IntelliJ IDEA oder Eclipse als ihre IDE bevorzugen. Es ist nicht realistisch oder praktikabel, wenn Entwickler Netbeans nur zum Ändern des GUI-Layouts starten (Leute halten die Netbeans-Projektdefinitionen nicht synchron usw.).

Ein weiterer Punkt ist, dass die gesamte Zeit Schreiben GUI Layout Code ist wahrscheinlich nur 5% der gesamten Entwicklungsaufwand eines gegebenen Projekts. Selbst wenn es doppelt so lange dauert, den Code selbst zu schreiben, übersetzt sich dies nicht so sehr in den großen Plan der Dinge. Und es ist ein kleiner Preis für langfristige Wartbarkeit.

Solange Sie sich über die Trennung der GUI-Layout-Logik von der Geschäftslogik im klaren sind, glaube ich nicht, dass irgendetwas darunter leidet. Niemand hier verwendet GUI-Builder mehr!

+2

Ich denke nicht, dass dies ein gutes Argument gegen GUI-Designer im Allgemeinen ist. Es ist ein Argument dagegen, wie Java-IDEs normalerweise ein GUI-Design erstellen. Die GUI sollte in einer Auszeichnungssprache gespeichert und zur Laufzeit erstellt werden, damit Sie nicht mit nicht generiertem generiertem Code fertig werden. oder mache Qt mit uic. –

+1

stimme ich voll und ganz zu. Wenn Java ein IDE-unabhängiges GUI-Markup hätte (was entweder ein Standard- oder ein De-facto-Standard wäre), würde ich es gerne verwenden. Ich denke immer noch, dass ich mit GridBaglayout die gleichen Ergebnisse erzielen konnte :-) –

+0

Oh. netter Kommentar und nettes Denken :) – hqt

6

Ich mache es von Hand, es ist viel einfacher, Dinge herum zu mischen und Panels innerhalb der Anwendung wieder zu verwenden (einige Panels können an mehreren Stellen erscheinen).

Mit einem Designer arbeiten, wenn Sie in einem Team sind, die Künstler sollen die GUI tun.

Das richtige Element in einem großen Panel zu finden, kann schwierig sein.

?? Das habe ich noch nie gesehen.

+0

Angenommen, Sie haben ein Panel mit mehr als 50 Elementen, das in mehrere Layers von Layout-Managern, Sub-Widgets, Tabs usw. eingefügt wurde. Und Sie müssen ein Element von einem Layout-Manager in einen anderen verschieben. Sie hatten nie Probleme, den richtigen Layout-Manager zu finden? Oh, und du hast dieses Panel nicht programmiert. Jemand anderes tat es. –

+1

Ich sage nicht, dass es unmöglich ist, nur ungewöhnlich (in meiner Erfahrung). Vielleicht liegt es daran, dass ich meinen GUI-Code einfüge, um das Layout widerzuspiegeln, manchmal helfen die einfachen Dinge am meisten. –

+2

@Adam Es klingt einfach nach schlechtem Code für mich. – Draemon

1

Ich denke, die richtige Antwort hängt von der Kultur der Zielplattform ab. Unter OS X ist der Interface Builder so ein integraler Bestandteil der Werkzeugkette, dass es schwer zu vermeiden ist.

In Java (AWT oder Swing) ist das Gegenteil der Fall. Es gibt keine Toolchain-Unterstützung dafür.

Wirklich, die Art, wie Sie sagen können, ist die Art, wie die Werkzeuge ihre Ausgaben produzieren. Interface Builder erzeugt Dateien im .nib-Format, die spezifisch dafür sind, wie Cocoa Steuerelemente auf dem Bildschirm platziert. Es versteht, was im Wesentlichen ein Interface-Markup-Format ist. Java hat kein ähnliches Konzept. Alles ist eine kompilierte Klasse und daher ist es viel schwieriger, praktische Ergebnisse zu erhalten.

GTK +, wenn es mit Lichtung kombiniert wird, scheint ein vernünftiges Gleichgewicht zwischen den beiden zu treffen.

1

Nichts verhindert die Vermischung der beiden Ansätze. Ich mache oft das Hauptlayout eines Formulars in einem GUI-Designer (weil es schnell ist und Sie sehen, was Sie tun), und fügen Sie dort ein oder mehrere Panels ein, die dann mit Code gefüllt werden. Dies ist besonders nützlich, wenn die GUI an bestimmte Situationen angepasst werden muss - zum Beispiel, wenn sich die GUI entsprechend der angeschlossenen Hardware ändern muss.

In jedem Fall ist es in der Tat am wichtigsten, GUI und Anwendungslogik getrennt zu halten.

0

Hand-Codierung gut sein kann beschreiben, wenn Sie in Ihnen UI einige Nicht-Standard-Funktionen enthalten sein sollen. Sie haben mehr Flexibilität, aber Sie müssen mehr Zeit investieren, um eine gute Oberfläche zu erstellen, da Java/C++ keine Sprache ist, die auf das UI-Design abzielt.

Auf der positiven Seite, wenn Sie eine Revisionskontrolle haben, können Sie die Geschichte der Änderungen, etwas, das nicht mit einem Design, das ein Binärformat verwendet, oder ein XML-Format, das nicht RCS freundlich ist.

Heutzutage fehlen den meisten verfügbaren Tools zur visuellen Gestaltung einer Benutzeroberfläche einige Funktionen. Sie sind nicht flexibel genug, einige Eigenschaften können nur erreicht werden, indem sie codiert werden. In einigen Fällen ist der generierte Code auch nicht wirklich benutzerfreundlich, und wenn Sie manuell modifizieren, können Sie den Designer möglicherweise nicht mehr verwenden.

Aber die entworfene kann wirklich eine Zeitersparnis sein, wenn das Design einfach ist, und wir können hoffen, dass Designer in Zukunft verbessert werden, aber ich werde nicht durch Breite halten.

Meine Schlussfolgerung ist, wenn Sie heute Flexibilität benötigen, müssen Sie von Hand die Schnittstelle programmieren, wenn Sie etwas Einfaches und Schnelles dann wollen, ist Designer die beste Wahl.

Vielleicht werden die Designer in Zukunft mächtiger sein, oder vielleicht werden neue Sprachen auf das UI-Design spezialisiert sein, die sich besser für den Einsatz in C++/Java eignen, etwa XUL oder XAML.

2

Wenn Sie eine Geschäftsanwendung mit vielen Eingabe- und Tabellendaten entwickeln, ist das Schreiben von Code für Ihre Benutzeroberfläche sowohl schneller als auch wartungsfreundlicher als die Verwendung eines UI-Designers. Bei solchen Anwendungen muss fast nie ein Element an einer vordefinierten Stelle auf dem Bildschirm platziert werden. Auf der anderen Seite gibt es eine Vielzahl von Wiederholungs- und Entwurfskonventionen, die einfach in separate Methoden extrahiert werden können.

Nehmen Sie zum Beispiel einen Eclipse- oder OpenOffice-Einstellungsdialog. Es gibt eine Reihe von Kategorien und eine Reihe von verschiedenen Optionen für jeden. Wenn Sie etwas von dieser Größe machen müssen, ist die Gestaltung jedes Bildschirms eine banale Aufgabe. Ein viel besserer Ansatz besteht darin, Code zu schreiben, der Benutzeroberflächenelemente aus bereitgestellten Domänendaten im Einklang mit einigen Konventionen und Standardwerten erzeugt.

Ich sehe nicht, wie die Verwendung eines Designers eine bessere Trennung erleichtert, noch, wie diese wahrgenommene Trennung bei irgendetwas helfen würde, da Sie Ihre Geschäftslogik bereits aus der Benutzeroberfläche heraushalten.

Und schließlich, wenn Sie Java verwenden, achten Sie darauf, MigLayout zu überprüfen. Es funktioniert mit Swing und SWT, seine Syntax ist sehr übersichtlich und klar, und es hat einen Debug-Modus, der unglaublich nützlich ist.

+0

Ich stimme zu, dass für sehr dynamische GUIs, z. solche, die aus Modelldaten generiert werden können, dann ist Handcodierung besser. Aber ich denke, das ist ein Sonderfall. –

+0

Hängt von der Nische ab, in der du arbeitest, denke ich. Die Mehrheit der UIs, die ich schreibe, sind viel besser für die Handcodierung geeignet: Reihen von Handels- und Zahlungsdaten, verschiedene Arten von Berichten, Hinzufügen/Ändern von Optionen usw. – javashlook

Verwandte Themen