Per prima cosa, ho letto un estratto di "Sul ruolo del pensiero scientifico" del 1974 di Edsger W. Dijkstra:
Let me try to explain to you, what to my taste is characteristic for all intelligent thinking. It is, that one is willing to study in depth an aspect of one's subject matter in isolation for the sake of its own consistency, all the time knowing that one is occupying oneself only with one of the aspects. We know that a program must be correct and we can study it from that viewpoint only; we also know that it should be efficient and we can study its efficiency on another day, so to speak. In another mood we may ask ourselves whether, and if so: why, the program is desirable. But nothing is gained —on the contrary!— by tackling these various aspects simultaneously. It is what I sometimes have called "the separation of concerns", which, even if not perfectly possible, is yet the only available technique for effective ordering of one's thoughts, that I know of. This is what I mean by "focusing one's attention upon some aspect": it does not mean ignoring the other aspects, it is just doing justice to the fact that from this aspect's point of view, the other is irrelevant. It is being one- and multiple-track minded simultaneously.
Vedo che la moderna separazione delle preoccupazioni parla della modularizzazione del codice. Tuttavia, leggendo la citazione di cui sopra, capisco questo come concentrando la tua mente su un particolare compito alla volta, mentre non si concentra su altri aspetti. Questo non significa necessariamente che il codice debba essere separato in blocchi modulari.
Cioè, diciamo che c'è un codice davanti a te che in un file ha i concetti di vista, repository, controller, gestione degli eventi, factory, ecc. tutto in un unico file.
Per un breve esempio, ecco un codice che ha accesso ai dati e visualizza (output):
$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>
Utilizzando l'OO moderno potrei inserire l'accesso ai dati nel proprio file utilizzando il modello di repository, il codice View può andare nel proprio modello di file e io posso collegarli insieme per comunicare tramite un controller (o Action o Gestore richieste), e posso aggiungere una fabbrica per creare e collegare varie dipendenze. E posso avere un file di configurazione che definisce quelle fabbriche. Sicuramente è a un passo dal single-file-tutto.
La mia domanda sulla separazione delle preoccupazioni è così: leggendo la citazione di Dijkstra, ho avuto l'idea che forse non intendeva necessariamente separare le preoccupazioni dalla "separazione modulare del codice (in file o nelle loro proprie funzioni / metodi / ecc. ) ", e che intendeva di più focalizzare la propria mente su un aspetto del programma, senza appesantire se stessi concentrandosi su altri aspetti importanti ma non ancora da considerare, indipendentemente dal fatto che siano fisicamente separati nel codice, o no.
Perché allora ci stiamo affliggendo con la separazione fisica dei codici e i modelli di progettazione? Non sarà sufficiente concentrarsi su un aspetto, indipendentemente da come è strutturato il tuo codice?
Non sto parlando di scrivere il codice di spaghetti più orribile e quindi solo considerando un aspetto di esso, questo sarebbe probabilmente un peso. Ma alla fine, quello che sto facendo è, perché eseguire la separazione fisica del codice, perché dividere il codice in file o blocchi separati (metodi), quando non è necessario focalizzarsi mentalmente su un aspetto?
La separazione delle preoccupazioni dovrebbe rimanere un esercizio mentale, piuttosto che fisico?
In altre parole, dovrebbe esserci una disconnessione tra gli aspetti mentali (messa a fuoco su) e quelli fisici (codice su carta) della programmazione?