AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Allgemeines Interface

Ein Thema von s.h.a.r.k · begonnen am 29. Aug 2011 · letzter Beitrag vom 29. Aug 2011
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Allgemeines Interface

  Alt 29. Aug 2011, 09:53
Guten Morgen zusammen

Ich weiß nicht so recht, wie ich das Problem denn nennen soll, da ich noch nie so recht mit Schnittstellen gearbeitet habe. Bisher habe ich auch immer recht spezifische Klassen geschrieben, ebenso war das Applikations-Design nicht unbedingt allgemein gehalten. Das wird jetzt nach und nach geändert, ist ja auch im Sinne von OOP

Ich habe im Moment folgende abstrakte "Startup"- und Applikations-Klasse, die ich für meine Anwendungen nutzen will -- TApHandledObject fügt einem TObject via AllocateHwnd nur ein Handle hinzu, um kommunizieren zu können.
Delphi-Quellcode:
TCustomApplicationController = class abstract(TApHandledObject)
private type
  TCustomStartupLoader = class abstract
  public type
    TCustomRequest = class abstract
    end;

    IRequestHandler = interface
      // GUID
      procedure Process(Request: TCustomRequest);
    end;
  private
    FApplicationController : TCustomApplicationController;
    FThread : TThread;
  protected
    procedure Execute(); virtual; abstract;
    procedure Request(Request: TCustomRequest); virtual;
  end;

private
  FStartupLoader : TCustomStartupLoader;
public
  constructor Create(); override;
  destructor Destroy();
end;
Ich habe folgende "Vision": der ApplicationController startet den StartupLoader-Thread der in der Execute-Methode -- asynchron zum MainThread -- alle möglichen Jobs erledigt, die die Anwendung zum Start benötigt: applikationsweite Einstellungen setzen, Log initialisieren, allg. Einstellungen laden, Datenbankverbindung aufbauen, evtl. auch Business-Objekte aus DB laden etc. Während des Startups zeigt der ApplikationsControlelr einen SplashScreen an, oder macht einfach gar nichts.

Was aber, wenn z.B. die Zugangsdaten für die Datenbank nicht korrekt sind? Einfach eine GUI einblenden kann ich ja nicht, da die Jobs ja asynchron zum MainThread laufen. Die Idee hier ist, dass der StartupThread ein Request an den MainThread schickt, dieser den Request entsprechend bearbeitet und eine Antwort zurück schickt.
Code:
MainThread --+--> Zeige SplashScreen ------------> Frage User nach ---------------------------------------> Zeige MainForm
             |                                ^    Zugangsdaten      |                                 ^
             |                                |                      |                                 |
             | Starte                         | Request              | Antwort                         |
             |                                |                      |                                 |
             v                                |                      v                                 |
       StartupThread --> JobA --> JobB --> Problem --> Warten ----------> Problem lösen --> JobC --> Fertig
Und hier will ich nun eine Schnittstelle bauen, die wie folgt agieren soll:
Code:
StartupThread ------------------> ApplicationController ------------------> RequestHandler
                TCustomRequest                           TCustomRequest         |
                                                                                | bearbeitet
                                                      <-------------------------+
                                                        und schickt zurück
Der StartupThread erzeugt ein TCustomRequest-Objekt, welches je nach Problem anders aussieht. In meinem DB-Beispiel beinhaltet dieses z.B. die Eigenschaften: Hostname, Database, Username, Password. Dieses Objekt schickt der StartupThread an den ApplicationController, der wiederrum eine Liste an registrierten Handlern hat und das Objekt an den passenden Handler weiterleitet. Implementiert dieser Handler das Interfac IRequestHandler, so kann der Request bearbeit und zurück an den StartupThread geschickt werden.

Klingt ja alles ganz schön und könnte so auch funktionieren, aber ist das auch okay so? Würdet ihr sowas anders lösen? Gibts Optimierungspotential?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Allgemeines Interface

  Alt 29. Aug 2011, 10:31
Hallo,

Einfach eine GUI einblenden kann ich ja nicht, da die Jobs ja asynchron zum MainThread laufen.
Kommt sicher auf das Design an, aber du könntest dem Job ja diese Abfrage der Daten für die DB per Synchronized machen lassen. Dann kannst du die GUI schon aufrufen. Entspricht nach meinem empfinden dem KISS-Prinzip. Der Job für sich kann nicht fort gesetzt werden, ohne die Daten. Er muss also darauf warten. Somit auch auf eine Zeitscheibe des Mainthreads für die GUI-Aktionen.

Meine Sicht der Dinge.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Allgemeines Interface

  Alt 29. Aug 2011, 11:32
Sieht mir ganz nach Command pattern aus.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

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

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Allgemeines Interface

  Alt 29. Aug 2011, 12:46
Ja das Befehlspattern würde sich hier sicherlich anbieten.

Der MainThread startet den StartUpThread, während er selbst in den Initialisierungs-Zustand geht (z.B. visuell dargestellt als Splashscreen).

So der StartUpThread führt nun alle ihm zguedachten Operationen durch, falls dabei irgendetwas am Mainthread geschehen soll, schickt er z.b. eine RequestUserData-Message an seinen Owner.

Dieser muss dann natürlich wissen wie er darauf reagieren soll, z.B. wenn er IRequestHandler besitzt.

Sobald dann die Submit-Message oder so kommt, wechselt der MainThread in den Initialisiert-Zustand.

Also eigentlich eine Kombination aus Command-Pattern und Zustandshandling, wie auch schon Stevie angedacht hat.

MfG Alaitoc
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Allgemeines Interface

  Alt 29. Aug 2011, 12:51
Ich hab irgendwie das Gefühl, dass ich all meine Problem von hinten aufrolle und alle Patterns "selbst" erfinde: Ich liefere ein Problem und bekomme Pattern-Vorschläge geliefert

Danke Jungs!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz