Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сильный искусственный интеллект и объектно-ориентированное программирование синтез парадигм
.pdf
мы упоминали службу «одно окно». В данном же случае ситуация не совсем противоположная, но все же логически оправданная. Напоминает это некоторую чрезмерно бюрократизированную
организацию и определенного «просителя», которому нужна
какая-либо справка. Т. е. «проситель» приходит в данную организацию, обращается в некий распределительный пункт (обработчик) и обозначает свой запрос. Его направляют в соответствующий кабинет (конкретный обработчик), в котором
(разумеется) оказывается, что ему нужно в совсем другой кабинет на другом этаже и в противоположном крыле здания, в котором (разумеется) оказывается, что ему нужно в кабинет третий,
вообще в подвале и т. д. В конце концов «проситель» получает
то, за чем приходил, и измученный, но довольный удаляется.
Бывает и такое, что он вовсе ничего не получает, но эта самая
чрезмерно бюрократизированная система все же позволяет минимизировать такой риск. Потому что в альтернативном случае –
в случае сильного зацепления «просителя» с обработчиком –
сразу после того, как «проситель» обозначил бы свой запрос, если
ему не повезло сразу попасть в нужный кабинет, его запросу
просто отказывается в удовлетворении и на этом все заканчивается.
Осмысление структуры паттерна. Собственно, вся структура данного паттерна настолько сильно похожа на структуру
связного списка, что, возможно, связный список и есть довольно
неплохая кандидатура на реализацию паттерна «Цепочка обязанностей» на уровне конкретики в рамках определенной системы.
Уточним, что мы имеем в виду односвязный список. Связный
список представляет собой структуру данных, которая напоминает в метафорическом смысле змею, а потому содержит в себе
head (голову) – первый элемент – и tail (хвост) – последний элемент. Между ними может быть сколь угодно много (зависит от
ресурсов конкретной системы) «срединных» элементов. Каждый
из элементов содержит в себе два поля: value (значение) и next
(ссылка на следующий элемент связного списка). В случае последнего элемента ссылка на следующий элемент, само собой,
отсутствует. При необходимости отыскать некоторое значение
171

в связном списке мы можем осуществить итерирование по нему
(«пробежаться» по списку) и в случае совпадения искомого
и найденного значений прекратить итерирование. Классический
алгоритм поиска. В связном списке ПК (в этом случае объекты)
являются равнозначными и связаны отношениями по типу обоюдостороннего агрегирования.
Значимость паттерна в контексте разработки систем
сильного ИИ. В контексте разработки систем сильного ИИ ПП,
который являет собой довольно близкий аналог ассоциативного
мышления, несомненно, на первый взгляд, полезен и годен к реализации. Однако есть нюанс. А именно, мы обладаем ассоциативным мышлением (предположительно) или, еще можно сказать,
гиперссылочным мышлением, что в данном контексте синонимично. Сама структура нейронных связей подразумевает реализацию чего-либо подобного. Однако если мы изначально определим, что у системы сильного ИИ должно быть именно ассоциативное мышление, то тем самым загоним систему в рамки
и нарушим свои же принципы построения систем сильного ИИ.
Мы помним, что лишены права и возможности разрешать частности и определять конкретику для интеллектуальной системы
с претензией на наличие технотропного сознания, так как мы не
можем предполагать никакого конкретного итога по причине
отсутствия шаблона сильного ИИ. В отличие от построения систем слабого ИИ, тех же нейронных сетей, в которых шаблон,
несомненно, присутствует, цели и задачи определены, алгоритмы
прописаны и так далее – здесь ситуация иная. Мы имеем право
определять лишь наиболее абстрактные константы функционирования системы – «законы физики» интеллектуальной «вселенной». Мы поступаем так для обеспечения максимально возможной
свободы системы, так как считаем, что излишняя конкрети зация
на раннем этапе создания развивающихся интеллектуальных
систем в данном случае является одной из причин отсутствия
сильного ИИ. В связи с этим для извлечения пользы из паттерна
«Цепочка обязанностей» необходимо интенсифицировать уровень абстракции. Вполне возможно, что сильный ИИ будет обладать не ассоциативным мышлением, а мышлением совершенно
172

