Warum tut es so weh, folgendes zu schreiben:
var row = get_next_row(); while (row !== null) { // process row row = get_next_row(); }
Ich finde die beiden Varianten nehmen sich an Leserlichkeit nichts. Was für mich beide Ansätze unnötig schwierig zu verstehen macht, ist die gesamte Schleifenlogik. Das ist viel kognitiver Overhead ohne Nutzen und der Code ist auch schlecht wiederverwertbar, weshalb man automatisch in Code-Duplikations-Probleme läuft. Um das besser zu erklären, muss ich dein Beispiel etwas ergänzen. Dein Code-Kommentar suggeriert ja bereits, dass in der Schleife noch mehr Brechnungen stattfinden. In der Praxis sieht das oft so aus:
const processed_rows = [];
var row = get_next_row();
while (row !== null) {
processed_rows.push(process_row(row));
row = get_next_row();
}
Das Problem hier ist, dass 3 Zeilen nur der Iteration dienen und nur eine Zeile wirklich Arbeit verrichtet (processed_rows.push(process_row(row))).
Die Wurzel allen Übels ist die Funktion get_next_row[1]. Die Funktion versteckt den Zugriff auf eine Datenbank-Ergebnismenge. Da würde ich ansetzen: Die versteckte Abhängigkeit auflösen und explizit machen. Angenommen die Ergebnismenge liegt in einem Array result_set vor, dann ließe sich der Code schon deutlich reduzieren:
const processed_rows = [];
for (let row of result_set) {
processed_rows.push(process_row(row));
}
Statt den drei Zeilen dient nun nur noch eine Zeile der Iteration und auch die können wir schnell eleminieren:
const processed_rows = result_set.map(process_row)
Es bleibt nur eine Zeile stehen, in der die gesamte Arbeit verrichtet wird. Der Code ist ist deutlich lesbarer und recyclebar: Werfen wir nun die Annahme über Board, dass result_set ein Array ist, und gehen stattdessen von einem Stream aus (in JavaScript sind asynchrone Datenstrukturen für Ein/Ausgabe-Funktionen die Regel und nicht die Ausnahme). Der Code müsste dafür nicht geändert werden und processed_rows wäre ohne weiteres Zutun sogar schon ein Stream. Zwei Fliegen mit einer Klappe.
Das ist übrigens das Abstraction-Inversion Anti-Pattern. ↩︎