AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Softwareentwicklung im Allgemeinen Projektplanung und -Management Gibt es ein Design-Pattern für den Programm-Status?

Gibt es ein Design-Pattern für den Programm-Status?

Ein Thema von mh18058 · begonnen am 20. Okt 2021 · letzter Beitrag vom 2. Nov 2021
Antwort Antwort
Seite 1 von 2  1 2   
mh18058

Registriert seit: 21. Nov 2008
15 Beiträge
 
#1

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 20. Okt 2021, 23:09
Hallo,
vielen Dank für eure schnellen Antworten.

@Rollo62
Ich hätte gerne den Durchblick!
Spaß beseite:
Mein Erklärbeispiel war vielleicht zu einfach. In Wirklichkeit ist es sehr umfangreich geworden mit vielen peinlichen Zugriffen auf die Statusvariablen.
Der Status ist ja ein globaler Zustand auf den ich überall, also auch lokal, reagiere.
Und da hab´ ich beim letzten Projekt einfach den Überblick verloren, was da wann wie wo gesetzt und ausgewertet wird.

Vielleicht war meine Frage nach Design-Pattern auch ungeschickt gestellt, weil ich zur Laufzeit garkeine neuen Objekte erzeuge.
Vielmehr ist es die Frage nach einer strukturierten Ordnung in Sachen Status.
Ich habe den Verdacht, daß ich die Komplexität beim Status anfänglich einfach unterschätzt habe und dadurch so schleichend Schludercode entstanden ist.

Ja, Statemaschine hatte ich aufgemalt und daraus immerhin die einzelnen Stati hergeleitet. Das war ja schon mal was!
Soweit ich das im Moment beurteilen kann, ist "Stateless" von SirRufo ein Gerüst an das man seine Programmfeatures dranhängen kann.
Klar, in meinem Fall sicher mit Kanonen auf Spatzen geschossen, aber wenn ich damit dann immer genau weiß in welchem Status das Programm ist, soll´s mir recht sein.
Das nächstes Delphi-Projekt ist ein UserInterface für einen Fortran-Numbercruncher. Da könnte "Stateless" ein geeigneter Weg sein.
Ich werde mir das mal genauer ansehen und dann nochmal in mich gehen ... das Thema ist noch nicht erledigt ...

Danke euch auf jeden Fall für eure prompte Hilfe.
Gruß
Martin