иного, нам доселе неизвестного типа. Возможно, синергетическим или квантовым и т. д. Возможно, что ассоциативная связь –
не самый эффективный тип связи с точки зрения оптимизации
по времени или по памяти. К примеру, связь по типу квантовой
нелокальности вообще осуществляется за константное время вне
зависимости от расстояния между удаленными конечными точками. Само собой разумеется, что система сильного ИИ должна
(в соответствии с одним из основных принципов ООП) быть
внутренне сильно связанной и таковой она, несомненно, и будет.
Но вот сами типы этих внутренних связей не уточняются: они
могут быть как прямыми, так и косвенными (опосредованными),
как централизованными, так и децентрализованными, как нисходящими, так и восходящими. По сути, система в процессе своего функционирования и взаимодействия со средой должна сама
сформировать все необходимые себе связи с учетом собственных возможностей и потребностей, а также контекста их реализации. Поэтому «зародыш» системы сильного ИИ должен быть
«готов ко всему». Соответственно, в паттерне «Цепочка обязанностей» нам видятся значимыми следующие аспекты: наглядная
демонстрация практической значимости принципа слабого зацепления, а также необходимость установления специфической
связи между компонентами системы для эффективной обработки различных ситуаций, возникающих в результате взаимодействия системы со средой. На основе заимствования абстракций
паттерна мы считаем, что при разработке системы сильного ИИ
ни сильные сцепки, ни конкретный тип взаимодействия между
ПК заранее определять не целесообразно. Здесь мы реализуем
достаточно простой принцип возрастания уровня абстракций:
если нельзя определять конкретный тип взаимодействия между
ПК, то при необходимости следует определить для ПК возможность выбирать между различными типами взаимосвязи; еще
лучше – определить саму возможность возникновения подобного феномена в рамках системы; еще лучше – сформировать такую ситуацию, чтобы система сама воспроизвела и определила
для себя такую возможность, и так далее выше и выше от содержания к форме.
173

12.3. Поведенческий паттерн «Наблюдатель»
Идентификатор. Наблюдатель (Observer).
Классические элементы. Субъект, наблюдатель.
Назначение. Как указывается в Design patterns, «Наблюда-
тель» «определяет зависимость типа “один ко многим” между
объек тами таким образом, что при изменении состояния одного
объекта все зависящие от него оповещаются об этом и автоматически обновляются» [114, с. 280]. Таким образом, основным назначением паттерна «Наблюдатель» является синхронизация ПК,
которые взаимодействуют тем или иным способом и связаны,
как правило, по типу зависимости («многих от одного»). Наблюдатель призван существенно упростить и, более того, автоматизировать координацию состояний и поведения различных ПК.
Проблема. Представим себе ситуацию, что в некоторой системе наличествует определенное количество ПК, некоторые из
которых ответственны за обеспечение эффективного функционирования системы в целом. Ответственность остальных ПК
заключается в том, чтобы, так сказать, поддерживать этих «передовиков» в их деятельности. Поддержка эта может осуществляться по-разному, однако ее специфика должна быть определена некоторым конкретным образом для каждой отдельной
системы. Проблема заключается в быстрой и эффективной подстройке «помощников» под актуальные задачи «передовиков».
Если осуществлять это вручную, то реагирование системы на
быстро изменяющуюся обстановку становится недостаточно эффективным. Т. е. если сформировать сильное зацепление меж ду
субъектом и наблюдателем и обязать субъекта оповещать конкретного наблюдателя о своем состоянии и своих изменениях, то,
во-первых, ввиду наличия сильного зацепления данные ПК будет очень сложно повторно использовать и, во-вторых, это совершенно не оптимально. Это примерно как сравнить две совершенно различные по ресурсозатратности, но одинаковые в плане
целей ситуации: в первом случае у объекта А что-то случилось
и он, чтобы оповестить об этом объектов В и С, лично едет к каждому из них домой, во втором случае объект А осуществляет
174

