Tout d'abord, j'ai lu un extrait du document de 1974 d'Edsger W. Dijkstra "Sur le rôle de la pensée scientifique":
Permettez-moi d'essayer de vous expliquer ce qui, à mon goût, est caractéristique de toute pensée intelligente. C'est que l'on est prêt à étudier en profondeur un aspect de son sujet de manière isolée pour sa propre cohérence, tout en sachant que l'on ne s'occupe que de l'un des aspects. Nous savons qu'un programme doit être correct et nous ne pouvons l'étudier que de ce point de vue; nous savons également qu'elle doit être efficace et nous pouvons étudier son efficacité un autre jour, pour ainsi dire. Dans une autre humeur, nous pouvons nous demander si, et si oui: pourquoi, le programme est souhaitable. Mais rien n'est gagné - bien au contraire! - en abordant ces différents aspects simultanément. C’est ce que j’ai parfois appelé «la séparation des préoccupations» qui, même si ce n’est pas parfaitement possible, est encore la seule technique disponible pour ordonner efficacement ses pensées, à ma connaissance. C'est ce que je veux dire par «concentrer son attention sur un aspect»: cela ne signifie pas ignorer les autres aspects, c'est simplement rendre justice au fait que du point de vue de cet aspect, l'autre est sans pertinence. Il est à l'esprit unique et à pistes multiples simultanément.
Je vois une séparation moderne des préoccupations parler de la modularisation de votre code. Cependant, en lisant la citation ci-dessus, je comprends que cela concentre votre esprit sur une tâche particulière à la fois, sans vous concentrer sur d'autres aspects. Cela ne signifie pas nécessairement pour moi que le code doit être séparé en morceaux modulaires.
C'est-à-dire, disons qu'il y a un code devant vous qui dans un fichier contient les concepts de vue, référentiel, contrôleur, gestion des événements, usine, etc. dans un seul fichier.
Pour un bref exemple, voici un code qui a accès aux données et affiche (sortie):
$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>
En utilisant OO moderne, je pourrais placer l'accès aux données dans son propre fichier en utilisant le modèle de référentiel, le code View peut aller dans son propre modèle de fichier, et je peux les câbler ensemble pour communiquer via un contrôleur (ou Action ou Request Handler), et je peux ajouter une fabrique pour créer et câbler diverses dépendances. Et je peux avoir un fichier de configuration qui définit ces usines. C'est sûrement une étape loin de tout ce qui concerne un seul fichier.
Ma question sur la séparation des préoccupations est la suivante: en lisant la citation de Dijkstra, j'ai eu une idée que peut-être il ne voulait pas nécessairement dire que la séparation des préoccupations était "une séparation modulaire du code (dans des fichiers ou leurs propres fonctions / méthodes / etc)", et qu'il voulait davantage concentrer son esprit sur un aspect du programme, sans se contraindre à se concentrer sur d'autres aspects importants mais non actuellement à prendre en considération, qu'ils soient physiquement séparés dans le code ou non.
Pourquoi alors nous alourdissons-nous avec des modèles physiques de séparation et de conception de codes modulaires? Ne sera-t-il pas suffisant de se concentrer uniquement sur un aspect, quelle que soit la structure de votre code?
Je ne parle pas de rédiger le code de spaghetti le plus horrible et de n'en considérer qu'un aspect, ce serait probablement un fardeau. Mais à la fin, ce vers quoi je m'oriente, c'est pourquoi effectuer la séparation physique du code, pourquoi diviser le code en fichiers séparés ou en morceaux (méthodes), alors qu'il n'est pas nécessaire de se concentrer mentalement sur un aspect?
La séparation des préoccupations doit-elle rester un exercice mental plutôt que physique?
En d'autres termes, devrait-il y avoir une déconnexion entre les aspects mental (concentration) et physique (code sur papier) de la programmation?
IF
, WHILE
, au FOR
lieu de GOTO
. Modular = modules avec une API publique bien définie strictement séparée d'une implémentation et d'une représentation internes cachées. (Par exemple Modula, Mesa, Modula-2, Modula-3, plus tard les dialectes Pascal ( UNIT
).)