Wofür wird in JS/TS void benutzt?

3 Antworten

Es macht Sinn. Wenn du den Typen Bool angibst, dann musst du immer Return machen, weil er eine Rückgabe erwartet. Void erwartet eben keine Rückgabe. Dafür ist es auch da, weil man nicht immer eine Rückgabe braucht ... Siehe Google -> Datentypen

function favNumber(){ return 42;}
        console.log(favNumber())
(()=>{console.log(42)})()

In gewisser Weise hast du hier Recht, ja. So eine Funktion, die nur eine Zahl zurück gibt, schreibt man aber nicht. Man würde die Zahl entweder in eine Variable packen, falls man die mehrfach braucht oder direkt einfügen. Die Funktion würde halt mehrere Abläufe beinhalten, die erstmal durchgegangen werden müssen, damit man den Wert bekommt

Also wenn du eine Void-methode hast und die "mehr als nix" machen soll, dann produziert sie eigentlich immer einen Seiteneffekt.

Theoretisch könntest du alles in Void-methode schreiben, insbesondere in zB c++ wo du Parameter als Referenz übergeben kannst. Einfach als Referenz übergeben und dann die variable in der Methode nach Belieben ändern, undit der geänderten weiterarbeiten.

Ein schönes Beispiel ist auch die Print Funktion. Wenn eine Methode nur etwas auf die Konsole ausgeben soll, dann braucht sie keinen Return wert.

Grundsätzlich ist aber vor allem das mit dem verändern von variablen in einer Methode echt kein schöner programmierstil. Eine solche Methode ohne return-value zu testen ist viel schwieriger als es sein müsste.

malte314  27.08.2022, 00:01
Grundsätzlich ist aber vor allem das mit dem verändern von variablen in einer Methode echt kein schöner programmierstil

Befindet sich nicht in dem meisten Programmiersprachen (Java, C, C++, Rust, ......) jeder ausgeführte Code in Methoden (spätestens der main-Methode)? ;)

0
Valentin1720653  27.08.2022, 00:03
@malte314

Es ging mir jetzt speziell darum in zB c++ komplett auf Rückgabewerte zu verzichten und alles als Referenz zu übergeben, und die übergebenen variablen dann in einer Methode zu verändern.

Anstelle einer bool Methode kannst du ja auch eine void verwenden und ein bool mit als Parameter übergeben und diesen dann verändern. Geht genau so aber ist absolut kein schöner Stil.

0
Ich meine wenn man nichts zurück geben will dann benutzt man halt kein return oder nicht ?

Richtig. Und damit ist der Rückgabewert automatisch "void". Der Rückgabewert ist immer void, außer du gibst explizit einen Wert zurück.

Es lässt sich festhalten, dass eine Funktion, die nichts zurück gibt, i.d.R. Side Effects erzeugt. Das sind zum Beispiel wie in deinem Beispiel console.log() Aufrufe.

Ein Beispiel, das mir spontan einfällt: Eine Funktion, die einen Wert in einer Datenbank setzt (nicht abruft), muss nicht unbedingt etwas zurückgeben. Es reicht, wenn der Caller der Funktion (also dort, wo die Funktion aufgerufen wurde) weiß, dass der Vorgang erfolgreich war. Bei einem synchronen Datenbankaufruf (keine Promises) würde hier tatsächlich einfach nichts (void) zurückgegeben werden. Die Speicherung des Werts in der Datenbank wäre in diesem Fall der erzeugte Side Effect.

Übrigens:

wenn das gleich drinnen steht ist es besser
(()=>{console.log(42)})()

Nicht zwangsläufig. Nicht nur, dass das explizite Beispiel hier ziemlich schlecht lesbar ist: Was wäre, wenn du die Funktion bzw. den darin enthaltenen Code auch an anderen Stellen verwenden willst? Eines der obersten Grundprinzipien von Clean Code ist DRY (Don't Repeat Yourself). Wenn du also an mehreren Stellen im Code 42 ausgeben willst (ist natürlich ein schlechtes Beispiel, i.d.R. sind es mehr Zeilen Code), sollte das auf jeden Fall in eine eigene Funktion. Wenn du nachher etwas an diesem Code ändern willst, musst du nicht an jede einzelne Stelle im Code und sie ändern, sondern nur in die eine Funktionsdefinition.

Auch gilt in Clean Code das "Single Responsibility Principle", also dass jede Funktion bzw. generell jedes Konstrukt im Code eine einzige Verantwortlichkeit haben sollte. Das ist auch nicht einzuhalten, wenn man einfach alles inline packt und keine Funktionen erstellt.

Woher ich das weiß:Berufserfahrung – Inhaber einer App-Agentur & 15+ Jahre Programmiererfahrung
JestJs 
Fragesteller
 27.08.2022, 00:23
Was wäre, wenn du die Funktion bzw. den darin enthaltenen Code auch an anderen Stellen verwenden willst? Eines der obersten Grundprinzipien von Clean Code ist DRY (Don't Repeat Yourself)

Ja war nur ein kleines beispiel aber in vielen fällen wären dann Parameter eleganter.

ich habe bis jetzt sehr viele Yt videos geguckt und es gibt sehr sehr viele leute die ohne notwendigkeit return benutzen.

Also sollte ich wenn ich es nicht brauche lieer das keyword void benutzen ?

void function test(){
}

Oder in TypeScript wenn es nichts zurückgibt

Class Mensch{
Essen() : void{
}
}

Wenn es nur einen string zurück gibt

Dann eben

Essen():string{
}
0
Functional  27.08.2022, 00:32
@JestJs

Wenn die Funktion nichts zurück gibt, inferiert TypeScript das eigentlich immer aus dem Kontext. Sprich, TypeScript erkennt das von selbst, eine Angabe, dass die Funktion "void" zurückgibt, ist daher nicht nötig (außer, man möchte das explizit machen, im Sinne von Code-Dokumentation o.Ä.).

Alle diese Funktionen hier haben in TypeScript einen void-Rückgabewert:

function f1() { // void wird von TypeScript inferiert, da kein Wert zurückgegeben wird
  console.log('test');
} 
function f2(): void { // explizite Angabe
  console.log('test');
}
function f3() { // void wird auch hier inferiert
  console.log('test');
  return;
}

Ein "leeres" return (also ein return ohne Wert) macht in der Regel dann Sinn, wenn die Funktion frühzeitig abgebrochen werden soll. Das kann vor allem bezüglich der Lesbarkeit des Codes sehr viel Sinn machen. Beispiel:

function f1(x, y, z) { // bad!
  if (x === 1) {
    if (y === 2) {
      if (z === 3) {
        // do something
      }
    }
  }
}
function f2(x) { // good
  if (x !== 1) return;
  if (y !== 2) return;
  if (z !== 3) return;
  // do something
}

Im ersten Beispiel erstellt man dutzende Code-Blöcke ineinander, was die Lesbarkeit massiv verschlechtert. Statt dessen kann man mit einem "return" den Funktionsablauf unterbrechen und somit den Code enorm kürzen.

1
JestJs 
Fragesteller
 27.08.2022, 00:33
@Functional
Ein "leeres" return (also ein return ohne Wert) macht in der Regel dann Sinn, wenn die Funktion frühzeitig abgebrochen werden soll.

Achso Danke, das macht Sinn

0