рассылку по электронной почте. Для решения данной проблемы
и предназначен паттерн «Наблюдатель», который, конечно же,
близок ко второму примеру.
Концептуальное решение. В рамках системы происходит
следующее. Формируется некоторое количество ПК, каждому
из которых назначается определенная ответственность. И, допустим, некоторым из этих компонентов (наблюдателям) важно
иметь представление о состоянии других компонентов (субъектов). Вполне возможно, что наблюдателей интересуют не все
возможные состояния субъекта, а лишь некоторые из них (например, два из пяти или одно из десяти). В такой ситуации постоянный фоновый мониторинг субъекта со стороны наблюдателя выглядел бы абсолютно неоптимальным. Даже в том случае,
если наблюдателя интересуют сто из ста возможных состояний
субъекта, постоянный мониторинг выглядит совершенно излишним. Ведь если при изменении субъекта наблюдатель также обязан измениться, то этот процесс в любом случае дискретен. И даже если наблюдатель обязан изменяться сам в ответ на
любую трансформацию субъекта, то в те моменты, когда субъ-
ект некоторое время находится в одном и том же состоянии, наблюдатель ничего делать не обязан. И именно поэтому при на-
личии постоянного контроля состояния субъекта со стороны
наблюдателя ресурсы (возможно, нужные для чего-либо друго-
го) растрачиваются впустую, не говоря уже о нарушении принципа слабого зацепления. Решением выглядит следующее: определение механизма подписки наблюдателя на интересующие
его изменения состояния субъекта. Происходит это следующим
образом. Распределяются роли и ответственности между ПК,
определяется механизм подписки и отписки. Затем, в процессе
функционирования системы, ПК, реализующий роль субъекта,
в момент изменения своего состояния со статуса «Х» на статус
«Y» оповещает об этом всех компонентов-наблюдателей, подписанных именно на переключение статуса субъекта на «Y».
В ответ все подписанные компоненты-наблюдатели присылают
ком поненту-субъекту запрос на конкретику изменений, т. е. «спрашивают», каким именно образом им теперь необходимо изме-
175

нить свое состояние и/или поведение, и затем осуществляют
необходимые изменения. Компонент-субъект не знает, какие
именно компоненты-наблюдатели на него подписаны, и даже не
интересуется этим. Компоненты-наблюдатели, в свою очередь,
имеют механизм подписки-отписки и вольны им пользоваться
по своему усмотрению (с учетом текущей ситуации в контексте
программной системы).
Предполагаемые результаты и преимущества. В качестве
результатов полагается оптимизированное взаимодействие ПК
друг с другом (субъектов с наблюдателями), т. е. отсутствие
случаев неэкономичного использования ресурсов. Также немаловажным является соблюдение фундаментального принципа
слабого зацепления, что позволяет эффективно повторно использовать наличествующие ПК и предоставляет возможность легче
вносить изменения в систему. Также предполагается, что реализация паттерна позволяет поддерживать высокий уровень динамики в рамках системы, т. е. все необходимые изменения осуществляются быстро, точно и эффективно.
Гипотетический пример реализации паттерна. Наличествует реальный пример реализации паттерна «Наблюдатель» –
уже упомянутая рассылка по электронной почте. Каждый получатель рассылки не подписан на вообще все рассылки, которые
существуют, а также не звонит в организацию, из которой получает рассылку, каждые пять минут с вопросом на тему, что
у них там изменилось и нет ли чего-нибудь нового (клинические
случаи мы здесь не рассматриваем). Получатель рассылки подписан на те организации, которые ему интересны и важны,
а также (опционально) на те темы (предоставляемые организациями-субъектами), которые ему интересны. Это и есть реализация паттерна «Наблюдатель» в макромире. Однако данный пример слишком тривиален и интуитивно понятен, а сам паттерн
способен проявлять себя несколько сложнее и далеко не так очевидно.
К примеру, мы выше говорили о ситуации в рамках программной системы, в которой наличествуют нами определенные ПК, которые несут в себе суть «передовиков», и иные ком-
176

