Черный ящик как граница метода и контракта
Предоставьте вызывающему коду одну стабильную процедуру, а локальные вспомогательные процедуры и варианты декомпозиции оставьте за границей.
Что может измениться внутри процедуры без необходимости менять каждый вызывающий ее код?
- Отделение публичного контракта процедуры от имен ее локальных вспомогательных процедур
- Понимание блочной структуры как способа сохранения приватности вспомогательных связываний
- Наблюдение за тем, как локальное имя может безопасно затенять не связанное с ним внешнее имя
- Сравнение двух внутренних вариантов декомпозиции на одних и тех же конечных входных данных
- Сравнение совпадающих примеров на отображаемых входных данных
sum-squares-two-largest открывает только три входных аргумента и один числовой результат. square и локальная процедура choose относятся к ее реализации. Глобальное связывание с именем choose остается равным global-marker, потому что локальная вспомогательная процедура существует только во время вычисления тела публичной процедуры. Вызывающему коду не нужна ни выбранная пара, ни имена вспомогательных процедур.
Вторая программа вычисляет один и тот же результат двумя разными вариантами декомпозиции: прямой выбор двух наибольших значений или вычитание квадрата наименьшего значения из суммы квадратов всех трех чисел. Публичный вопрос не меняется, даже если внутренняя работа различается. Совпадение подтверждает общий результат для отображаемых конечных входных данных.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (13 61 global-marker). Вторая возвращает (61 61 #t).
Войдите в sum-squares-two-largest и определите локальные связывания square и choose, не путая их с глобальным choose. В программе сравнения сопоставьте выбранную ветвь cond с путем, который суммирует три квадрата и вычитает один, отделяя итоговое наблюдение вызывающего кода от этих внутренних шагов.
Измените программу и сравните результат.
Замените тело sum-squares-two-largest на метод с вычитанием, сохранив без изменений имя, параметры и возвращаемый результат. Запустите программу на нескольких входных данных и отметьте, какой вызывающий код не потребовал изменений.
Показать подсказку
Граница абстракции представляет собой публичную сигнатуру процедуры и контракт результата, а имена вспомогательных процедур и декомпозиция могут оставаться локальными.