Kleinteilige Funktionen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Kleinteilige Funktionen

Beitrag von m.fuchs »

braunbär hat geschrieben:
m.fuchs hat geschrieben:Richtig, deswegen das ganze in eine eigene Funktion auslagern.

Warum sollte man für eine einfache if-Abfrage mit je einer Zuweisung im then- und im else Zweig eine eigene Funktion machen? Meinst du wirklich, dass so etwas zur Lesbarkeit des Codes beiträgt?

Ja.

braunbär hat geschrieben:Mit dem ternären Operator wird das zum einem einfachen Einzeiler,

Mit einer Funktion wird es ein viel einfacherer Einzeiler.

braunbär hat geschrieben: und das ist sicher nicht schlechter als eine separate Funktion, die man erst suchen muss.

Wozu willst du die Funktion suchen? Was interessiert dich ihr Inhalt?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Kleinteilige Funktionen

Beitrag von pluto »

Ja.

Mit zu vielen Funktion kann es aber auch unleserlich werden. Vor allem für Leute, die neu in den Code sind.

Wozu willst du die Funktion suchen? Was interessiert dich ihr Inhalt?

Ich denke, hier geht es nicht um den Inhalt sondern um den Namen. Du musst die Funktionen kennen...
MFG
Michael Springwald

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Kleinteilige Funktionen

Beitrag von braunbär »

m.fuchs hat geschrieben:Wozu willst du die Funktion suchen? Was interessiert dich ihr Inhalt?

Wenn du für jeden Einzeiler eine separate Funktion schreibst, bekommst du ein völlig zerfleddertes Programm, in dem sich kein Mensch mehr auskennt.
Und wenn ich in einem Programm nach einem Fehler suche, dann muss ich mir anschauen, was da wirklich passiert. Wenn da eine Zuweisung steht, dann sehe ich, was passiert, wenn da aber nur ein Funktionsaufruf steht, dann muss ich erst recht die Funktion suchen, um zu schauen, ob die wirklich genau das macht, was ich auf Grund des Funktionsnamens hoffe, oder ob vielleicht ein Detail der Implementierung der Funktion am Fehler schuld ist, den ich beheben will.

Wenn dann das ganze Programm nur aus Funktionsaufrufen besteht, die ihrerseits aus Einzeilern bestehen, dann macht das sicher einen Mordsspaß.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Kleinteilige Funktionen

Beitrag von m.fuchs »

Meine letzte Antwort in diesem Thread dazu, weil es ja eigentlich um etwas anderes geht.

braunbär hat geschrieben:Wenn du für jeden Einzeiler eine separate Funktion schreibst, bekommst du ein völlig zerfleddertes Programm, in dem sich kein Mensch mehr auskennt.

Alles eine Frage der Architektur. Wenn man alle Funktion nur in einer Unit sammelt wird es sehr unübersichtlich. Wenn man sein Programm vernünftig mit passenden Klassen und ihren Methoden strukturiert ist es gar kein Problem.

braunbär hat geschrieben:Und wenn ich in einem Programm nach einem Fehler suche, dann muss ich mir anschauen, was da wirklich passiert. Wenn da eine Zuweisung steht, dann sehe ich, was passiert,

Es sei denn diese Zuweisung ist so unleserlich, dass ich es eben nicht sofort weiß. Aber das ist gar nicht der Punkt. Viel interessanter als zu wissen was da steht, ist es zu wissen warum da etwas steht.

braunbär hat geschrieben:wenn da aber nur ein Funktionsaufruf steht, dann muss ich erst recht die Funktion suchen,

Lazarus unterstützt Strg+Klick auf den Funktionsnamen. Wenn du wirklich in den Quellcode der Funktion schauen willst hilft das ungemein. Da muss man nichts suchen.

braunbär hat geschrieben:um zu schauen, ob die wirklich genau das macht, was ich auf Grund des Funktionsnamens hoffe, oder ob vielleicht ein Detail der Implementierung der Funktion am Fehler schuld ist, den ich beheben will.

man Unittest

braunbär hat geschrieben:Wenn dann das ganze Programm nur aus Funktionsaufrufen besteht, die ihrerseits aus Einzeilern bestehen, dann macht das sicher einen Mordsspaß.

