Primeiro, li um trecho do artigo de Edsger W. Dijkstra, de 1974, "Sobre o papel do pensamento científico":
Deixe-me tentar explicar a você, o que, para mim, é característico de todo pensamento inteligente. É que alguém está disposto a estudar em profundidade um aspecto do assunto de forma isolada por uma questão de consistência própria, sabendo o tempo todo que está se ocupando apenas com um dos aspectos. Sabemos que um programa deve estar correto e podemos estudá-lo apenas desse ponto de vista; também sabemos que deve ser eficiente e podemos estudá-la em outro dia, por assim dizer. De outro modo, podemos nos perguntar se, e se sim: por que, o programa é desejável. Mas nada é ganho - pelo contrário! - abordando esses vários aspectos simultaneamente. É o que às vezes chamei de "separação de preocupações" que, mesmo que não seja perfeitamente possível, ainda é a única técnica disponível para ordenar efetivamente os pensamentos, que eu conheço. É isso que quero dizer com "focar a atenção de alguém em algum aspecto": não significa ignorar os outros aspectos, é apenas fazer justiça ao fato de que, do ponto de vista desse aspecto, o outro é irrelevante. Ele está sendo focado em uma e várias faixas simultaneamente.
Eu vejo a separação moderna de preocupações falar sobre modularizar seu código. No entanto, ao ler a citação acima, entendo isso como focando sua mente em uma tarefa específica de cada vez, sem focar em outros aspectos. Isso não significa para mim necessariamente que o código precisa ser separado em blocos modulares.
Ou seja, digamos que exista um código à sua frente que em um arquivo tenha os conceitos de exibição, repositório, controlador, manipulação de eventos, fábrica etc. tudo em um arquivo.
Para um breve exemplo, aqui está um código que possui acesso a dados e visão (saída):
$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 o OO moderno, eu poderia colocar o acesso a dados em seu próprio arquivo usando o padrão Repository, o código View pode entrar em seu próprio modelo de arquivo, e eu posso conectá-los para se comunicar através de um controlador (ou Action ou Request Handler), e posso adicione uma fábrica para criar e conectar várias dependências. E eu posso ter um arquivo de configuração que define essas fábricas. Certamente, está a um passo de tudo em um único arquivo.
Minha pergunta sobre a separação de preocupações é a seguinte: lendo a citação de Dijkstra, tive uma idéia de que talvez ele não quisesse necessariamente que a separação de preocupações fosse "separação modular de código (em arquivos ou em suas próprias funções / métodos / etc)", e que ele pretendia mais focar a mente em um aspecto do programa, sem sobrecarregar-se com o foco em outros aspectos importantes, ainda que não sejam considerados atualmente, independentemente de serem fisicamente separados em código ou não.
Por que, então, estamos nos sobrecarregando com separação física de código modular e padrões de design? Não será suficiente focar-se apenas em um aspecto, independentemente de como seu código está estruturado?
Não estou falando sobre escrever o código de espaguete mais horrível e considerar apenas um aspecto dele, que provavelmente seria um fardo. Mas, no final, o que eu pretendo é: por que realizar a separação física do código, por que dividir o código em arquivos ou blocos separados (métodos), quando não é necessário se concentrar mentalmente em um aspecto?
A separação de preocupações deve permanecer um exercício mental, e não físico?
Em outras palavras, deve haver uma desconexão entre os aspectos mental (foco) e físico (código no papel) da programação?
IF
, WHILE
, FOR
em vez de GOTO
. Modular = módulos com uma API pública bem definida, estritamente separada de uma implementação e representação interna oculta. (Por exemplo, Modula, Mesa, Modula-2, Modula-3, depois dialetos em Pascal ( UNIT
).)