SICP. Модульность

В прошлых статьях мы разобрали основные темы из первой и второй главы сикпа.
В первой главе было про функции и ранги абстракции:

Во второй главе про типы данных:

С этой статьи начинаем главу про модульность кода: как правильно разбивать задачу на части и изолировать их друг от друга.

Разбить по кусочкам

Модульность, она как пицца: есть какая-то общая основа и на неё накладываются кусочки со своими фишками. Можно было бы собирать данные с маленьких кусочков по-отдельности, но это не так хорошо, как собрать всё в одной красивой программе.

Модульность бывает по коду и по файлам. Опять пример с пиццой: аккуратно разложенные ингредиенты — это кодовая модульность, а отдельные кусочки — это файловая модульность. Вместе получается целая и красивая пицца.

Пишем код, разносим его по файлам и собираем всё в одну программу

Состояние данных

Модуль это маленькая программа, она делает свою маленькую работу. Обычно модули работают с какими-то объектами, например прокси-ченджер должен работать с объектом прокси. В объекте есть переменные для данных и у этих данных могут меняться состояния. Чтобы запоминать эти состояния и не мешать другим модулям, данные замыкают в нужной области видимости.

Объясним на примере квартиры и комнат
Для каждой комнаты есть отдельные пробки для подачи электричества, а в этой комнате есть свои переключатели и розетки.
Допустим, начал гореть чайник и его можно вырубить тремя способами: выключить удлинитель, выключить пробки комнаты и выключить пробки всей квартиры. Получается три уровня вложенности модулей: на уровне комнаты чайник и тостер равны и не зависят друг от друга, но зависят от пробок кухни.
Вот пример состояния объекта без замыкания.

Получается

=> Свет включен
=> Свет выключен
=> Свет включен
=> Свет выключен

Замыкаем состояние состояние переключателя. Код работает так же, но теперь состояние объекта защищено и никому не мешает

Такой подход напоминает ООП — объектно ориентированное программирование. Программа будет почти целиком состоять из независимых объектов на одном уровне модульности. В ООП это называется наследованием. Когда будем проходить C++ объясним.

Как работает

Чтобы работать с областями видимости нужна модель вычислений с окружениями. Она запоминает имя переменной и место где она хранится, это место называется окружением.

Технически, окружение — последовательность кадров, в каждом кадре лежит таблица связываний. В таблице хранится ссылка на окружение выше и пары: (имя переменной, её значение).
В таком коде будет два кадра

При вычислении суммы a и b, интерпретатор возьмёт значение a из оранжевой области, а b из синей

В нашем примере с переключателем тоже два кадра, но во втором будет две ссылки

Поделиться
Отправить
Запинить
 35   1 мес   sicp
Популярное