Siehe oben, es hängt von der Architektur ab. Ein Funktionsaufruf ist aber in sehr vielen Fällen aussagekräftiger als eine komplexe Programmzeile.

Nehmen wir doch mal dein Beispiel:

Code: Alles auswählen

while (l := length(s)) < 10 do
     insert('x', s, l div 2)


oder

Code: Alles auswählen

 
procedure FillAtLeastToTenChars(var AString: String);
begin
  while (l := length(AString)) < 10 do
     insert('x', AString, l div 2)
end;
 
(* ... *)
  FillAtLeastToTenChars(s);


An der eigentlichen Stelle im Programmcode sehe ich also der Entwickler die Variable s auffüllen möchte damit wenigstens zehn Zeichen drin stehen. Wie er das macht, ist an dieser Stelle erst einmal egal. Ich will dort ja nur den Zusammenhang des Programms verstehen. Wenn ich irgendwann der Meinung bin ist Füllroutine sollte verbessert werden, dann gehe ich direkt zu der entsprechenden Prozedur und ändere es dort. Natürlich habe ich dann noch Unittests die prüfen dass immer noch das gleiche Ergebnis herauskommt.

Der Name der Funktion sagt mir also mehr als die tatsächliche Implementierung. Das kann man jetzt an diesem Beispiel auch ganz gut erkennen, ich habe nämlich den Namen vergeben auf Grund meiner Vermutungen was du mit dem Code bezweckst. Ob es wirklich stimmt? Wer weiß. Also du weißt es hoffentlich. Wenn du jetzt aber einen aussagekräftigen Namen vergibst, dann weiß ich zumindest was du dir an dieser Stelle dabei gedacht hast. Und so ein Wissen ist extrem wertvoll.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Kleinteilige Funktionen

Beitrag von braunbär »

Wir sind hier in der Tat off topic, und überzeugen werden wir uns vermutlich gegenseitig nicht. Deshalb nur so viel:

braunbär hat geschrieben:Der Name der Funktion sagt mir also mehr als die tatsächliche Implementierung. Das kann man jetzt an diesem Beispiel auch ganz gut erkennen, ich habe nämlich den Namen vergeben auf Grund meiner Vermutungen was du mit dem Code bezweckst. Ob es wirklich stimmt? Wer weiß. Also du weißt es hoffentlich. Wenn du jetzt aber einen aussagekräftigen Namen vergibst, dann weiß ich zumindest was du dir an dieser Stelle dabei gedacht hast. Und so ein Wissen ist extrem wertvoll.

Zu dem Zweck gibt es Kommentare, in denen man klarer als mit einem noch so aussagekräftigen Funktionsnamen erklären kann, was man sich bei einem Codestück gedacht hat und was man damit bezweckt.

n der eigentlichen Stelle im Programmcode sehe ich also der Entwickler die Variable s auffüllen möchte damit wenigstens zehn Zeichen drin stehen. Wie er das macht, ist an dieser Stelle erst einmal egal.

Es ist aber eben nicht egal, dass in der Mitte des Strings aufgefüllt wird, und mit welchem Füllzeichen aufgefüllt wird. Das verrät uns dein Funktionsname nicht.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Kleinteilige Funktionen

Beitrag von m.fuchs »

braunbär hat geschrieben:Wir sind hier in der Tat off topic,

Und ich kann es nicht lassen und schweigen, deswegen hier als separates Thema.

braunbär hat geschrieben:und überzeugen werden wir uns vermutlich gegenseitig nicht.

Nö, ich weiß ja dass ich recht habe. :mrgreen:
Spaß beiseite, spricht ja nichts gegen solche Diskussionen. Irgendetwas kann man immer lernen und wann hat man schon mal die Gelegenheit?


braunbär hat geschrieben:
m.fuchs hat geschrieben:Wenn du jetzt aber einen aussagekräftigen Namen vergibst, dann weiß ich zumindest was du dir an dieser Stelle dabei gedacht hast. Und so ein Wissen ist extrem wertvoll.

Zu dem Zweck gibt es Kommentare, in denen man klarer als mit einem noch so aussagekräftigen Funktionsnamen erklären kann, was man sich bei einem Codestück gedacht hat und was man damit bezweckt.

