[gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: Procedure ohne Var dennoch mit oder ohne '()'?

Beitragvon mse » 25. Jun 2018, 10:05 Re: Procedure ohne Var dennoch mit oder ohne '()'?

Erwin hat geschrieben:Hm... muss also dann wohl für mich selber entscheiden, wie ich es schreiben will?

Technisch kannst du machen was du willst, wie bereits geschrieben, es geht um Stil/Systematik.
Argumente hast du jetzt ja genug...
mse
 
Beiträge: 1986
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon kupferstecher » 25. Jun 2018, 13:40 Re: Procedure ohne Var dennoch mit oder ohne '()'?

mse hat geschrieben:Nicht unbedingt Geschmackssache sondern Stil/Systematik. Meiner Meinung nach sollten Codeelemente die das gleiche machen auch immer gleich aussehen. Ein Funktions/Prozedur Aufruf hat zwingend Klammern wenn Parameter übergeben werden sollen, darum sollten auch Aufrufe ohne Parameter mit Klammern geschrieben werden

Die Klammer zeigt an, dass da noch was kommt. Wenn aber nichts mehr kommt, sind die Klammern nicht nur überflüssig, sondern kontraproduktiv, sie stören (meinen) Lesefluss. Das Argument lasse ich also nicht gelten :)
Dass man aber bei Funktionsaufrufen ohne Parametern mit oder ohne Klammern immer im gleichen Stil bleiben sollte, da stimme ich zu.

mse hat geschrieben: um Verwechslungen mit Adressen und Variablen zu vermeiden.

Das ist jetzt ein anderes (berechtigtes) Argument. Aber wie notwendig ist das? Besser man verwendet aussagekräftige Namen. Über Properties ruft man oft Prozeduren/Funktionen auf, die als Variable getarnt sind. Grundsätzlich sollte man aber zu viele Nebenläufigkeiten in einem Ausdruck vermeiden. Daher mag ich auch so ein (eher wieder c-typisches) Konstrukt nicht:
Code: Alles auswählen
if FileDialog.Execute then OpenFile;
//besser
status:= FileDialog.Execute;
if status then OpenFile;
//Noch besser (wenn man die Funktion selber programmiert)
FileDialog.Execute(Status);
if status then OpenFile;

Hier steht die Aktion FileDialog.Execute im Vordergrund und nicht die logische Abfrage. Aber das ist natürlich auch Geschmakssache.

Unter Fortran ruft man Prozeduren über den Befehl "call" auf (unabhängig davon ob es Parameter gibt oder nicht), das finde ich prinzipiell auch nicht schlecht.


Mathias hat geschrieben:Sowas ist schon fehleranfällig:
Code: Alles auswählen
if a = b then
  WritelLn(a);
  WritelLn(b);
Ichmachewas;


Ich halte das den Anforderungen entsprechend flexibel. Ich kann Code besser formatieren wie ein Programm, da ich den Sinn und Zweck meines Codes kenne (meistens). Aber, wenn ich ohne begin..end arbeite, kommt das 'then'- Schlüsselwort immer in die Zeile mit dem Befehl, also:

Code: Alles auswählen
if a = b
then b:= a+1;


Da passiert dann auch nichts. Übrigens genauso bei for..do.

Hier ein Beispiel aus einem tatsächlichen Projekt:
Code: Alles auswählen
procedure TAudioPlayback.Play(Sender: TObject);
begin
  if fPlaying then EXIT;
  if length(AudioData) < 5 then EXIT;
 
  fPlaying:= true;
  DataIndex:= -1;
 
  if assigned(ShowPlaying)
  then TThread.Synchronize(TThread.CurrentThread,ShowPlaying);
 
  StartPlayback;   
 
end;
 
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon mse » 25. Jun 2018, 13:51 Re: Procedure ohne Var dennoch mit oder ohne '()'?

kupferstecher hat geschrieben:
mse hat geschrieben: um Verwechslungen mit Adressen und Variablen zu vermeiden.

Das ist jetzt ein anderes (berechtigtes) Argument. Aber wie notwendig ist das? Besser man verwendet aussagekräftige Namen.

Hier sind Prozedur/Funktions-Variableninhalte und Adressen von Prozeduren/Funktionen gemeint welche ohne Klammer geschrieben werden müssen.
mse
 
Beiträge: 1986
Registriert: 16. Okt 2008, 09:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0) | 
CPU-Target: x86,x64,ARM
Nach oben

Beitragvon Warf » 25. Jun 2018, 14:06 Re: Procedure ohne Var dennoch mit oder ohne '()'?

mse hat geschrieben:Hier sind Prozedur/Funktions-Variableninhalte und Adressen von Prozeduren/Funktionen gemeint welche ohne Klammer geschrieben werden müssen.


Da FPC typstreng ist, sowie das addressieren von Funktionsergebnissen nicht unterstützt werden all die Fehler aber zur Compilezeit entdeckt, was ein paar minuten mehrarbeit bedeutet, aber nicht zu irgendwelchen Signifikanten Fehlern führen kann.
bsp:
Code: Alles auswählen
function Foo: Integer; begin Result := 42; end;
 
