BlackboardObject* target;
KnowledgeSource* creator;String};
Отметим, что мы повторно использовали еще один класс среды, описанной в главе 9, а именно, параметризуемый класс String
.Класс Assumption
является объектом информационной доски, поскольку информация о сделанных предположениях используется всеми источниками знаний. Отдельные члены класса выражают следующие его свойства:• target -
Объект доски, о котором делается предположение.• creator -
Источник знаний, который сделал предположение.• reason -
Основание для сделанного предположения.• cipherLetter -
Предполагаемое значение буквы исходного текста.Необходимость каждого из перечисленных свойств в значительной степени объясняется природой предположений: источник знании формирует предполагаемое соответствие "буква исходного текста - буква шифра" на основании каких-то причин (обычно, некоторого правила). Назначение первого свойства target
менее очевидно. Оно нужно для отката. Если сделанное предположение не подтвердится, то нужно восстановить состояние объектов на доске, которые воспользовались предположением, а они должны известить источники знаний, что их смысл изменился.Далее определим подкласс Assertion
:class Assertion : public Assumption ...
Общим для классов Assumption
и Assertion является следующий селектор:• isRetractable -
Является ли соответствие потенциально неверным?Для всех высказанных предположений значение предиката isRetractable
является истинным, а для утверждений - ложным. Сделанное утверждение уже нельзя ни изменить ни отвергнуть.На рис. 11-2 приведена диаграмма, поясняющая связь классов зависимостей и высказываний. Обратите особое внимание на роли, которые играют упомянутые абстракции в различных ассоциациях. Например, класс KnowledgeSource
в одном аспекте является создателем (creator) предположения, а в другом - ссылается (referencer) на букву шифра. Из различия ролей естественным образом вытекают различия протоколов взаимодействия.Проектирование объектов информационной доски. Завершим проектирование, добавив кроме класса алфавита классы для предложения (Sentence)
, слова (Word) и буквы шифра (cipherLetter). Предложение представляет собой просто объект доски (от которого зависят другие объекты), содержащий список слов, Исходя из этого, запишем:class Sentence : public BlackboardObject, virtual public Dependent {
public:...protected:List
};
Суперкласс Dependent
определен виртуальным, поскольку мы ожидаем, что будут подклассы от sentence, которые захотят наследовать также и от Dependent. При этом для всех таких подклассов члены класса Dependent будут общими.В дополнение к операциям register
и resign (определенным в суперклассе BlackboardObject) и четырем операциям, унаследованным от класса Dependent, мы добавляем еще две специфические операции для предложения:• value -
Текущее значение предложения.• isSolved -
Истинно, если о всех словах в предложении сделаны утверждения.Первоначальное значение value
совпадает с текстом криптограммы. Когда isSolved станет истиной, value вернет исходный расшифрованный текст.Слово является объектом доски и источником зависимости. Оно состоит из букв. Для удобства источников знаний в класс слова введены указатели на все предложение, а также на предыдущее и следующее слова в предложении. Описание класса Word
выглядит так:class Word : public BlackboardObject, virtual public Dependent {
public:...Sentence& sentence() const;
Word* previous() const;Word* next() const;protected:
List
};
Так же как для предложения, в класс слова введены две дополнительные операции:
• value -
Текущее значение слова.• isSolved -
Истинно, если о всех буквах слова сделаны утверждения.Теперь можно определить класс cipherLetter
(буква шифра). Буквы шифра являются объектами информационной доски и порождают зависимости. Кроме того, они имеют значение (буква, как она записывается в шифровке, например, н) и коллекцию возможных предположений и утверждений о соотнесении ее с буквами исходного текста. Для организации коллекции мы используем класс Affirmation. Опишем класс буквы следующим образом: