Установка пакета в таблицу вместо правки вызовов
Установите конструкторы и селекторы конкретных представлений по ключам операции и типа, а затем добавьте новый пакет без изменения обобщенного диспетчера.
Как обобщенная система может получить еще одно представление или операцию без изменения единого центрального условного выражения?
- Сохранение процедур под явными ключами операции и типа
- Разделение установки пакета и последующего обобщенного применения
- Передача методам конкретного представления только содержимого без тегов
- Добавление второго представления без изменения apply-generic
- Наблюдение аддитивности в виде роста таблицы при неизменном клиентском коде
Каждая процедура установки управляет деталями одного представления и регистрирует четыре метода. apply-generic умеет только считывать тег типа, извлекать метод и передавать ему содержимое. Содержимое rectangular хранит x перед y, а содержимое swapped хранит y перед x. Оба пакета удовлетворяют одному и тому же протоколу для real-part, imag-part, magnitude-squared и конструкторов.
Вторая программа начинается только с метода описания для integer. Рациональное значение rational сначала приводит к no-method. Установка еще одной записи в таблицу позволяет тому же диспетчеру describe принять это значение без изменения диспетчера или пакета integer. Аддитивность здесь явная и конечная: расширение происходит путем регистрации еще одного метода под новым ключом.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа с пакетами возвращает (4 8 rectangular swapped 3 4 25 3 4 25). Программа аддитивного расширения возвращает ((integer 7) no-method (fraction 3 2) 2).
Отделите вызовы put на этапе установки от последующих get и вызовов методов. Убедитесь, что apply-generic остается без изменений при установке пакета swapped. Во второй программе сравните поиск для rational до и после появления новой записи в таблице.
Измените программу и сравните результат.
Добавьте представление translated, содержимое которого хранит x плюс 10 и y плюс 10. Установите селекторы, вычитающие смещение, и убедитесь, что существующий обобщенный клиент по-прежнему наблюдает 3, 4 и 25.
Показать подсказку
Оставьте смещение полностью внутри нового конструктора и методов, не добавляя ветвление по типу в apply-generic.