![]() |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Habt ihr übrigens gemerkt, dass die Binding Lösung auch die Typen Konvertierung von String in Int und wieder zurück übernimmt? ;) (mit nem kleinen Fehler im Demo seh ich gerade, negatives Ergebnis wird nicht richtig als signed Integer umgewandelt - fixed)
@divBy0: Beispiel müsste nach einem Update des svn repos nun fehlerfrei und erwartungsgemäß laufen. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Wie würde es denn anders funktionieren, besser: wo würde man es denn sonst noch einsetzen können? Integer werden automatisch zu Zeichenketten, Zeichenketten werden automatisch zu Bezeichnern. Das geht doch nicht mit rechten Dingen zu :twisted: |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Ist es in der realen Welt nicht oft so, dass sich manche Porgrammierer gegenseitig lobhudeln, weil sie ach so tollen Code geschrieben haben und man auch noch in manchen Foren zerrissen wird, wenn man etwas nicht nach dem höchsten Gut der Programmierkunst programmiert hat, jedoch dann, im Gegensatz dazu, oft Programme mit "miesem" Code jahrelang überleben und erfolgreich sind? :-)
Warum ich das sage: Gutes Codedesign ist zwar generell löblich, jedoch nicht immer der Schlüssel zum Erfolg. Oft trift sogar das Gegenteil zu: Die in kürzester Zeit hingewurschtelte "Quick'n dirty"-Lösung sichert einem oft genug den nächsten Auftrag vom gleichen Kunden :-D Ich arbeite derzeit z.B. sehr viel in php mit dem Zend-Framework....mag sein, dass das "gutes" MVC ist..allerdings ist die unübersichtlichkeit aufgrund der MVC_Struktur so extrem, dass die Produktivität m.E. völlig flöten geht und ich das ganze in "bösem" prozeduralen Code oder auch OOP-Code, der nicht so extrem getrennt ist, schon 10x geschrieben hätte und der Kunde nicht so lange warten müsste. Edit: Das ist nur meine Meinung! Um es nochmal zu verdeutlichen. :-) |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Zitat:
Hat eigentlich schonmal jemand in diesem Thread das Wort Unittests fallen lassen? Jaja, es gibt so tolle Sachen wie TestComplete, aber bei einer Trennung kann ich mal ebend meine Business Logik durchtesten ohne dass ich darauf angewiesen bin, dass ich in Edit4 dies eingebe, auf Button1 klicke und in ComboBox2 was auswähle. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Optimieren und aufräumen muss man irgendwann, ja, aber nicht unbedingt immer gleich sofort :-) |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Es muss jeder für sich entscheiden, ob er und sein Umfeld Nutzen davon hat, oder ob er "schludern" (nicht negativ gemeint) kann. Ich vergleich ein Programm oft mit einem Haus... und jeder kennt wohl den Begriff Pfusch am Bau. Aber bei Software meinen viele, dat sieht ja keiner, da kann ich ruhig alles zurechtpfuschen - "läuft ja". Zum Thema: Wer schonmal mit ExpressionBlend was gemacht hat, weiß, wie geil das sein kann, wenn man fein trennt zwischen GUI und Logik. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Ebenso, wie man ein Bauvorhaben totplanen kann oder sich bei Verwendung der aktuellsten und neuesten Technologie völlig verhaspelt, wird es in der praktischen Softwareentwicklung (betonung auf 'praktisch') eher so sein, das man nicht die allerneuesten Technologien verwenden wird, sondern die, die ihre Praxistauglichkeit über Jahre bewiesen haben. Ebensowenig wie man rumfrickeln darf (Quick'N Dirty wird mit Teeren'N Federn belohnt), sollte man so lange refaktorisieren, bis man Preise für Schonheit im Code erhält, wenn man dabei Budget, Deadline und die Geduld des Kunden aus den Augen verliert. Zwei Dinge sind wichtig (in meinen Augen): Bei der Arbeit werden nur erprobte Techniken und Pattern verwendet, in der R&D-Zeit allerdings sollte man sich ständig weiterentwickeln. |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Zitat:
|
AW: Trennung von GUI und Logik, wie geht ihr vor?
Zitat:
Delphi-Quellcode:
Es geht dabei um eine Datensatz-Suche. An dieser Stelle ist SuchDS völlig unbekannt. ZeigeDaten sieht so aus :
procedure TfrmSuch.btnZurueckClick(Sender: TObject);
begin if not SuchDS.Bof then begin SuchDS.Prior; ZeigeDaten; btnWeiter.Enabled := true; end else begin showmessage ('keine vorhergehenden Daten vorhanden !'); btnZurueck.SetFocus; btnZurueck.Enabled := false; btnWeiter.Enabled := true; end; end;
Delphi-Quellcode:
Das ist also quasi Nullnummer. :mrgreen: Da geht es ja darum, etwas zu suchen. Manchmal ist man zu weit und muss zurück oder umgekehrt. Das bleibt immer gleich. Egal, um was es geht. Die GUI ist also schon da. Die Logik wird später eben besetzt. Man nennt das auch OOP. :lol:
procedure TfrmSuch.ZeigeDaten;
begin end; |
AW: Trennung von GUI und Logik, wie geht ihr vor?
Es geht ja aber gerade darum, das zu trennen.
Du kannst Deine gesamten Daten und Zustände in Deiner Datenebene verwalten. Ebenso die Methoden, die die Geschäftslogik darstellen. Wenn Du Deine Datenebene als Objekt betrachtest, könntest Du z.B. über TFirma.MitarbeiterListe.BefördereMitarbeiter(5) irgendeine Aktion veranlassen. Dadurch wird der Mitarbeiter gleich noch in das Chefzimmer verschoben und bekommt das doppelte Gehalt. Das wäre dann die Geschäftslogik ;-) So, das Programm an sich funktioniert jetzt schon mal wunderbar. Jetzt müssen wir noch ein Formular basteln, das die Daten anzeigt und einen Beförderungsknopf erhält. Das ist auch schnell erledigt. Nun fehlt noch die Verbindung der beiden Ebenen. Mit DataBinding kann man eben zur Entwicklungszeit der ListBox die Mitarbeiterliste zuweisen (bestenfalls direkt im Objektinspektor per Aufklappliste) und dem Schalter die Beförderungsmethode. Letzteres ist u.U. schwieriger, da ja manchmal bestimmte Parameter übergeben werden müssen. DAS muss man dann sicher per Code regeln. Aber sonst muss es in der GUI nicht mehr viel Quelltext geben. Also ich habe Blut geleckt! :-) EDIT: Und wenn man mal auf die Idee kommt, das Projekt als Konsolenanwendung, als Webanwendung oder für FireMonkey ;-) lauffähig zu machen, muss man grundsätzlich nur die GUI ersetzen. Alles weitere bleibt in der Datenebene unverändert. Nur der Zugriff von außen wird verändert. Das ist eben bei einer "klassischen Delphi-Anwendung" so nicht möglich. Ebenso nicht spätere gravierende Umstrukturierungen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz