Сначала я прочитал отрывок из статьи Эдсгера В. Дейкстры 1974 года «О роли научной мысли»:
Позвольте мне попытаться объяснить вам, что на мой вкус характерно для всего разумного мышления. Дело в том, что человек желает углубленно изучать аспект своего предмета изолированно ради своей собственной последовательности, все время зная, что он занимает себя только одним из аспектов. Мы знаем, что программа должна быть правильной, и мы можем изучать ее только с этой точки зрения; мы также знаем, что он должен быть эффективным, и мы можем, так сказать, изучить его эффективность в другой день. В другом настроении мы можем спросить себя, а если да, то почему программа желательна. Но ничего не получается - наоборот! - одновременно занимаясь этими различными аспектами. Это то, что я иногда называю «разделением интересов», что, даже если это не вполне возможно, пока что это единственная доступная техника для эффективного упорядочения своих мыслей, о которой я знаю. Это то, что я имею в виду под «сосредоточением своего внимания на каком-то одном аспекте»: это не означает игнорирование других аспектов, это просто признание того факта, что с точки зрения этого аспекта другой не имеет значения. Это одно- и многодорожечный одновременно.
Я вижу, что современное разделение проблем говорит о модульности вашего кода. Однако, читая цитату выше, я понимаю, что фокусирую свой ум на одной конкретной задаче за раз, не сосредотачиваясь на других аспектах. Это не обязательно означает, что код должен быть разделен на модульные блоки.
То есть, скажем, перед вами код, который в одном файле содержит понятия представления, репозитория, контроллера, обработки событий, фабрики и т. Д. - все в одном файле.
Для краткого примера, вот код, который имеет доступ к данным и представление (вывод):
$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>
Используя современную OO, я мог бы разместить доступ к данным в своем собственном файле, используя шаблон Repository, код View может перейти в собственный шаблон файла, и я могу связать их вместе для связи через контроллер (или Action или Request Handler), и я могу добавить фабрику для создания и подключения различных зависимостей. И у меня может быть файл конфигурации, который определяет эти фабрики. Конечно, это один шаг от одного файла-все.
Мой вопрос о разделении интересов выглядит так: читая цитату Дейкстры, я понял, что, возможно, он не обязательно подразумевал разделение задач как «модульное разделение кода (на файлы или их собственные функции / методы / и т. Д.)», и что он имел в виду больше, чтобы сосредоточить свое внимание на аспекте программы, не обременяя себя сосредоточением на других важных, но пока не рассматриваемых в настоящее время аспектах, независимо от того, физически они разделены в коде или нет.
Почему же тогда мы обременяем себя физическим модульным кодовым разделением и шаблонами проектирования? Будет ли недостаточно просто сосредоточиться на аспекте, независимо от того, как структурирован ваш код?
Я не говорю о написании самого ужасного кода для спагетти, а только о его аспекте, который, вероятно, будет обременительным. Но, в конце концов, я иду к тому, зачем выполнять физическое разделение кода, зачем разбивать код на отдельные файлы или порции (методы), когда нет необходимости мысленно фокусировать себя на аспекте?
Должно ли разделение интересов оставаться умственным упражнением, а не физическим?
Другими словами, должно ли существовать несоответствие между ментальными (фокус на) и физическими (код на бумаге) аспектами программирования?
IF
, WHILE
, FOR
а GOTO
. Modular = модули с четко определенным публичным API, строго отделенным от скрытой внутренней реализации и представления. (Например, Модула, Меса, Модула-2, Модула-3, более поздние диалекты Паскаля ( UNIT
).)