Zuerst las ich einen Auszug aus Edsger W. Dijkstras 1974 erschienenem Artikel "Über die Rolle des wissenschaftlichen Denkens":
Lassen Sie mich versuchen, Ihnen zu erklären, was nach meinem Geschmack für jedes intelligente Denken charakteristisch ist. Es ist so, dass man bereit ist, einen Aspekt seines Themas aus Gründen seiner eigenen Konsistenz isoliert zu untersuchen, wobei man ständig weiß, dass man sich nur mit einem der Aspekte beschäftigt. Wir wissen, dass ein Programm korrekt sein muss, und wir können es nur unter diesem Gesichtspunkt studieren. Wir wissen auch, dass es effizient sein sollte und wir können seine Effizienz sozusagen an einem anderen Tag untersuchen. In einer anderen Stimmung fragen wir uns vielleicht, ob und warum das Programm wünschenswert ist. Aber nichts wird gewonnen - im Gegenteil! - wenn diese verschiedenen Aspekte gleichzeitig angegangen werden. Es ist das, was ich manchmal als "Trennung von Bedenken" bezeichnet habe, was, wenn auch nicht vollkommen möglich, ist noch die einzige verfügbare Technik zur effektiven Ordnung der eigenen Gedanken, die ich kenne. Das meine ich mit "die Aufmerksamkeit auf einen Aspekt lenken": Es bedeutet nicht, die anderen Aspekte zu ignorieren, sondern nur der Tatsache gerecht zu werden, dass der andere aus der Sicht dieses Aspekts irrelevant ist. Es ist gleichzeitig ein- und mehrspurig.
Ich sehe moderne Trennung von Bedenken über die Modularisierung Ihres Codes sprechen. Wenn ich jedoch das obige Zitat lese, verstehe ich dies so, dass Sie Ihren Geist jeweils auf eine bestimmte Aufgabe konzentrieren, ohne sich auf andere Aspekte zu konzentrieren. Dies bedeutet für mich nicht unbedingt, dass Code in modulare Blöcke unterteilt werden muss.
Das heißt, es befindet sich ein Code vor Ihnen, der in einer Datei die Konzepte Ansicht, Repository, Controller, Ereignisbehandlung, Factory usw. in einer Datei enthält.
Hier ein kurzes Beispiel für Code mit Datenzugriff und Ansicht (Ausgabe):
$sql = "SELECT * FROM product WHERE id = " . db_input($id);
$row = db_fetch_array(db_query($sql));
<option value="<?=$row['id']?>"<?= $row['ver'] == $row['ver'] ? ' selected="selected"' : '' ?>>Version <?=$row['ver']?></option>
Mit modernem OO konnte ich den Datenzugriff mithilfe des Repository-Musters in eine eigene Datei einfügen, der Ansichtscode kann in eine eigene Dateivorlage eingefügt werden, und ich kann diese miteinander verbinden, um über einen Controller (oder einen Aktions- oder Anforderungshandler) zu kommunizieren, und ich kann Fügen Sie eine Factory hinzu, um verschiedene Abhängigkeiten zu erstellen und zu verkabeln. Und ich kann eine Konfigurationsdatei haben, die diese Fabriken definiert. Sicherlich ist es ein Schritt weg von Single-File-All.
Meine Frage zur Trennung von Bedenken lautet wie folgt: Als ich Dijkstras Zitat las, kam mir die Idee, dass er vielleicht nicht unbedingt bedeutete, dass die Trennung von Bedenken "modulare Trennung von Code (in Dateien oder ihre eigenen Funktionen / Methoden / usw.)" ist. und dass er mehr darauf bedacht war, sich auf einen Aspekt des Programms zu konzentrieren, ohne sich auf andere wichtige, aber derzeit nicht zu berücksichtigende Aspekte zu konzentrieren, unabhängig davon, ob sie physisch im Code getrennt sind oder nicht.
Warum belasten wir uns dann mit physischen modularen Codetrennungs- und Entwurfsmustern? Wird es nicht ausreichen, sich nur auf einen Aspekt zu konzentrieren, unabhängig davon, wie Ihr Code aufgebaut ist?
Ich spreche nicht davon, den schrecklichsten Spaghetti-Code zu schreiben und dann nur einen Aspekt davon zu betrachten, das wäre wahrscheinlich eine Belastung. Aber am Ende gehe ich dahin, warum die physische Codetrennung durchführen, warum den Code in getrennte Dateien oder Blöcke (Methoden) aufteilen, wenn es nicht notwendig ist, sich mental auf einen Aspekt zu konzentrieren?
Sollte die Trennung von Bedenken eher eine mentale als eine physische Übung bleiben?
Mit anderen Worten, sollte es eine Trennung zwischen den mentalen (Fokus auf) und den physischen (Code auf Papier) Aspekten der Programmierung geben?
IF
, WHILE
, FOR
statt GOTO
. Modular = Module mit einer genau definierten öffentlichen API, die streng von einer versteckten internen Implementierung und Darstellung getrennt ist. (ZB Modula, Mesa, Modula-2, Modula-3, später Pascal-Dialekte ( UNIT
).)