sicp.io
1.1.7 · Процедуры как абстракции черного ящика

Черный ящик как граница метода и контракта

Предоставьте вызывающему коду одну стабильную процедуру, а локальные вспомогательные процедуры и варианты декомпозиции оставьте за границей.

Вопрос для размышления

Что может измениться внутри процедуры без необходимости менять каждый вызывающий ее код?

  • Отделение публичного контракта процедуры от имен ее локальных вспомогательных процедур
  • Понимание блочной структуры как способа сохранения приватности вспомогательных связываний
  • Наблюдение за тем, как локальное имя может безопасно затенять не связанное с ним внешнее имя
  • Сравнение двух внутренних вариантов декомпозиции на одних и тех же конечных входных данных
  • Сравнение совпадающих примеров на отображаемых входных данных

sum-squares-two-largest открывает только три входных аргумента и один числовой результат. square и локальная процедура choose относятся к ее реализации. Глобальное связывание с именем choose остается равным global-marker, потому что локальная вспомогательная процедура существует только во время вычисления тела публичной процедуры. Вызывающему коду не нужна ни выбранная пара, ни имена вспомогательных процедур.

Вторая программа вычисляет один и тот же результат двумя разными вариантами декомпозиции: прямой выбор двух наибольших значений или вычитание квадрата наименьшего значения из суммы квадратов всех трех чисел. Публичный вопрос не меняется, даже если внутренняя работа различается. Совпадение подтверждает общий результат для отображаемых конечных входных данных.

Код SICP459 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает (13 61 global-marker). Вторая возвращает (61 61 #t).

    На что обратить внимание в трассе

    Войдите в sum-squares-two-largest и определите локальные связывания square и choose, не путая их с глобальным choose. В программе сравнения сопоставьте выбранную ветвь cond с путем, который суммирует три квадрата и вычитает один, отделяя итоговое наблюдение вызывающего кода от этих внутренних шагов.

    Попробуйте сами

    Измените программу и сравните результат.

    Замените тело sum-squares-two-largest на метод с вычитанием, сохранив без изменений имя, параметры и возвращаемый результат. Запустите программу на нескольких входных данных и отметьте, какой вызывающий код не потребовал изменений.

    Показать подсказку

    Граница абстракции представляет собой публичную сигнатуру процедуры и контракт результата, а имена вспомогательных процедур и декомпозиция могут оставаться локальными.

    Завершить этот урок

    В этой главе пройдено 0 из 18 уроков0%