Geändert von mh18058 (20. Okt 2021 um 23:11 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 00:28
Hallo,
wenn es unbedingt ein Pattern sein soll:
Singleton

1 einzelnes Objekt mit je einem Property je Status,
dazu Get- und Set-Methoden.

Um rauszufinden, wo ein Status gesetzt wird,
reicht dann ein Breakpoint auf die Set-Methode.
Heiko
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.197 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 07:23
Das ist doch eigentlich überhaupt nicht Ungewöhnliches. Außer dass ich nicht verstehe, wo auf einmal globale Variablen notwendig geworden sind.

Bau dir doch erst einmal ein einfaches Objekt das den Zustand regelt. Werde dir über die Zustände (TEingabeZustand = (warteAufErsteEingabe, eingabeFalsch, datenWerdenVerarbeitet, ...) ) klar und setze die Zustandsübergänge um (.eingabeWarRichtig() , eingabeWarFalsch() , ...).

Wenn das alles stimmt fehlt doch nur noch, dass deine Oberfläche (TForm/TFrame) die Änderung des Zustands mitbekommt und entsprechend darauf reagiert. Heißt: Dein Formular muss dein eben gebasteltes Zustands-Objekt kennen, und nicht dein Zustands-Objekt deine Formulare.

Wie man auf Änderungen reagiert ist im Endeffekt genauso wie ein OnClick bei einem TButton , dein Zustandsobjekt bietet ein Event an, und deine Oberfläche hängt sich an das Event dran. Wie man das konkret umsetzt gibt es viele Möglichkeiten, aber über "Publish / Subscribe" sollte man zu dem Zeitpunkt schonmal etwas gelesen haben.
  Mit Zitat antworten Zitat
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
183 Beiträge
 
Delphi 12 Athens
 
#4

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 08:01
Observer-Pattern in Verbindung mit einem Singleton für den Status?
Udo Treichel
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.197 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 08:06
Was habt ihr dauernd mit euren Singletons?

Warum sollte man z.B. nicht eines Tages mehrere Tabs haben wo man mehrere dieser Bearbeitungsvorgänge gleichzeitig machen kann? Tut doch keinem weh...
  Mit Zitat antworten Zitat
mh18058

Registriert seit: 21. Nov 2008
15 Beiträge
 
#6

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 10:33
Hallo,
wow an der Diskussion sehe ich, daß meine Frage vielleicht doch nicht so "aus der Welt" war.

Singleton für ein Statusobjekt macht für mich schon Sinn! Schließlich gibt´s immer nur einen Status für einen Zustand. Das ist Fakt.
Allerdings macht der Aufwand für ein Singleton nur Sinn, wenn zur Laufzeit neue Stati hinzukommen und man mit dem Singleton verhindern will, daß ein Status zweimal existiert. Das kann bei einer späteren Verwendung des Statusobjekts aber durchaus vorkommen. Mit Singleton wäre es also zukunftssicher.

Das ist doch eigentlich überhaupt nicht Ungewöhnliches. Außer dass ich nicht verstehe, wo auf einmal globale Variablen notwendig geworden sind.

Bau dir doch erst einmal ein einfaches Objekt das den Zustand regelt. Werde dir über die Zustände (TEingabeZustand = (warteAufErsteEingabe, eingabeFalsch, datenWerdenVerarbeitet, ...) ) klar und setze die Zustandsübergänge um (.eingabeWarRichtig() , eingabeWarFalsch() , ...).

Wenn das alles stimmt fehlt doch nur noch, dass deine Oberfläche (TForm/TFrame) die Änderung des Zustands mitbekommt und entsprechend darauf reagiert. Heißt: Dein Formular muss dein eben gebasteltes Zustands-Objekt kennen, und nicht dein Zustands-Objekt deine Formulare.

Wie man auf Änderungen reagiert ist im Endeffekt genauso wie ein OnClick bei einem TButton , dein Zustandsobjekt bietet ein Event an, und deine Oberfläche hängt sich an das Event dran. Wie man das konkret umsetzt gibt es viele Möglichkeiten, aber über "Publish / Subscribe" sollte man zu dem Zeitpunkt schonmal etwas gelesen haben.
Ich denke da liegt für mich der Schlüssel dafür den Status übersichtlich in den Griff zu bekommen. Danke an "Der schöne Günther"!

Habe inzwischen erneut recherchiert und folgendes Interessantes gefunden (komisch, warum erst jetzt?):
https://sourcemaking.com/design_patterns/state
https://sourcemaking.com/design_patterns/state/delphi
Source: http://sourcemaking.com/files/sm/CsvParser.pas

Ich stecke zwar noch im Tunnel, aber im Tunnel gibt´s nur noch zwei Richtungen: vorwärts oder zurück! Also vorwärts ...
Grüße
Martin

Geändert von mh18058 (21. Okt 2021 um 10:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 14:13
Observer-Pattern
Genau das - anstatt von überall den global state auszulesen und vermutlich Code zu verstreuen, der nach dem Ändern dessen entsprechende Aktualisierungen anstößt gibt in diesem Fall die Import-Komponente die Möglichkeit, sich über Ereignisse (Import erfolgreich/fehlgeschlagen) benachrichtigen zu lassen und dann entsprechend zu reagieren.

Und Events sollten einem Delphientwickler ja nicht neu sein - denn genau das ist im Kern das Observer-Pattern. Einer sagt, dass was passiert ist und ein anderer reagiert darauf.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.170 Beiträge
 
Delphi 12 Athens
 
#8

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 14:38
Möglich wäre auch TMessageManager, davon habe ich unzählige im Dauereinsatz.
Die Messages können wunderbar und ohne Probleme in alle Richtungen verteilt werden, wenn man etwas auf die Threadsicherheit achtet.
Damit läuft quasi mein ganzer App-Unterbau völlig problemlos, und entkoppelt die ganzen Module.

Aber die Diskussionen gegen Singleton verstehe ich auch nicht immer ganz.
Ich habe doch eine MainForm, da könnte ein Status drauf verwaltet werden, ist das nicht auch schon ein "Singleton" ?
Irgendwo muss doch am Ende der "Publisher" persistent sein, damit alle "Subscriber" von ihm informiert werden können.
Ist der "Publisher" dann nicht auch ein Singleton ?
Gerne arbeite ich auch mit Singleton-Klassen der Art "class procedure TDingi.Instance.MachWas; static;", mit einer class var als Instance,
ja das ist definitiv ein Singleton, na und ?

Ich verstehe ja das es GRUNDSÄTZLICH besser ist per Immutable und Messages zu kommunizieren,
aber am Ende muss doch irgendwer, irgendwo immer noch den "State" halten.
Nach meinem simplifiziertem Verständnis ist das doch dann immer ein "Singleton" im weitesten Sinne, und sei es die DB,
oder eine Fileressource, die geteilt werden muss.
Ich halte es z.B. da wo ich Initial den State konfiguriere, und dann an mehreren Stellen auslesen kann, und nur im UI Thread lebt, für durchaus tragbar,
wenn ein Messaging zu aufwendig wäre (Ok, das Faulheitsargument ).

Mein Fazit: Singleton möglichst vermeiden, aber es kann auch gute Gründe geben sowas zu verwenden.
Gundsätzliches Verteufeln ist auch eine schlechte Angewohnheit

Geändert von Rollo62 (21. Okt 2021 um 14:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 21. Okt 2021, 14:56
Die meisten wissen nicht, worum es eigentlich geht und wiederholen nur, was sie mal irgendwo gehört haben.

Das Problem bei global state (egal, ob einzelne globale Variablen oder ein fest verdrahtetes Singleton) ist, dass man eher schwerlich entkoppelt testen kann. Wenn Komponente/Klasse/Funktion X hartverdrahtet Y.Irgendwas referenziert, dann muss ich in einem Test immer dafür sorgen, dass Y.Irgendwas auch den richtigen wert für den Testvorgang enthält. Misko Hevery erklärt in seinem Guide recht gut, warum sich daraus Probleme ergeben, sowohl technischer Natur als auch vom Verständnis her, wenn man sich die API von X anschaut, welche möglicherweise nix über ihre "geheime" Interaktion mit Y sagt.

Zudem macht er einen Unterschied zwischen "Singleton" und der "singletoness" - beim Singleton, wie oft implementiert (je nach Sprache mehr oder minder einfach zu realisieren) geht es darum, komplett zu verhindern, dass jemand jemals eine andere Instanz als die einzig wahre erstellen kann (technische Limitierung). Bei der "singletoness" geht es darum, dass es von der Semantik der Anwendung nur eine Instanz gibt. Es steht aber nicht im Weg, zum Testen selbst eine Instanz davon zu erzeugen, um sie für den Test mit entsprechenden Daten zu versorgen, etc oder gar auszumocken.

Am Beispiel von TMessageManager erklärt: Wenn ich in meinem Code überall einfach TMessageManager.DefaultManager.SubscriptToMessage oder SendMessage aufrufe, dann habe ich mich an den Singleton gebunden. Nehme ich über den ctor oder eine Eigenschaft eine TMessageManager Instanz entgehen, mit der ich interagiere, dann habe ich diese Abhängigkeit entfernt bzw "aufgeweicht", denn ich kann von außen steuern, mit welcher TMessageManager Instanz die Komponente kommuniziert.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (21. Okt 2021 um 15:03 Uhr)
  Mit Zitat antworten Zitat
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Gibt es ein Design-Pattern für den Programm-Status?

  Alt 30. Okt 2021, 15:17
Wäre vielleicht eine message loop, post/send message etwas passendes?
(deleted. Siehe post rollo62, zu spät gesehen )

Geändert von Sequitar (30. Okt 2021 um 15:20 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:23 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-2025 by Thomas Breitkreuz