var Bar: function: Integer;
  i: Integer;
begin
  Foo; // Kein fehler
  Bar := @Foo; // kein Fehler
  Bar := Foo; // Compilerfehler
  Bar; // Kein Fehler
  i := Bar; // Compilerfehler
 

Während es zwar 2 mögliche Kompilerfehler gibt, kann es keinen Semantischen Fehler geben. Daher ist es mMn. egal wie man es macht. Ich lass die Klammern am liebsten weg, da es einfach weniger tippaufwand ist. Problematisch kann es nur werden wenn man mit Funktionspointern arbeitet und die Ergebnisse Castet z.B. i := IntPtr(Bar); das sind aber Sonderfälle die zumindest bei mir so selten vorkommen, das ich grade nicht mal weiß ob ich solchen Code überhaupt je schonmal geschrieben habe
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon marcov » 25. Jun 2018, 14:54 Re: Procedute ohne Var dennoch mit oder ohne '()'?

Mathias hat geschrieben:

Aber eine Ausnahme gibt, bei rekursiven Funktionen.


Nur in $mode objfpc/fpc. In Delphi funktioniert das anders (mit @@)

Ältere Pascal Kompiler dürften eine Deklaration mit () nicht akzeptieren. (Ist eine Delphi oder spätere Turbo Pascal version erweiterung)
marcov
 
Beiträge: 1032
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon Mathias » 25. Jun 2018, 17:37 Re: Procedure ohne Var dennoch mit oder ohne '()'?

Ältere Pascal Kompiler dürften eine Deklaration mit () nicht akzeptieren. (Ist eine Delphi oder spätere Turbo Pascal version erweiterung)

TP unmöglich, weil BP7 dies nicht übersetzt.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Erwin » 25. Jun 2018, 19:58 Re: Procedure ohne Var dennoch mit oder ohne '()'?

Da schwirrt mir ja jetzt ganz schön der Kopf. Danke.
Und obendrein hat jeder auch noch für seine Schreibweise Argumente?!

mse hat geschrieben:Hier sind Prozedur/Funktions-Variableninhalte und Adressen von Prozeduren/Funktionen gemeint welche ohne Klammer geschrieben werden müssen.

Ist damit jetzt auch mein Beispiel gemeint? Oder gibt es Sonderfälle, wo man keine Klammern verwenden darf, wenn keine Daten übergeben werden. Anderseits klingt dies ja anderweitig logisch, das wenn keine Variablen vorhanden sind, dass man erst gar nicht den "Eindruck erwecken" sollte, es könnte was da sein. Anderseits könnte es ja sein, dass generelle nachgeschaut werden muss, und somit anderweitig das fehlen der Klammer es erschwert?

Warf hat geschrieben:Da FPC typstreng ist, sowie das addressieren von Funktionsergebnissen nicht unterstützt werden all die Fehler aber zur Compilezeit entdeckt, was ein paar minuten mehrarbeit bedeutet, aber nicht zu irgendwelchen Signifikanten Fehlern führen kann.

Genau das ist es, was ich teils befürchte: Dass die eine oder andere Schreibweise doch verkehrt ist, aber in dem Fall der Compiler dies dann schon richtet, also dennoch richtig in Maschinensprache (?) "übersetzt". Was ich aber in dem Fall nicht unbedingt für eine gute Idee halte (falls der Compiler dies ausbügelt). Man ist ja doch eh gewöhnt, alles total richtig schreiben zu müssen? Und dennoch gibt es paar Ausnahmen, wo es scheinbar egal ist?

marcov hat geschrieben:Ältere Pascal Kompiler dürften eine Deklaration mit () nicht akzeptieren. (Ist eine Delphi oder spätere Turbo Pascal version erweiterung)

War dies nur beim Aufruf so, oder auch bei der Erstellung?

Mathias hat geschrieben:TP unmöglich, weil BP7 dies nicht übersetzt.

TP? Turbo Pascal, vermute ich mal? BP7? Borland Pascal 7? Also Delphi 7? Kann das sein?
Und Du sagst wiederum, BP7 hätte es ohne Klammer nicht übersetzt? Verstehe ich das jetzt richtig?

Also so langsam glaube ich auch, dass es egal ist. Nicht weil ich davon überzeugt wäre, dass dem wirklich so ist. Aber langsam bin ich davon überzeugt, dass man nicht ohne weiteres wirklich feststellen kann, was richtig ist, und von daher ... bevor es gar nicht mehr weiter geht, ... .
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon Mathias » 25. Jun 2018, 21:22 Re: Procedure ohne Var dennoch mit oder ohne '()'?

Und Du sagst wiederum, BP7 hätte es ohne Klammer nicht übersetzt? Verstehe ich das jetzt richtig?

Nein umgekehrt.
Code: Alles auswählen
WriteLn;    // geht
WriteLn()// geht nicht
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Erwin » 26. Jun 2018, 09:13 Re: Procedure ohne Var dennoch mit oder ohne '()'?

