AGB  ·  Datenschutz  ·  Impressum  







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

Result einer Funktion "Stil Frage"

Ein Thema von Jonas Shinaniganz · begonnen am 4. Nov 2012 · letzter Beitrag vom 5. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#1

Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 12:42
Wo grade schonmal eine ähnliche Frage gestellt wurde:
Ich habe mich schon vor einger Zeit gefragt, was in diesem Fall lesbarer / besser ist:

Delphi-Quellcode:
function Min(X1, X2 : Integer) : Integer;
begin
  if (X1 < X2) then
    Min := X1
  else
    Min := X2;
end;
VS

Delphi-Quellcode:
function Min(X1, X2 : Integer) : Integer;
begin
  if (X1 < X2) then
    Result := X1
  else
    Result := X2;
end;
Zum Einen ist es ersichtlich, was jetzt gesetzt wird. Also X1 ist Min finde Ich gut. Zum Anderen schreiben aber viele immer Result := ...

Wie ist dazu die Meinung?
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 12:49
IMHO würde ich immer Result nehmen.

Jeder Andere (ausser mir) der meinen Code dann mal lesen sollte sieht auf einen Blick, dass es sich hier um den Rückgabewert der Funktion handelt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 12:58
Alte Pascal-Compiler kannten das result-Schlüsselwort noch nicht.
Die alte Version mit dem Funktionsnamen ist mehr oder minder nur noch wegen der Altkompatiblität vorhanden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 15:50
Es gibt noch einen anderen Vorteil bei der Verwendung von Result: man kann es auch als Wert verwenden - das geht bei dem Funktionsnamen nicht.

Delphi-Quellcode:
Function Sum(const Values: TBytes): Integer;
var
  B: Byte;
begin
  Result := 0;
  for B in Values do
    Result := Result + B; // bei Sum statt Result meckert hier der Compiler
end;
Sollte die Funktion keine Parameter haben meckert er zwar nicht, produziert aber eine wohl unerwünschte Rekursion.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 16:53
3. Vorteil: man kann die Funktion problemlos umbenennen.
Verwendet man den Funktionsnamen anstelle von Result bringt jede Umbenennung einer Funktion zunächst Compilerfehler und dann lästiges Editieren mit sich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 17:52
Result ist immer besser.
- man erkennt genau was gemeint ist
- man kann mit dem Namen nicht rechnen
- und wenn man die Funktion umbenennt, muß man das auch immer mit anpassen

Rechnen:
In C wird meisten eine Hilfsvariable verwendet und das Ergebnis erst am Ende an RETURN übergeben.

In Delphi is t das nicht nötig, da man Result direkt verwenden kann, jedenfalls dann, wenn man nicht den funktionsnamen verwendet.

Delphi-Quellcode:
Result := 132;
...
Result := Result * 2;
...
end;
Am Beispiel von dem schon genannten "Sum" würd man schnell in einer Endlosschleife landen.
Denn "sum" wird nur bei Zuweisungen als Funktionsergebnis genommen und sonst ist es ein Aufruf.

Delphi-Quellcode:
Function Sum(const Values: TBytes): Integer;
var
  B: Byte;
begin
  Sum := 0; // entspricht Result :O 0;
  for B in Values do
    Sum := Sum + B; // hier würde es aber Result := Sum + B; sein, also ein rekursiver Aufruf
end;

Ach ja: Und das Result muß grundsätzlich immer initialisiert werden, selbst wenn man denkt, daß es bei String, dyn. Array und Interface auch ohne funtioniert.
Glaubt mir einfach, dem ist nicht so.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 22:00
Am Beispiel von dem schon genannten "Sum" würd man schnell in einer Endlosschleife landen.
Denn "sum" wird nur bei Zuweisungen als Funktionsergebnis genommen und sonst ist es ein Aufruf.

Delphi-Quellcode:
Function Sum(const Values: TBytes): Integer;
var
  B: Byte;
begin
  Sum := 0; // entspricht Result :O 0;
  for B in Values do
    Sum := Sum + B; // hier würde es aber Result := Sum + B; sein, also ein rekursiver Aufruf
end;
Das führt zunächst erstmal zu einem Compilerfehler, da Sum einen Parameter erwartet. Nur bei parameterlosen Funktionen kommt es zur Rekursion mit baldigem Stackoverflow (und nicht zu einer Endlosschleife).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 22:03
Und das Result muß grundsätzlich immer initialisiert werden, selbst wenn man denkt, daß es bei String, dyn. Array und Interface auch ohne funtioniert.
Und ich dachte immer, das lokale Variablen grundsätzlich initialisiert werden müssen, egal ob sie Result heißen oder Strings oder Interfaces sind. Selbst der Delph-Compiler dürfte doch eine Warnung ausgeben, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#9

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 22:12
Okay die Frage hat sich gelohnt Danke!
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Result einer Funktion "Stil Frage"

  Alt 4. Nov 2012, 22:39
Und ich dachte immer, das lokale Variablen grundsätzlich initialisiert werden müssen, egal ob sie Result heißen oder Strings oder Interfaces sind. Selbst der Delph-Compiler dürfte doch eine Warnung ausgeben, oder?
Nein, der Delphi-Compiler gibt leider nicht immer eine Warnung aus.

Praktisch gesehn werden "einfach" lokale Variablen nicht initialisiert, was man, im Prinzip, als eine Optimierung ansehn kann. (unnötiger/doppelter compilerseitiger Code)

Aber gewisse Typen, speziell alle, welche von Delphi eine automatische Speicherverwaltung bekommen haben, werden prinzipbedingt auch automatisch initialisiert, dazu zählen "lange" Strings (AnsiString, RawByteString, UTF8String und UnicodeString, aber keine ShortString), WideString, dynamische Arrays, Interfaces und der Variant, bzw. OleVariant.

Denn für die speicherverwaltung braucht es unbedingt einen definierten Grundzustand.


Der Witz daran ist, daß ein Result nicht immer eine lokale Variable ist, so wie man es vermuten könnte,
denn bei oben genannten Typen, ist das in Wirklichkeit kein "Result", sondern ein Var-Parameter.
Delphi verwaltet dieses Typen, sowie auch "größere" Array und Records als zusätzlichen Var-Parameter, welcher an die anderen Parameter angehängt wird.
Wo schlußendlich die "Result-Variable herkommt, ist also unklar.

Leider geht der Compiler nun, bei den genannten Typen, davon aus, daß diese somit initialisiert sind.
Welches aber gerade beim Result nicht "direkt" stimmt.

Die externe Variable wurde ordnungsgemäß initialisiert, aber, in Bezug auf die folgende Funktion, ist dieses nicht der Fall.
Delphi-Quellcode:
function Test: string;
begin
  Result := Result + 'abc';
end;

for i := 0 to 2 do
  S := Test;
ShowMessage(S);
Was für eine Message angezeigt wird, kannst du gerne ausprobieren.
(wenn es nicht zufällig eine Schleife wäre, dann wäre es natürlich "meistens" das 'abc')
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:44 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