Kommentare habe leider die Angewohnheit zu verrotten. Das heißt bei Änderungen werden sie nicht unbedingt gepflegt. Und nichts ist schlechter als ein falscher Kommentar, dann lieber gar keiner. Beim Funktionsnamen ist die Wahrscheinlichkeit höher dass er stimmt (gibt natürlich auch da immer Ausnahmen). Aber idealerweise muss man heutzutage nicht mehr kommentieren. Der Quellcode sollte für sich selbst sprechen.

braunbär hat geschrieben:
m.fuchs hat geschrieben:n der eigentlichen Stelle im Programmcode sehe ich also der Entwickler die Variable s auffüllen möchte damit wenigstens zehn Zeichen drin stehen. Wie er das macht, ist an dieser Stelle erst einmal egal.

Es ist aber eben nicht egal, dass in der Mitte des Strings aufgefüllt wird, und mit welchem Füllzeichen aufgefüllt wird. Das verrät uns dein Funktionsname nicht.

Das ist der Beweis, ich habe aus deinem Code nicht verstanden was du eigentlich machen möchtest.

Ich verweise auch noch einmal auf mein Beispiel aus einem anderen Thread:

Code: Alles auswählen

if (Domain.ExpireDate < Now) and (Domain.Active) and (not Domain.Customer.Locked) and (Domain.Customer.DunningLevel < 2) then

vs.

Code: Alles auswählen

if ShouldBeRenewed(Domain)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Kleinteilige Funktionen

Beitrag von Socke »

braunbär hat geschrieben:Zu dem Zweck gibt es Kommentare, in denen man klarer als mit einem noch so aussagekräftigen Funktionsnamen erklären kann, was man sich bei einem Codestück gedacht hat und was man damit bezweckt.

Und die Kommentare, warum dein Code etwas macht, sind extrem wertvoll!

braunbär hat geschrieben:Es ist aber eben nicht egal, dass in der Mitte des Strings aufgefüllt wird, und mit welchem Füllzeichen aufgefüllt wird. Das verrät uns dein Funktionsname nicht.

Genau diese Information stand gar nicht zur Verfügung; hättest du mit einem Kommentar darauf hingewiesen, hätte m.fuchs (oder du) einen entsprechenden Namen wählen können.

Ich denke, die Auslagerung in kleine Funktionen hilft ungemein dabei, sich nicht zu wiederholen (vgl. Don't repeat yourself). Wenn ich bereits einen Teil in eine Funktion ausgelagert habe, kann ich die Funktion immer wieder verwenden, ohne sie neu zu implementieren. Spätestens wenn ich einen bereits vorhanden Code an anderer Stelle nochmals brauche, mache ich eine eigene Funktion daraus. Bis der Code nochmals gebraucht wird, kann man darüber diskutieren, ob man die Aufteilung tatsächlich vornimmt - denkt man direkt von Anfang an daran, hat man es später leichter.

braunbär hat geschrieben:Wir sind hier in der Tat off topic, und überzeugen werden wir uns vermutlich gegenseitig nicht.

Deswegen nennt man die Themen, über die hier diskutiert wird auch Programmierparadigma :D
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Kleinteilige Funktionen

Beitrag von pluto »

Ich denke, die Auslagerung in kleine Funktionen hilft ungemein dabei, sich nicht zu wiederholen

Solange man damit nicht übertreibt. Ich denke, es ist alles eine Frage, wie man den Code schreibt.

Klar macht es sinn Gewisse Teile in Funktionen auszulagern. Genauso macht es Sinn für einige Sachen Klassen oder Records zu verwenden warum nicht?

Ich würde jetzt auch nicht unbedingt für alles je eine Funktion machen, so viele Namen kann ich mir
A) Nicht ausdenken(Mein größtes Problem)
B) Auch nicht merken.

Es gibt eine Funktion, die einen / oder ein \ am Ende einens Dateinamens hängt. Ich finde den Namen dieser Funktion extrem Lang.
Genauso gut, kann man es selbst machen.
MFG
Michael Springwald

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Kleinteilige Funktionen

Beitrag von braunbär »

Also gut, wenn du schon einen eigenen Thread aufmachst, dann machen wir eben weiter :)

Socke hat geschrieben:Genau diese Information stand gar nicht zur Verfügung; hättest du mit einem Kommentar darauf hingewiesen, hätte m.fuchs (oder du) einen entsprechenden Namen wählen können.