Mathias hat geschrieben:
Und Du sagst wiederum, BP7 hätte es ohne Klammer nicht übersetzt? Verstehe ich das jetzt richtig?

Nein umgekehrt.
Code: Alles auswählen
WriteLn;    // geht
WriteLn()// geht nicht

Dieses Beispiel ist jetzt aber keine eigene Prozedure? Und müsste man da nicht sogar eine Variable zum Ausgeben übergeben? Das finde ich ja sehr verwirrend? Scheint da ja fast schon so zu sein, dass obwohl was übergeben werden muss, es dennoch darauf verzichten kann, vorausgesetzt dass auch auf die Klammern verzichtet wird. Für mich ist das somit eher ein Sonderfall. Also Ein entweder Alles: ('WriteLn(Text)') oder gar Nichts ('WriteLn'), es aber kein Halb-Halb erlaubt ('WriteLn()'). Was meiner Meinung nach in dem Fall auch Sinn macht. Weil wenn man schon dann Klammern macht, dann kann man bei dem Befehl auch davon ausgehen, dass man der Funktion/Prozedure was übergeben will, und dies der Schreiber eben vergessen hat?

Habe mal meine 5 Bücher zu Delphi überflogen. Nur in einem großen Wälzer zu Delphi 7 fand ich halbes Dutzend an Prozedure-Beispiele ohne Werteübergabe. Der Autor hat all diese komplett ohne Klammern geschrieben. Bei der Erstellung und Aufruf. Hm... . Also doch ohne Klammern?

Werde jetzt ohne Klammern schreiben. Zum einen wird dadurch der Code etwas kürzer, und zum anderen hoffe ich mal, dass der Compiler es ebenso handhabt, also überall an Code spart, und ich somit mit dem im Einklang bin?

Schade dass sich da überall totaler Wildwuchs durchsetzt hat. Bei der Gestaltung und Form, wäre es noch ok. Aber nicht wenn es um Befehle geht, finde ich.
Win 7 / Lazarus 1.6 / FP 3.0.0 / x86_64-win64-win32/win64
Erwin
 
Beiträge: 216
Registriert: 16. Sep 2009, 13:15
OS, Lazarus, FPC: Xubuntu 16.04 / x86_64_linux-gtk 2 / L 1.6+dfsg-1 / FPC 3.0.0 | 
Nach oben

Beitragvon Thandor » 3. Jul 2018, 16:50 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Also ich schreibe die Klammern immer mit, auch wenn ichg nichts übergebe, denn gerade bei größeren Projekten kann es sein, dass mann nach Jahren nicht mehr jede Funktion oder Procedure beim Namen kennt. Erst recht nicht, wenn diese aus fremden Units kommen. So ist dann immer deutlich zu erkennen, dass eine Procedure/Funktion aufgerufen wird.

Probleme hatte ich damit noch nie.
Thandor
 
Beiträge: 118
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 3. Jul 2018, 16:55 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

So ist dann immer deutlich zu erkennen, dass eine Procedure/Funktion aufgerufen wird.

Stimmt da hast du recht, so weis man nicht, ob Test eine Variable oder eine Funktion ist.
Code: Alles auswählen
i := Test;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 3. Jul 2018, 17:07 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Mathias hat geschrieben:Stimmt da hast du recht, so weis man nicht, ob Test eine Variable oder eine Funktion ist.
Code: Alles auswählen
i := Test;

Was nicht passiert, wenn man mal anfängt Bezeichner mit vernünftigen Namen zu versehen.

Code: Alles auswählen
CurrentData := GetTestData;


Code: Alles auswählen
CurrentData := TestData;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 3. Jul 2018, 17:14 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Was nicht passiert, wenn man mal anfängt Bezeichner mit vernünftigen Namen zu versehen.
Da muss ich zustimmen, vielfach werden unlogische Namen für Funktionen verwendet. Ein Set und Get ist immer gut.
Zum Glück, gibt es sehr selten Funktionen, welche keine Übergabeparameter brauchen. Mir kommt momentan nicht mal einer Funktion ohne Parameter in Sinn, ausser bei eine Getter welcher in einer Class verwendet wird und da nimmt man sowieso eine property.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Thandor » 3. Jul 2018, 17:16 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Da hast du natürlich recht. Da bemühe ich mich auch immer sehr...

ABER bei fremden Units hat mann nicht immer Einfluss auf die Namensgebung und alleine schon desshalb habe ich mir angewöhnt einheitlich die Klammern immer mit zu setzen beim Aufruf.
Thandor
 
Beiträge: 118
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 3. Jul 2018, 17:26 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Mathias hat geschrieben:
Mir kommt momentan nicht mal einer Funktion ohne Parameter in Sinn...
Na ja, Pi und Random sind werden doch häufig gebraucht. Und Pi() wäre doch äußerst ungewöhnlich! Ich denke, viele wissen noch nicht einmal, daß das eine Funktion ist.
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

» Weitere Beiträge siehe nächste Seite »
VorherigeNächste

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried