Weil wir:
- unseren Code mit verschiedenen Delphi Versionen übersetzen wollen und hierfür Änderungen nötig sind.
- Funktionalitäten an- und abschalten wollen.
- auf die Prozessor Struktur reagieren müssen. (32/64 Bit)
- auf unterschiedliche Betriebssystem reagieren müssen...
Gibe es hier nicht bessere Lösungen?
Na Klar...
Nicht für alle 4 Punkte...
Um es einfach zu sagen: Die RTL macht es vor!
Über die Plattform-Dienste werden die eigentlichen Implementationen je nach Plattform registriert und der Rest linked gegen ein Interface...
Wenn es gut genug ist für dir RTL - sollten wir dieses Designpattern auch in unseren Applications anwenden.
Aber was ist, wenn wir kein IFDEF nehmen können, weil wir zur Laufzeit entscheiden müssen?
Klar nen IF auf eine Variable wird jeder sagen!
Ich mache es so (vereinfacht für das Beispiel! Im eigentlich Code passe ich das Ganze noch an den Text an):
type
TMyOSPlatform = (Windows, OSX, iOS, Android);
TOSPlatforms = Set of TMyOSPlatform;
Procedure InitFMX;
begin
TGetByID
Function (Const Prop : String) : Single
begin
Case TFDKHelper.CaseSelector
{0} 'WIDTH',
{1} 'HEIGHT',
{2} 'MARGINLEFT' ]) of
0 : Result := 121;
1 : Result := 22;
2 : Result := 40;
end; // of case
end);
TGetByID
Function (Const Prop : String) : Single
begin
Case TFDKHelper.CaseSelector
{0} 'WIDTH',
{1} 'HEIGHT',
{2} 'MARGINLEFT' ]) of
0 : Result := 128;
1 : Result := 24;
2 : Result := 40;
end; // of case
end);
TGetByID
Function (Const Prop : String) : Single
begin
{0} 'WIDTH',
{1} 'HEIGHT',
{2} 'MARGINLEFT' ]) of
0 : Result := 138;
1 : Result := 24;
2 : Result := 40;
end; // of case
end);
TGetByID
Function (Const Prop : String) : Single
begin
Case TFDKHelper.CaseSelector
{0} 'WIDTH',
{1} 'HEIGHT',
{2} 'MARGINLEFT' ]) of
0 : Result := 140;
1 : Result := 28;
2 : Result := 40;
end; // of case
end);
ByPlatform :=
Function (Prop : String) : Single
begin
Result := TGetByID
end;
Procedure Whatever;
begin
Button.Width := ByPlatform('Width');
Button.Height := ByPlatform('Height');
Button.Margins.Left := ByPlatform('MarginLeft');
end;
So ist der Zugriff im Code einfacher!
No comments:
Post a Comment