поненты, реализующие функционал «помощников». Мы также
указали на необходимость своевременного и адекватного реагирования «помощников» на изменившуюся для «передовиков»
ситуацию в контексте системы. В макромире бывают ситуации,
в которых примерно таким же образом реализуется паттерн
«Наблюдатель». Например, боксер перед боем и непосредственно в бою. Он сам является субъектом и «передовиком». У него
наличествует определенная команда: основной тренер, тренеры
по некоторым отдельным аспектам (общая физическая подготовка, специальная физическая подготовка и так далее), врач,
массажист, психолог, секунданты и прочие. В процессе подготовки к бою состояние субъекта-боксера претерпевает определенные изменения. В том случае, если наблюдатели (команда
боксера) некорректно и/или несвоевременно отреагируют на эти
изменения, то пострадает форма боксера и увеличится вероятность того, что бой будет им проигран. У секундантов та же ситуация наличествует непосредственно во время боя. Чтобы не
происходило некорректных реакций со стороны команды на изменения состояния боксера, определяется механизм подписки.
Каждый член команды подписывается на некоторые изменения
и берет их под свою ответственность. Тренеры следят за физической формой и за тем, чтобы она соответствовала текущему этапу подготовки, врач отслеживает результаты анализов и диагностирует общее самочувствие по некоторым критериям, психолог
следит, соответственно, за психологическим состоянием. Т. е.
врач не подписан на изменения в физической форме боксера,
а психолог не берет у него анализ крови и т. д. Каждый компонент системы под названием «Боксер и его команда» отвечает
только за то, за что способен ответить максимально эффективно
(к слову, это есть пример реализации паттерна Information expert
(«Информационный эксперт») из числа основных GRASP-паттернов). Также любой из команды может отписаться от подписки – перейти к другому боксеру, сменить специализацию
или попросту уволиться из команды. Т. е. мы наблюдаем все основные аспекты реализации паттерна «Наблюдатель» в макромире.
177

Осмысление структуры паттерна. Структура паттерна
предполагает довольно высокий уровень динамики связей между
ПК и определяется особенностями и спецификой каждой конкретной реализации. На отдельный субъект могут подписываться какие угодно наблюдатели, и сам он не интересуется
спецификой их реализации. Также наблюдателю ничто не мешает быть подписанным одновременно на несколько субъектов.
В то же время для субъекта важно, чтобы его функционирование было успешным, и только лишь в том случае, если программная реализация напоминает пример с боксером, субъект зависит
от своих наблюдателей. С другой стороны, наблюдатели также
зависимы от субъекта и успешность их функционирования также им обусловлена. Если взять подобную гипотетическую ситуацию, то тип связи между ПК напоминает обоюдостороннюю
композицию. Опять же, ничто не мешает реализовать субъект
гораздо менее зависимым от наблюдателей или наоборот, и тогда тип связи между ПК в системе уже предстанет агрегированием. Или реализовать субъект таким образом, чтобы поставить
наблюдателей в прямую одностороннюю от себя зависимость.
Или поставить субъект в прямую зависимость от его наблюдателей. А если абстрагировать паттерн «Наблюдатель» еще сильнее и вновь взглянуть на его структуру, то мы увидим, что при
определенных реализациях ничто не мешает субъекту и наблюдателю так же динамично меняться местами. Резюмируя, как
мы и постулировали изначально, связи в паттерне «Наблюдатель» динамичны и зависят от контекста каждой конкретной реализации.
Значимость паттерна в контексте разработки систем
сильного ИИ. На первый взгляд, данный паттерн, если рассма-
тривать его в контексте разработки систем сильного ИИ, ничем
особенным среди прочих паттернов не выделяется. Но если
взглянуть несколько глубже, то здесь все же имеется некоторая
уникальная особенность. А именно: беспрецедентный уровень
динамики взаимосвязей и ответственностей между ПК, сформированными в рамках реализации паттерна. Казалось бы, что
и в этом нет ничего особенного и чрезмерно значимого для реализации сильного ИИ. Однако нами предполагается, что для
178

создания системы сильного ИИ помимо уже упомянутого «первичного бульона» необходим еще и механизм запуска процесса
зарождения технотропного сознания. Мы с некоторой степенью
уверенности можем постулировать, что для возникновения феномена уровня технотропного сознания необходим механизм
самоорганизации. Т. е. механизм, который максимально «автономизирует» систему, делает ее внутренне самодостаточной.
Разница между самоорганизованными системами и системами,
не использующими данный механизм, примерно сопоставима
с разницей между летящим снарядом, выпущенным из пушки,
и летящей самостоятельно птицей: и снаряд, и птица летят, но
есть, как говорится, нюанс. Это также примерно сопоставимо
с разницей между системами слабого ИИ и сильного: и те, и другие системы будут способны к обработке информации, но нюанс
останется на своем месте. Далее, если абстрагировать сильнее
даже такую абстракцию, как самоорганизация, то станет ясно,
что все эмерджентные эффекты, все качественные «скачки», критические преобразования и прочие феномены достигаются за
счет всего лишь специфического (определенного в каждой реализации) взаимодействия между компонентами, включенными
в самоорганизационный процесс. Так как самоорганизация не
является линейным процессом, то, соответственно, некие прогнозы по поводу достигаемых ею результатов далеко не всегда
оказываются верны. Собственно говоря, они верны только в том
же смысле, в котором верно в рулетке ставить на черное. Соответственно, при определении некой системы, которая после запуска должна будет функционировать на основе механизма самоорганизации, никогда нельзя сказать заранее, какой ПК будет
ведущим («передовиком», субъектом) и какой будет последующим (наблюдателем, «помощником»). Структура паттерна «На-
блюдатель» с динамикой связей между компонентами паттерна
позволяет предусмотреть подобную ситуацию. Мы можем просто абстрактно определить саму возможность возникновения
в системе субъекта и наблюдателя, а какой именно ПК какую
позицию займет и какую ответственность примет – это уже решится «само» в ходе функционировании системы по самоорганизованному типу.
179

12.4. Поведенческий паттерн «Состояние»
Идентификатор. Состояние (State).
Классические элементы. Контекст, состояние.
Назначение. Как указывается в Design patterns, «Состояние»
«позволяет объекту варьировать свое поведение в зависимости
от внутреннего состояния. Извне создается впечатление, что изменился класс объекта» [114, с. 291]. Паттерн «Состояние» предназначен для некоторого распределения сложной и обширной
логики какого-либо ПК между несколькими ПК, каждый из
которых представляет собой некую отдельную ипостась изначального компонента со свойственным ей специфическим функционированием. Паттерн «Состояние» позволяет не допустить
нарушения принципа высокой связности, а также обеспечить выполнение одного из принципов SOLID – принципа единственной ответственности. Более того, здесь мы можем пойти дальше
и постулировать, что при помощи данного паттерна обеспечивается выполнение еще одного из принципов SOLID, а именно
принципа разделения ответственностей. Напомним, что принцип
разделения ответственностей тезисно звучит так: ПК не должны
зависеть от методов, которые они не используют. В определенном смысле данный принцип можно дополнить (с чуть менее категоричной коннотацией) следующим образом: нежелательно,
чтобы ПК зависели от методов, которые они редко используют.
Вместо этого продуктивнее было бы инкапсулировать содержимое подобного функционала в отдельные ПК. Казалось бы, что
выгода неочевидна, ведь в любом случае будет иметь место использование одним программным компонентом либо метода,
либо подкласса. На самом деле мероприятие подобного рода
усилит связность базового ПК, упростит взаимодействие пользователя с системой и сделает саму систему гораздо более понятной с точки зрения управления ею. Можно предположить,
что подобных редко используемых методов наличествует довольно большое количество. В каждом из них присутствует своя
логика, свое состояние, уникальное поведение. И специфика каждого из этих методов может настолько различаться, что действи-
180
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
