AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Über den Umgang mit vielen optionalen Parametern
Thema durchsuchen
Ansicht
Themen-Optionen

Über den Umgang mit vielen optionalen Parametern

Ein Thema von Meflin · begonnen am 1. Apr 2010 · letzter Beitrag vom 2. Apr 2010
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 20:56
Thread zur Steigerung der Codequalität Nr. 2....

Ich denke fast jeder kennt das Problem... ich habe hier z.B. eine Funktion mit 4 optionalen Parametern (von denen 3 auch noch typgleich sind - Zahlen frei erfunden ). Mit dem klassischen Versuch:
Delphi-Quellcode:
function foo(a): z;
function foo(a, b): z;
function foo(a, b, c): z;
und der Weiterleitung der parameterarmen Funktionsrufen an die parameterreichen kommt man da schnell nicht mehr weiter - zumindest nicht schön.

Also habe ich mir überlegt... man erstellt sich einen Record mit einem Feld pro Parameter.
Delphi-Quellcode:
TParams = record
  paramAValue: integer;
  paramBValue: integer;
  paramCValue: integer;
  function paramA(i: Integer): TParams;
  ...
end;

TParams.paramA(i: Integer): TParams;
begin
  Result := Clone(self);
  Result.paramAValue := i;
end;
Verwenden könnte man das ganze dann so:
Delphi-Quellcode:
var
  params: TParams;
begin
  result := foo(params.paramA(1).paramF(120));
Allerdings ist das auch noch blöd, wegen der zwingend nötigen params-Variable. Die will man ja möglichst auch noch loswerden.

Ideal wäre also sowas (WAS LEIDER NICHT ZU GEHEN SCHEINT)
Delphi-Quellcode:
TParams = class
  paramAValue: Integer;
  ...
  function paramA(i: Integer): TParams;
  ...
  class function paramA(i: Integer): TParams;
Da könnte man dann auch schön beim Aufruf der Klassenmethoden die Felder mit default-werten belegen (denn das ist dann ja eindeutig die Stelle wo ein neues Objekt erzeugt wird). Verwenden könnte man es dann einfach so:
result := foo(TParams.paramA(5)); Nunja... das scheitert schon allein daran, dass man keine gleichnahmigen class/instance-Methods anlegen kann (Smalltalk kann das )

Soo... was haltet ihr allgemein von der Idee? Habt ihr irgendwelche anderen / besseren / zielführenderen?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 20:59
Dir ist schon klar, dass folgendes geht:

Delphi-Quellcode:
function foo(a: Integer; b: Integer = 0; c: Integer = 0): z;

foo(1);
foo(1,2);
foo(1,2,3);
?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

Re: Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:00
Zitat von Neutral General:
function foo(a: Integer; b: Integer = 0; c: Integer = 0): z;
Und wenn ich jetzt c angeben will, b aber nicht?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:01
Dann musst du in den sauren Apfel beißen und B doch angeben
Ich setze häufig genutzte Parameter dann eben ganz weit links in die Liste. Die am seltensten genutzten optionalen Parameter kommen dann weiter nach rechts.

Edit: Hab mir deinen Ansatz nicht genau angeschaut. Sieht aber nach Overkill aus.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#5

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:07
So mache ich es auch meistens, also wie Neutral General es sagte.
Dieses Konzept hier mit dem Record wird so ähnlich ja auch an vielen Stellen in Zusammenhang mit der WinAPI zum Beispiel angewendet - ist wohl etwas weniger Performant, das dann auch noch mit Klassen zu machen, aber...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#6

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:08
Zitat von Neutral General:
Edit: Hab mir deinen Ansatz nicht genau angeschaut. Sieht aber nach Overkill aus.
Es geht hier um ~5-45 Methoden die dieses Parameterset dann verwenden könnten. Für die ich sonst jeweils ~5-10 Überladungen erstellen müsste. Also nein, nicht wirklich Overkill...
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:16
Wenn Du so viele optionale Parameter hast, dann macht die Funktion aber mehr als sie sollte. Wieso bricht du dir denn einen ab und versuchst auf Deibel komm raus, so viel Funktionalität in eine Funktion zu packen?

Ich würde mir mal Gedanken machen, ob das der richtige Weg ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:22
Offiziell würde man für sowas wohl eine Parameter-Klasse erstellen
oder gleich die Funktion in eine eigene Klasse verfrachten und dann die Parameter extra behandeln (also Funktion ohne direkte Parameter).

Delphi-Quellcode:
var params: TParams;
result := foo(params.clear.paramA(1).paramF(120));
// oder
result := foo(TParams.Create.paramA(1).paramF(120));
Ansonsten vergiß nicht, daß du eventuell die ungenutzen Parameter auch so initialisieren mußt, so daß sie als ungenutzt erkennbar sind oder daß sie wenigstens mit einen Standardwert belegt sind.

In Clear oder Create würden dann erstmal alle Parameter initialisiert.
(Bei Strings wäre das ja kein Problem, da sie automatisch von Delphi mit '' initialisiert werden,
aber deine Beispielinteger hätten so, mit großer Wahrscheinlichkeit, undefinierte Zustände.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#9

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:23
Zitat von alzaimar:
Wenn Du so viele optionale Parameter hast, dann macht die Funktion aber mehr als sie sollte. Wieso bricht du dir denn einen ab und versuchst auf Deibel komm raus, so viel Funktionalität in eine Funktion zu packen?
Ich würde mir mal Gedanken machen, ob das der richtige Weg ist.
Ich mache mir ja grade Gedanken, weil es mir eben mit Michael's Methode absolut nicht mehr zielführend erscheint

Die Funktionen setzen im Endeffekt nur Requests an einen Webservice zusammen (so richtig viel kann ich nich dazu sagen... quasi-NDA) - machen also nicht sehr viel und eine Aufspaltung in weitere Funktionen wäre sinnlos. Der Service bietet halt nunmal diese Optionen an, die ich irgendwie in meinem Wrapper nach außen tragen muss.

Und genau darum geht es ja gerade: Wie.

Ein völlig gegenläufiges Konzept wäre es z.B., pro Funktion/Request-Typ eine Klasse anzulegen. Hat halt auch Vor- und Nachteile...
Zitat von himitsu:
Ansonsten vergiß nicht, daß du eventuell die ungenutzen Parameter auch so initialisieren mußt, daß sie als ungenutzt erkennbar sind oder daß sie wenigstens mit einen Standardwert belegt sind.
Alles, was nicht verwendet wird, könnte glaube ich problemlos mit einem Default-Wert belegt werden (also im Grunde bei Create).
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Über den Umgang mit vielen optionalen Parametern

  Alt 1. Apr 2010, 21:31
Ok, dann ist das Konzept der Parameterstrukturen zu empfehlen, und zwar mit definierten Default/ Don't Care - Werten. Hier könnten z.B. Variants zum Einsatz kommen, mit "Null" als Defaultwert.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:39 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