Der Code stand hier nur als Beispiel dafür, dass Zuweisungen in einer Abfrage sinnvoll sein können. Und da ist es übrigens völlig egal, ob dieser Code in eine eigene Prozedur ausgelagert ist oder nicht.
Kommentare dienen dazu, sich in einem umfangreichen Programm schnell zurechtzufinden.

Socke hat geschrieben:Spätestens wenn ich einen bereits vorhanden Code an anderer Stelle nochmals brauche, mache ich eine eigene Funktion daraus.

Spätestens wenn ich einen bereits vorhanden Code an anderer Stelle nochmals brauche, oder wenn ich damit rechne, dass ich den Code an anderer Stelle nochmals brauchen werde, mache ich eine eigene Funktion daraus.

m.fuchs hat geschrieben:Kommentare haben leider die Angewohnheit zu verrotten. Das heißt bei Änderungen werden sie nicht unbedingt gepflegt.

Man sollte sich angewöhnen, Kommentare zu pflegen.

m.fuchs hat geschrieben:Aber idealerweise muss man heutzutage nicht mehr kommentieren. Der Quellcode sollte für sich selbst sprechen.

Wenn das Programm durch extrem viele Einzeiler-Funktionen zerfleddert ist, spricht es sicher nicht für sich selbst. Aber auch sonst gehört auch "heutzutage" jeder Code anständig kommentiert.

m.fuchs hat geschrieben:Das ist der Beweis, ich habe aus deinem Code nicht verstanden was du eigentlich machen möchtest.

Das meinst du hoffentlich nicht ernst :D

m.fuchs hat geschrieben:Ich verweise auch noch einmal auf mein Beispiel aus einem anderen Thread:

Code: Alles auswählen

    if (Domain.ExpireDate < Now) and (Domain.Active) and (not Domain.Customer.Locked) and (Domain.Customer.DunningLevel < 2) then
 


vs.

Code: Alles auswählen

    if ShouldBeRenewed(Domain)
 



Wenn du diese Abfragen nur an dieser Stelle des Programms und sonst nirgends brauchst, dann ist m.E. besser

Code: Alles auswählen

 
// Überprüfe alle Bedingungen, unter denen die Domain erneuert werden soll 
if (Domain.ExpireDate < Now) and (Domain.Active) and (not Domain.Customer.Locked) and (Domain.Customer.DunningLevel < 2) then
 

Beim Lesen des Programms kann man dann problemlos über die Details der Bedingungen drüberlesen, wenn sie einen nicht interessieren.


Tipp: Einzeiler lassen sich problemlos rekursiv erweitern, wenn du als Programmierer pro Programmzeile bezahlt wirst:

Code: Alles auswählen

 
procedure tuwas;
begin write ('Ich tu was') end;
 
procedure RufeTuWasAuf;
begin
tuwas;
end;
 
procedure RufeRufeTuWasAufAuf;
begin
RufeTuWasAuf;
end;
 
 
procedure RufeRufeRufeTuWasAufAufAuf;
begin
RufeRufeTuWasAufAuf;
end;
 
...
 
begin
 RufeRufeRufeRufeRufeRufeRufeRufeRufeRufeRufeRufeRufeRufeRufeTuWasAufAufAufAufAufAufAufAufAufAufAufAufAufAufAuf;
end.
 
 

:D

m.fuchs hat geschrieben:Wenn man sein Programm vernünftig ... strukturiert ist es gar kein Problem.

zum "vernünftig strukturiert" gehört auch, dass man es NICHT durch eine Inflation von Einzeiler-Prozeduren zerfleddert.

m.fuchs hat geschrieben:Lazarus unterstützt Strg+Klick auf den Funktionsnamen. Wenn du wirklich in den Quellcode der Funktion schauen willst hilft das ungemein. Da muss man nichts suchen.

Wenn es um eine einzelne Funktion geht, ja. Wenn das Programm aus lauter Funktionsaufrufen besteht, in denen Einzeiler erledigt werden, verlierst du vor lauter Strg+Klick die Übersicht.
Abgesehen davon bin ich da der Meinung von MSE, dass ein Programm auch als Text außerhalb einer IDE lesbar sein sollte.

pluto hat geschrieben:Solange man damit nicht übertreibt

