Der beste Weg, eine rubin GUI-Anwendung zu entwerfen ist visualruby zu verwenden:
http://visualruby.net
Sie Ihre GUI von Ihren Klassen völlig getrennt machen.Zum Beispiel, Wenn Sie eine GUI für die folgende Klasse erstellen möchten, können Sie es leicht tun, ohne sie zu stören:
class DataObject
def initialize(name, address, email, phone)
@name = name
@address = address
@email = email
@phone = phone
end
end
Sie erstellen eine GUI für diese Klasse von Subklassen es, und das Hinzufügen der GUI:
class DataObjectGUI < DataObject
include GladeGUI
def show()
load_glade(__FILE__) #loads glade/DataObjectGUI.glade into @builder
set_glade_all() #populates glade controls with insance variables from DataObject
show_window()
end
end
Die GladeGUI-Schnittstelle enthält alle GUI-Magie. Die Methode load_glade() lädt die Datei DataObject.glade. Dies ist ein Lichtformular, das Gtk :: EntryBoxes namens, Name, Adresse, Telefon und E-Mail enthält. Das Formular wird auf dem Bildschirm mit allen ausgefüllten Feldern angezeigt.
Offensichtlich wird das Fenster show_window() auf dem Bildschirm erscheinen. Das Zerstörungsfenster wird automatisch von GladeGUI aufgerufen, wenn Sie auf die Schaltfläche "x" klicken.
Dieses Designmuster kann für jede Klasse verwendet werden. Ein gutes Beispiel ist, wenn Sie eine ActiveRecord-Klasse haben und den Datensatz auf dem Bildschirm anzeigen möchten. Du unterscheidest einfach wie oben, und es ist editierbar und speicherbar.
Dieses Beispiel stammt aus einem der Beispielprojekte auf visualruby.net.
+1 für die grundlegende Definition von Entwurfsmustern. – strager
Ich denke etwas in der Perspektive. Die Tatsache, dass ich viel Code in meiner Fensterklasse habe, scheint mir eine ziemlich schlechte Übung zu sein, denn wenn ich es so halte, wird es meiner Meinung nach schwieriger sein, es zu pflegen. – Geo
In diesem Fall ist das Problem möglicherweise nicht ein Mangel an Designmustern an sich, sondern eher ein insgesamt schlecht geeignetes Design. Können Sie einen Beispielcode posten (entweder hier oder in einem neuen Thread)? – JoshJordan