2.21 Модульность
Для того, чтобы с большой системой можно было работать, ее придется разбить на части. Это нужно и тем, кто пытается понять, как она работает (им хорошо бы сосредоточиться на одной такой части, забыв об остальных). И, конечно, без этого не обойтись тем, кто создает систему: они не смогут ни придумать одно большое решение для огромной проблемы, ни воплотить его, если все вместе будут работать со всей системой разом.
Даже средняя программа не помещается целиком в голове у одного человека, поэтому необходимо разбивать программы на небольшие части. Будем называть такие части модулями.
Разбиение большой задачи на более мелкие называется декомпозицией задачи. Разумно делить систему на модули так, чтобы каждый модуль решал некоторую относительно изолированную задачу, описание которой можно удержать в голове.
На самом деле понятие модуля на разных уровнях абстракции нужно трактовать по-разному. Дело в том, что очень большую задачу стоит разбить на задачи поменьше, эти в свою очередь — на еще более мелкие, и так далее, пока размер задачи не станет подвластен одному человеку. Каждое разбиение соответствует понижению уровня абстракции, поскольку при таком «измельчении» задачи все более и более конкретизируются (термин «конкретный» — антоним термина «абстрактный»). На каждом уровне задаче сопоставляется некий модуль. Сначала это подсистемы, затем, возможно, пакеты, подпакеты и, наконец, классы. В любом случае каждый модуль должен решать свою задачу и только ее.
Затем из реализаций маленьких задач необходимо составить решение исходной задачи.
Этот процесс называется композицией. Композиция — это фактически подъем по уровням абстракции (сборка более крупных модулей из более мелких).
Можно подумать, что процессы декомпозиции и композиции проходят отдельно и разнесены во времени. Как правило, это не так. Все задачи решаются постепенно: выделяются подзадачи, они решаются, интегрируются в систему, выделяются новые подзадачи.