Genau darum geht es mir. Natürlich sollte man sein Programm durch eine adäquate Aufteilung in Prozeduren, Funktionen und Methoden sinnvoll strukturieren.

pluto hat geschrieben:Es gibt eine Funktion, die einen / oder ein \ am Ende einens Dateinamens hängt. Ich finde den Namen dieser Funktion extrem Lang.
Genauso gut, kann man es selbst machen.

Weil ich brav bin, verwende ich prinzipiell diese Funktion - muss den Namen aber jedes mal in der Hilfe suchen, ich schaffe es einfach nicht, mir den zu merken. :D

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Kleinteilige Funktionen

Beitrag von Socke »

pluto hat geschrieben:
Socke hat geschrieben:Ich denke, die Auslagerung in kleine Funktionen hilft ungemein dabei, sich nicht zu wiederholen

Solange man damit nicht übertreibt. Ich denke, es ist alles eine Frage, wie man den Code schreibt.

Klar macht es sinn Gewisse Teile in Funktionen auszulagern. Genauso macht es Sinn für einige Sachen Klassen oder Records zu verwenden warum nicht?

Dazu passt ein wunderbares Zitat:
Linus Torvalds hat geschrieben:I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structures more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships.

Wenn die Strukturen passen, ist der Code häufig sehr einfach. Die passenden Strukturen zu finden ist mitunter nicht immer leicht. So kann man TStrings und TTStringList gerne als Negativbeispiel verstehen.

pluto hat geschrieben:Ich würde jetzt auch nicht unbedingt für alles je eine Funktion machen, so viele Namen kann ich mir
A) Nicht ausdenken(Mein größtes Problem)
B) Auch nicht merken.

Es gibt zwei schwierige Dinge in der Informatik: Cache Invalidation und Sachen zu benennen. (wobei die anderen beiden Zitate auch nicht schlecht sind). Beim Ausdenken können Entwurfsmuster zumindest bei Klassen helfen. Hier kann man sich ein paar Hilfsmuster geben, z.B.
  • Klassen und Records beschreiben einen Gegenstand (TAuto)
  • Eigenschaften/Properties erhalten einen beschreiben eine Zustand (IsDriving)
  • Methoden beschreiben eine Aktion (GetSeats, StartDriving)
  • Listen leiten sich immer vom Basis-Typ ab (TAuto => TAutoList)

pluto hat geschrieben:Es gibt eine Funktion, die einen / oder ein \ am Ende einens Dateinamens hängt. Ich finde den Namen dieser Funktion extrem Lang.
Genauso gut, kann man es selbst machen.

Wenn du einen einen kürzen namen für dich verwenden möchtest, ist das nicht verboten. Aber der Funktionsname IncludeTrailingPathDelimiter gibt einige Informationen mit:
  • Es wird dafür gesorgt, dass das Pfadtrennzeichen angefügt wird
  • Es wird am Ende angefügt, nicht am Anfang (z.B. für absolute Pfade), und auch die Pfadtrennzeichen im String werden nicht geändert
  • Es wird der für das Plattform gültige Pfadtrennzeichen verwendet und nicht immer ein Backslash oder ein Forwardslash
Wie oft habe ich mir in VBA schon genau diese Funktion, deren Inhalt fast trivial ist, gewünscht und selbst programmieren müssen :twisted:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Kleinteilige Funktionen

Beitrag von m.fuchs »

braunbär hat geschrieben:Kommentare dienen dazu, sich in einem umfangreichen Programm schnell zurechtzufinden.

Nö, Standardpraktiken, Patterns und dokumentierte Architektur dienen dazu sich in umfangreichen Programmen schnell zurechtzufinden. Ich habe hier grad ein mittel-großes Fremdprogramm auf den Tisch bekommen. Ich werde sicherlich nicht erst alle 3717 Dateien öffnen und die Kommentare lesen. Ich schaue auf die Architekturübersicht und sehe mir die neun Service-Klassen an die zentraler Teil des Projekts sind. Was in den anderen Dateien die untergeordnete Schichten und viele, viele Funktionen umfassen steht, interessiert mich erst einmal nicht.

braunbär hat geschrieben:
m.fuchs hat geschrieben:Kommentare haben leider die Angewohnheit zu verrotten. Das heißt bei Änderungen werden sie nicht unbedingt gepflegt.

