![]() |
Delphi-Version: 10 Seattle
Styleguide für Parameteranordnung
Gibt es eigentlich ein Styleguide oder ein "best practice" für die Anordnung von Parametern?
Lieber so:
Delphi-Quellcode:
function getNames(aNames:TStrings;aBirthdayFrom:TDatetime;aBirthdayTo:TDatetime):boolean;
oder so:
Delphi-Quellcode:
function getNames(aBirthdayFrom:TDatetime;aBirthdayTo:TDatetime;aNames:TStrings):boolean;
Ich erwische mich immer wieder dabei, daß ich nicht wirklich eine klare Linie bei der Anordnung von Parametern habe. Wie ist es bei euch? |
AW: Styleguide für Parameteranordnung
Ich versuche die bei ähnlichen Funktionen in der selben Reihenfolge zu haben (ich habe z.B. bei diesen AnsiText-Funktionen ständig die Parameter vertauscht, da mal der SubText zuerst oder mal zuletzt kommt), ansonsten ist das doch sehr von den Parametern und deren Zweck abhängig.
|
AW: Styleguide für Parameteranordnung
Ich denke mal es ist üblicher, dass die Rückgabewerte hinten stehen (also Beispiel 2).
Ich glaube so mache ichs auch immer (wobei ich nie so genau darauf geachtet habe dass ich jetzt für diese Aussage meine Hand ins Feuer legen würde :mrgreen: ) |
AW: Styleguide für Parameteranordnung
Zitat:
Delphi-Quellcode:
function getNames(aNames:TStrings;aBirthdayFrom:TDatetime = 0;aBirthdayTo:TDatetime = 90000):boolean;
Dann muss ich das Ergebnis nach vorne setzen, weich ich die Default-Parameter ja ggf. weglassen möchte. |
AW: Styleguide für Parameteranordnung
Na gut, da kannste dann halt auch nix machen :mrgreen:
|
AW: Styleguide für Parameteranordnung
Generell ist es wirklich üblicher die Ausgabeparameter hinten zu haben. Auf SO fragt sich auch jemand über die Parameter-Ein/Ausgabe-Reihenfolge und wie Default-Parameterbelegungen damit zusammenhängen. [1]
Interessant da der Verweis aus den eigentlich sehr schönen Google C++ Style Guide - Das trifft ja auf Delphi alles ebenso zu. Das Ergebnis ist da dass Standard-Parameterbelegungen eh böse sind. Das Hauptargument ist dass der Parameter halt wirklich da ist und man keine Funktionszeiger damit belegen kann. Also so etwas:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; procedure myProcedure(const someValue: Integer = 42); begin WriteLn(someValue); end; var someProcedure: TProcedure; begin someProcedure := myProcedure; // << E2009 Inkompatible Typen: 'Liste der Parameter ist unterschiedlich' end; end. [1] ![]() |
AW: Styleguide für Parameteranordnung
Ich liebe es Default-Werte für Parameter zu geben, zumindest vorübergehend. So kann ich eine Parameterliste erweitern, ohne daß der Code kaputt geht. Mit der Zeit ziehe ich dann alle Aufrufe nach und ergänze die fehlenden Parameter. Gibt es eigentlich eine FixInsight Prüfung für fehlende Parameter im Aufruf? Das wäre eventuell ne coole Sache.
Sherlock |
AW: Styleguide für Parameteranordnung
Zitat:
Mittlerweile verwende ich aber eher "overload". Damit bin ich sogar noch etwas flexibler. Mit "deprecated" kann ich dann auf die veraltete Procedure hinweisen und nach und nach die alte Version entfernen. Ohne FixInsight. Nachteil ist, daß ich den Default-Wert nicht wirklich im Interface-Bereich sehe und immer in die Implementation springen muss.
Delphi-Quellcode:
procedure myProcedure;overload;
procedure myProcedure(const someValue: Integer);overload; implementation procedure myProcedure; begin myProcedure(42); end; procedure myProcedure(const someValue: Integer); begin WriteLn(someValue); end; |
AW: Styleguide für Parameteranordnung
Zitat:
Delphi-Quellcode:
Schon geht es...
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TDPTest = reference to procedure( const Arg: Integer = 42); procedure myProcedure(const someValue: Integer = 42); begin WriteLn(someValue); end; var someProcedure: TDPTest; begin someProcedure := myProcedure; someProcedure; end; end. |
AW: Styleguide für Parameteranordnung
Zitat:
Aber ich habe meine eigenen Regeln und daran halte ich mich... AOwner / AParent 1. Parameter wenn es beide gibt Owner first. Letzter Parameter (Wenn nicht default Parameter) dann ist es die Proc<T> Out Parameter so weit nach hinten wie es geht. Ansonsten Reihenfolge gemäß Datengröße (Nicht unbedingt die eigentlich) Selbst wenn ein TObject nur ein Pointer ist und ein String ggf. als Daten übergeben werden... TObject, String, Integer, Boolean // Da die Strings, Integer und Booleans i.d.R. die Kontrolle über die Verwendung von TObject regeln.. Ausnahmen: Selecting String, selecting Interfaces Beispiel:
Delphi-Quellcode:
oder
Procedure Foo(AKunde : TKunde; AInvoce : TProc<TKunden>;Const SaveWhere : String);
Delphi-Quellcode:
Procedure Foo(AKunde : TKunde; ASaveLogic : ICanSaveKunden);
Aufruf:
Delphi-Quellcode:
oder
begin
if RESTServer then begin Foo(LKunde,Procedure (AKunde : TKunden) begin AKunde.LastUser := AktUser; AKunde.Compress; end,'SaveAsJason'); end else begin Foo(LKunde,Procedure (AKunde : TKunden) begin AKunde.LastUser := AktUser; AKunde.DataFormat := AktDoc2XML; end,'SaveAsStream'); end; end;
Delphi-Quellcode:
Mavarik
var
SaveAs : String; begin if RESTServer then SaveAs := 'SaveAsJson' else SaveAs := 'SaveAsStream'; Foo(LKunde,TAnyFactory.Default.CreateObj<ICanSaveKunden>(SaveAs)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 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 by Thomas Breitkreuz