Autor Beitrag
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 16.06.16 10:12 
Servus,

Wenn das Thema hier nicht hin passt, wäre ich froh, wenn das ein freundlicher Moderator dort hin schiebt, wo es besser aufgehoben ist ^^


Ich stehe aktuell ein paar Tage vor der Abschluss-Präsentation meiner Ausbildung und überarbeite gerade meine Präsentation.
Dort müssen auch Herausforderungen/Probleme sowie deren Lösung aufgeführt werden.

Ein Problem, das ich gerne mit aufnehmen würde, ist folgendes:
Ich habe dynamisch aufgebaute Inhalte mit Funktionen, die sich unterhalb des UI-Layers befinden und daher auch keinen Zugriff darauf haben.
Es kann allerdings sein, dass diese Inhalte bzw. deren Funktionen Interaktion bzw. eine Entscheidung des Benutzers fordern.
Das Problem ist: Wie kann eine Funktion, die die UI nicht kennt, in der UI Interaktion mit dem Benutzer einleiten?

Meine Lösung sieht wie folgt aus:
Die Funktion bekommt ein Objekt, das diese zusätzlichen vom Benutzer eingegebenen Daten enthält.
Die Funktion macht auch bekannt, welchen Typen dieses Objekt haben muss.
In WPF kann ich nun für DataTemplates für die Typen definieren, die automatisch anhand des gebundenen Objekt-Typen ausgewählt werden.
Auf diese Weise kann die UI nachschauen, welche Daten die Funktion braucht, sie erfragen und anschließend für die Nutzung bereit stellen.

Meine Frage ist nun:
Wie kann ich das kurz und knapp in Worte fassen?
Ich möchte diese Lösung auf der Präsentation hervorgehoben darstellen, dafür ist aber nur wenig Platz und allgemein sieht zu viel Text einfach nicht gut aus.
Mündlich kann ich die Lösung anschließend immer noch erklären, aber ich benötige eine kurze Formulierung für diese Lösung, idealerweise ein Pattern-Name.

Hat da jemand eine Idee?


Beste Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 16.06.16 10:44 
Zitat:
Das Problem ist: Wie kann eine Funktion, die die UI nicht kennt, in der UI Interaktion mit dem Benutzer einleiten?


a.) In dem man der Funktion einen Delegaten/CallBack/Event mitgibt der von der Funktion geworfen wird und mit UI Interaktion zu füllen ist.
b.) In dem man der Funktion einen Handle auf ein Fenster mitgibt das die Funktion für die eigene Anzeige von UI als Parent benutzen kann.

Zitat:
Wie kann ich das kurz und knapp in Worte fassen?


Zumindest mit anderen Worten als du sie hier benutzt hast für deine Lösung. Das habe ich nämlich nicht verstanden ;)
Wenn du der Funktion die Daten mitgibst so wie du schreibst (das ist irgendwie normal :gruebel:) dann war die User Interaktion ja schon vor dem Aufruf es gibt also gar keinen Bedarf mehr für eine User Interaktion durch die Methode.

Zitat:
In WPF kann ich nun für DataTemplates für die Typen definieren, die automatisch anhand des gebundenen Objekt-Typen ausgewählt werden.


Wenn es ein Problem unterhalb der UI ist sollte es keinen Zusammenhang geben zu bestimmten WPF Funktionalitäten. Oder du hast die Trennung der Schichten nicht richtig hinbekommen.
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 16.06.16 12:05 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public interface IDataFetcher
{
    bool RequiresAdditionalData { get; }
    Type AdditionalDataType { get; }
    Task<object> FetchDataAsync(object additionalData);
}


So sieht das Interface aus.

Wenn jetzt die Daten gefetcht werden sollen, dann kann die UI anhand des Typs einen entsprechenden Dialog anzeigen und die Daten erfragen. Bei WPF ist das recht einfach gemacht, geht aber auch anders.
Über Events wird das schwieriger, weil das ganze asynchron abläuft. Aber auch dann bleibt die Frage: Wie kann man das kurz und knapp beschreiben?
Ich hab erst an das Wort "generisch" gedacht, aber das hat mindestens unter C# eine andere Bedeutung.


Mir geht es auch nur um die Formulierung, damit ich genug Probleme ansprechen kann.
Ich werde es auch nicht genau erklären, es geht nur um das kurze Andeuten "Da wurde eine Lösung gefunden) daher auch die Hoffnung, dass es ein Pattern gibt, was das ungefähr beschreibt.
Dann haben die nämlich wieder einen Begriff, nach dem sie im Fachgespräch fragen und den ich dann ausführlich erklären kann.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 16.06.16 12:44 
Aber wenn du vor dem Aufruf schon weißt, dass du noch mehr Daten brauchen wirst, warum ist das dann kein Parameter?

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 16.06.16 15:26 
Weil ich das nicht weiß

Für das Interface gibt es einige Implementierungen, die zur Laufzeit zusammen gesammelt werden.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 16.06.16 16:00 
Okay, also nochmal von vorn, ich glaub wir sind alle mehr von der Frage als vom Problem verwirrt :gruebel:

Du hast eine Methode, die irgendwelche Dinge tut. Die bekommt neben "normalen" Parametern auch ein Objekt mit diesem Interface, über das sie nach weiteren Daten fragen kann? Das wäre dann vergleichbar dem was Java macht, weil die ja keine Delegates/Callbacks haben. Wie auch immer das heißt :nixweiss:

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 16.06.16 16:33 
Ich habe oben genanntes Interface
Wenn ich die Methode ausführe, dann kann es in manchen Implementierungen sein, dass für die Ausführung der Methode Informationen notwendig sind, die der Benutzer eingeben muss.
Da ich bei der Nutzung des Interfaces nicht weiß, was das konkret für Daten sind, habe ich dem Interface zwei Properties gegeben, die 1. mitteilen, ob zusätzliche Daten notwendig sind und 2. welchen Typ diese Daten haben sollen.
In der UI habe ich dann den Typ und kann für jeden Typ ein ViewModel und die passende View schreiben. Das zusammen regelt dann die Abfrage der Daten.



Was ich nun brauche, ist eine möglichst kurze Formulierung oder einen Pattern-Namen, den ich für eine Kurzbeschreibung der Lösung verwenden kann.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 16.06.16 18:53 
Hey,

schreib doch einfach "Rückruf über Interface um benötigte Daten anrufragen". Da gibts bestimmt auch n Pattern für *google anwerf* Hm, auf die schnelle nix gefunden. Für mich is das ein Callback. Ob nu über ein Interface oder einen Methoden-Zeiger is ja erstmal irrelevant.

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 16.06.16 20:53 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,

schreib doch einfach "Rückruf über Interface um benötigte Daten anrufragen".

Schreib lieber "Callback über Interface um benötigte Daten anrufragen". Klingt schlauer. Du solltest es natürlich auf Nachfrage erklären können. Die Erklärung solltest Du Dir gedanklich schon mal zurechtlegen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 17.06.16 09:47 
"anzufragen"

Nicht, daß durch C&P so ein dummer Schreibfehler entsteht. ;-)
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 20.06.16 10:31 
Ich denke, ich werde das übernehmen - aber selber schreiben um Copy-Paste-Fehler zu vermeiden :D

Wie ich das erkläre, muss ich dann mal schauen.
Vermutlich werden sie sich sowieso auf so Begriffe wie "Entwicklungsmuster" oder "Inversion of Control" stürzen, davon hab ich ein paar mehr verteilt, damit ich damit punkten kann :D


Danke auf jeden Fall für die Hilfe ^^
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Di 21.06.16 19:45 
Wenn ich eine Methode definieren möchte, die Zugriff auf eine GUI hben soll, aber an dieser Stelle nicht feststeht welche Methoden die GUI dafür bereitstellen muss, würde ich einen einfachen Interface-Parameter festlegen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TuWasAbstraktMitGUI(const GUI: IInterface);
begin

end;

Natürlich benötigt man für konkrete Methoden, die Anfragen an die GUI stellen, ein konkretes Interface das diese Anfragen beschreibt:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
type
  IFrageDatum = interface(IInterface)
    ['{06EDEDDE-7F9E-4834-81B9-7B36CB5D0F3F}']
    function FrageDatum(var ADatum: TDateTime): Boolean;
  end;

  IProgess = interface(IInterface)
    ['{29EA65B3-924C-4022-A8DC-20428156C027}']
    procedure ProgressStart(AMaxValue: Integer);
    procedure Progress(ACurrentValue: Integer);
    procedure ProgressStop;
  end;

  procedure TuWasAbstraktMitDatum(const GUI: IInterface);
  var
    MyGUI: IFrageDatum;
  begin
    if GUI.QueryInterface(IFrageDatum, MyGUI) <> 0 then
      raise Exception.Create('...');

    TuWasMitDatum(MyGUI);     
  end;

  procedure TuWasAbstraktMitProgress(const GUI: IInterface);
  var
    MyGUI: IProgress;
  begin
    if GUI.QueryInterface(IProgress, MyGUI) <> 0 then
      raise Exception.Create('...');

    TuWasMitProgress(MyGUI);     
  end;

Wird z.B. ein Formular als GUI übergeben, sollte dieses nun beide Interfaces implementieren.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TMyForm = class(TForm, IFrageDatum, IProgess)
  private
    function FrageDatum(var ADatum: TDateTime): Boolean;
    procedure ProgressStart(AMaxValue: Integer);
    procedure Progress(ACurrentValue: Integer);
    procedure ProgressStop;
  end;

Ich hoffe das Prinzip ist verständlich, trotz Delphi-Code.
Palladin007 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Di 21.06.16 20:01 
Ja, das hätte ich auch machen können, allerdings würde das bedeuten, dass ich der GUI entsprechende Interfaces verpasse.
Mit XAML ist das dann schon etwas umständlich, außerdem würde dann wiederum das Business-Layer im View-Layer arbeiten, was ich nicht richtig finde.

Ich denke, die idealste Lösung, für den Problemfall wäre eine eigene kleine config-basierte Plugin-API, die dann die Implementierungen und dazu passende Views "zusammen pusselt".
Das wäre aber dann deutlich mehr Aufwand, was Zeit kostet, die ich nicht habe.

Aber für mich ist das jetzt eh zweitrangig, die Ausbildung ist zuende und ich arbeite in dem Betrieb nicht mehr. Das Projekt läuft und wird dann dort weiter gewartet. Das Feedback zum Aufbau war soweit auch gut - auf den Zeitrahmen gemessen, den ich hatte, die IHK schreibt ja offiziell 70 Stunden für alles vor, was unschaffbar ist :D
Ich hab noch ein anderes Projekt, an dem ich schon viel zu lange hänge und das ich endlich mal fertig kriegen will :D


Ich danke auf jeden Fall für die Hilfe ^^