Man sollte sich angewöhnen, Kommentare zu pflegen.

Warum kommentieren wenn ich das ganze in eine Funktion packen kann? Kommentare sind bei mir/uns nur selten zu finden. Im Allgemeinen beschreiben sie nur warum ein Entwickler sich entschieden hat etwas auf eine bestimmte Art zu programmieren

braunbär hat geschrieben:
m.fuchs hat geschrieben:Das ist der Beweis, ich habe aus deinem Code nicht verstanden was du eigentlich machen möchtest.

Das meinst du hoffentlich nicht ernst :D

Doch das meine ich ernst.

braunbär hat geschrieben:Wenn du diese Abfragen nur an dieser Stelle des Programms und sonst nirgends brauchst, dann ist m.E. besser

Code: Alles auswählen

 
// Überprüfe alle Bedingungen, unter denen die Domain erneuert werden soll 
if (Domain.ExpireDate < Now) and (Domain.Active) and (not Domain.Customer.Locked) and (Domain.Customer.DunningLevel < 2) then
 

Beim Lesen des Programms kann man dann problemlos über die Details der Bedingungen drüberlesen, wenn sie einen nicht interessieren.

Dann habe ich noch immer keine Möglichkeit diese Bedingungs-Arie automatisiert zu testen. Und: einfach drüberlesen ist leider nicht so problemlos wie du denkst. Je mehr Informationen sichtbar sind um so schwieriger wird es für Menschen diese zu erfassen. Auch wenn man drüberliest sind sie noch da und lenken ab. Das ist das gleich Prinzip wie bei Steinzeitmenschen. Wenn die in der Steppe einen Baum sehen ist das beruhigend. Sehen sie einen Wald dann sehen sie auch hunderte von Möglichkeiten hinter denen sich ein Fein verbergen kann.

braunbär hat geschrieben:Tipp: Einzeiler lassen sich problemlos rekursiv erweitern, wenn du als Programmierer pro Programmzeile bezahlt wirst:

Wenn ich als Programmiere zeileweise bezahlt werde, nehme ich Assembler.

braunbär hat geschrieben:
m.fuchs hat geschrieben:Wenn man sein Programm vernünftig ... strukturiert ist es gar kein Problem.

zum "vernünftig strukturiert" gehört auch, dass man es NICHT durch eine Inflation von Einzeiler-Prozeduren zerfleddert.

Es ist nichts zerfleddert wenn man nicht den gesamten Code in eine Datei packt. Man hat Klassen, Units, Module, Schichten und viele weitere Strukturen mit denen man den Code aufteilt.

braunbär hat geschrieben:Wenn das Programm aus lauter Funktionsaufrufen besteht, in denen Einzeiler erledigt werden, verlierst du vor lauter Strg+Klick die Übersicht.

Aber wie oft muss ich denn wirklich in die einzelne Implementierung abtauchen? Das ist in den meisten Fällen doch wirklich uninteressant. Viel wichtiger ist es den großen Zusammenhang der einzelnen Module und Klassen zu verstehen.
Daher sind die dann natürlich auch auf einem höheren, abstrakten Level.

braunbär hat geschrieben:Abgesehen davon bin ich da der Meinung von MSE, dass ein Programm auch als Text außerhalb einer IDE lesbar sein sollte.

Die Frage ist ja: warum? Ich komme nicht in die Verlegenheit ein Programm pflegen zu müssen ohne das passende Werkzeug.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Kleinteilige Funktionen

Beitrag von braunbär »

m.fuchs hat geschrieben:Was in den anderen Dateien die untergeordnete Schichten und viele, viele Funktionen umfassen steht, interessiert mich erst einmal nicht.

Wenn du etwas am Programm ändern und nicht nur eine nette Geschichte lesen willst, wirst du dich dafür interessieren müssen.

m.fuchs hat geschrieben:Warum kommentieren wenn ich das ganze in eine Funktion packen kann? Kommentare sind bei mir/uns nur selten zu finden.

Ich glaube, ich hatte es schon an anderer Stelle einmal festgestellt: Zum Glück muss ich nicht in deiner Firma arbeiten.

m.fuchs hat geschrieben:
Das meinst du hoffentlich nicht ernst :D

Doch das meine ich ernst.

Wenn ich dir das abnehmen würde, hätte ich keinen Grund, dich als Programmierer ernst zu nehmen und noch einen weitere Minute in diese Diskussion mit dir zu investieren.

m.fuchs hat geschrieben:Und: einfach drüberlesen ist leider nicht so problemlos wie du denkst.

Ich hatte damit nie Probleme, auch bei fremden Code nicht, wenn er angemessen kommentiert ist.

m.fuchs hat geschrieben:
Abgesehen davon bin ich da der Meinung von MSE, dass ein Programm auch als Text außerhalb einer IDE lesbar sein sollte.

Die Frage ist ja: warum? Ich komme nicht in die Verlegenheit ein Programm pflegen zu müssen ohne das passende Werkzeug.

Ich habe mir schon öfters auf eine kurze Reise auf meinem Notebook, auf dem ich normalerweise keine IDE installiert habe, weil ich sie praktisch nie brauche, Quellcode mitgenommen, um ihn zwischendurch zu studieren.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kleinteilige Funktionen

Beitrag von Mathias »

Was ist dies für ein komischer Pascal-Code ?

Code: Alles auswählen

while (l := length(s)) < 10 do
     insert('x', s, l div 2)


Es gibt zum Teil schon Situation, wo sehr kleine Funktionen einen grossen Vorteil zu Übersichtlichkeit haben.
Aber dann würde ich sie zumindest mit inline deklarieren, so das der Kompiler es ohne call direkt in den Code schriebt.

Code: Alles auswählen

function vec2(x, y: GLfloat): TVector2f; inline;
begin
  Result[0] := x;
  Result[1] := y;
end;
 
function vec3(x, y, z: GLfloat): TVector3f; inline;
begin
  Result[0] := x;
  Result[1] := y;
  Result[2] := z;
end;
 
function vec3(v: TVector2f; z: GLfloat): TVector3f; inline;
begin
  Result[0] := v[0];
  Result[1] := v[1];
  Result[2] := z;
end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Kleinteilige Funktionen

Beitrag von braunbär »

Ob derart aussagekräftige Funktionsnamen wie vec2 und vec3 so viel zur Übersichtlichkeit beitragen, sei dahingestellt.
Und ob

Code: Alles auswählen

 
x[0]:=a; x[1]:=b;
 

so viel übersichtlicher ist als

Code: Alles auswählen

 
x:=vec2(a,b);
 

ebenfalls...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Kleinteilige Funktionen

Beitrag von m.fuchs »

braunbär hat geschrieben:
m.fuchs hat geschrieben:Was in den anderen Dateien die untergeordnete Schichten und viele, viele Funktionen umfassen steht, interessiert mich erst einmal nicht.

Wenn du etwas am Programm ändern und nicht nur eine nette Geschichte lesen willst, wirst du dich dafür interessieren müssen.

Erst wenn ich in die Verlegenheit komme, dass ich an einen speziellen Programmteil etwas ändern muss. Je nach Projekt ändern sich aber 40% - 75% einer Software jahrelang nicht. Warum soll ich mich dann damit beschäftigen?

braunbär hat geschrieben:
m.fuchs hat geschrieben:
braunbär hat geschrieben:Das meinst du hoffentlich nicht ernst :D

Doch das meine ich ernst.

Wenn ich dir das abnehmen würde, hätte ich keinen Grund, dich als Programmierer ernst zu nehmen und noch einen weitere Minute in diese Diskussion mit dir zu investieren.

Tut mir leid dass du doch so sehr engstirnig eingestellt bist. Ich habe aber auf Arbeit anderes zu tun als über jede Zeile Code nachzusinnen nur weil der entsprechende Entwickler es nicht schafft den Code teamfähig zu gestalten.
Das ist bei Projekten mit mehreren Millionen Codezeilen in zehntausenden Dateien einfach nicht mehr machbar. Deswegen gibt es Softwarearchitektur und Clean Code.

braunbär hat geschrieben:
m.fuchs hat geschrieben:Ich komme nicht in die Verlegenheit ein Programm pflegen zu müssen ohne das passende Werkzeug.

Ich habe mir schon öfters auf eine kurze Reise auf meinem Notebook, auf dem ich normalerweise keine IDE installiert habe, weil ich sie praktisch nie brauche, Quellcode mitgenommen, um ihn zwischendurch zu studieren.

Das tut mir leid.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten