Technisch kannst du machen was du willst, wie bereits geschrieben, es geht um Stil/Systematik.Erwin hat geschrieben: Hm... muss also dann wohl für mich selber entscheiden, wie ich es schreiben will?
Argumente hast du jetzt ja genug...
Technisch kannst du machen was du willst, wie bereits geschrieben, es geht um Stil/Systematik.Erwin hat geschrieben: Hm... muss also dann wohl für mich selber entscheiden, wie ich es schreiben will?
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 geltenmse 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
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:mse hat geschrieben: um Verwechslungen mit Adressen und Variablen zu vermeiden.
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;
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:Mathias hat geschrieben:Sowas ist schon fehleranfällig:Code: Alles auswählen
if a = b then WritelLn(a); WritelLn(b); Ichmachewas;
Code: Alles auswählen
if a = b
then b:= a+1;
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;
Hier sind Prozedur/Funktions-Variableninhalte und Adressen von Prozeduren/Funktionen gemeint welche ohne Klammer geschrieben werden müssen.kupferstecher hat geschrieben:Das ist jetzt ein anderes (berechtigtes) Argument. Aber wie notwendig ist das? Besser man verwendet aussagekräftige Namen.mse hat geschrieben: um Verwechslungen mit Adressen und Variablen zu vermeiden.
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.mse hat geschrieben:Hier sind Prozedur/Funktions-Variableninhalte und Adressen von Prozeduren/Funktionen gemeint welche ohne Klammer geschrieben werden müssen.
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
Nur in $mode objfpc/fpc. In Delphi funktioniert das anders (mit @@)Mathias hat geschrieben:
Aber eine Ausnahme gibt, bei rekursiven Funktionen.
TP unmöglich, weil BP7 dies nicht übersetzt.Ältere Pascal Kompiler dürften eine Deklaration mit () nicht akzeptieren. (Ist eine Delphi oder spätere Turbo Pascal version erweiterung)
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?mse hat geschrieben:Hier sind Prozedur/Funktions-Variableninhalte und Adressen von Prozeduren/Funktionen gemeint welche ohne Klammer geschrieben werden müssen.
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?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.
War dies nur beim Aufruf so, oder auch bei der Erstellung?marcov hat geschrieben:Ältere Pascal Kompiler dürften eine Deklaration mit () nicht akzeptieren. (Ist eine Delphi oder spätere Turbo Pascal version erweiterung)
TP? Turbo Pascal, vermute ich mal? BP7? Borland Pascal 7? Also Delphi 7? Kann das sein?Mathias hat geschrieben:TP unmöglich, weil BP7 dies nicht übersetzt.
Nein umgekehrt.Und Du sagst wiederum, BP7 hätte es ohne Klammer nicht übersetzt? Verstehe ich das jetzt richtig?
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?Mathias hat geschrieben:Nein umgekehrt.Und Du sagst wiederum, BP7 hätte es ohne Klammer nicht übersetzt? Verstehe ich das jetzt richtig?Code: Alles auswählen
WriteLn; // geht WriteLn(); // geht nicht
Stimmt da hast du recht, so weis man nicht, ob Test eine Variable oder eine Funktion ist.So ist dann immer deutlich zu erkennen, dass eine Procedure/Funktion aufgerufen wird.
Code: Alles auswählen
i := Test;
Was nicht passiert, wenn man mal anfängt Bezeichner mit vernünftigen Namen zu versehen.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;
Code: Alles auswählen
CurrentData := GetTestData;
Code: Alles auswählen
CurrentData := TestData;
Da muss ich zustimmen, vielfach werden unlogische Namen für Funktionen verwendet. Ein Set und Get ist immer gut.Was nicht passiert, wenn man mal anfängt Bezeichner mit vernünftigen Namen zu versehen.
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.Mathias hat geschrieben:Mir kommt momentan nicht mal einer Funktion ohne Parameter in Sinn...