In primo luogo, ho letto un estratto del saggio di Edsger W. Dijkstra del 1974 "Sul ruolo del pensiero scientifico":
Lascia che provi a spiegarti, quali sono i miei gusti caratteristici di tutto il pensiero intelligente. È che uno è disposto a studiare in profondità un aspetto della propria materia in isolamento per il bene della propria coerenza, sapendo sempre che si sta occupando solo uno degli aspetti. Sappiamo che un programma deve essere corretto e possiamo studiarlo solo da quel punto di vista; sappiamo anche che dovrebbe essere efficiente e possiamo studiarne l'efficienza un altro giorno, per così dire. In un altro stato d'animo possiamo chiederci se, e se sì: perché, il programma è desiderabile. Ma non si ottiene nulla - al contrario! - affrontando questi vari aspetti contemporaneamente. È ciò che a volte ho chiamato "la separazione delle preoccupazioni", che, anche se non perfettamente possibile, è ancora l'unica tecnica disponibile per l'ordinamento efficace dei propri pensieri, che io conosca. Questo è ciò che intendo per "focalizzare la propria attenzione su un aspetto": non significa ignorare gli altri aspetti, è solo rendere giustizia al fatto che dal punto di vista di questo aspetto, l'altro è irrilevante. Si tratta di essere pensati per una o più tracce contemporaneamente.
Vedo una moderna separazione delle preoccupazioni parlare della modularizzazione del codice. Tuttavia, leggendo la citazione sopra, capisco che focalizzare la tua mente su un compito specifico alla volta, senza concentrarsi su altri aspetti. Questo non significa necessariamente che il codice debba essere separato in blocchi modulari.
Cioè, supponiamo che ci sia un codice davanti a te che in un file ha i concetti di vista, repository, controller, gestione degli eventi, factory, ecc. In un unico file.
Per un breve esempio, ecco un po 'di 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>
Usando la OO moderna, potrei inserire l'accesso ai dati nel suo file usando il modello Repository, il codice View può andare nel suo modello di file e posso collegarli insieme per comunicare tramite un controller (o Action o Request Handler), 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 che la separazione delle preoccupazioni fosse "separazione modulare del codice (in file o le loro funzioni / metodi / ecc."), e che intendeva di più concentrare la propria mente su un aspetto del programma, senza appesantire se stessi concentrandosi su altri aspetti importanti ma al momento non da considerare, indipendentemente dal fatto che siano fisicamente separati nel codice o meno.
Perché allora ci stiamo caricando con la separazione del codice modulare fisico e i modelli di progettazione? Non basterà concentrarsi su un aspetto, indipendentemente da come è strutturato il codice?
Non sto parlando di scrivere il più orribile codice di spaghetti e quindi solo di considerarne un aspetto, sarebbe probabilmente un peso. Ma alla fine, quello che sto andando verso, è, perché eseguire la separazione del codice fisico, perché dividere il codice in file o blocchi separati (metodi), quando non è necessario per 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 (focus on) e quelli fisici (code on paper) della programmazione?
IF
, WHILE
, FOR
anziché GOTO
. Modular = moduli con un'API pubblica ben definita rigorosamente separata da un'implementazione e una rappresentazione interne nascoste. (Ad esempio Modula, Mesa, Modula-2, Modula-3, poi dialetti Pascal ( UNIT
).)