Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сильный искусственный интеллект и объектно-ориентированное программирование синтез парадигм
.pdf
группы изначально не заложено относительно автономное проведение нужной нам операции, но там оставлена возможность
для компонентов второй группы такую операцию провести –
«замок». Компоненты второй группы, в свою очередь, имеют
определенный механизм фильтрации подходящих им компонентов первой группы – «ключ», и осуществляется эта фильтрация
по типу компонентов первой группы. Изменение компонента
первой группы при помощи компонента второй группы не изменяет базовую сущность компонента (платоновский эйдос не меняется), а изменяет лишь сам компонент. И так далее. Практически
идеальное соответствие паттерну «Посетитель», что уже само
по себе интересно.
Осмысление структуры паттерна. Структура паттерна
также является весьма эксплицитной. Само собой, понятно, что
посетитель связан с конкретным посетителем отношениями
наследования, как, собственно, и элемент с конкретным элементом. Структура объектов связана с конкретными элементами
по типу композиции, т. е. она бы не смогла существовать без
них. Объединяет конкретные элементы (в составе структуры
объектов) с конкретным посетителем необходимость осуществления некоторой операции, обычно инициированная пользователем.
Значимость паттерна в контексте разработки систем
сильного ИИ. Как мы уже упоминали в качестве примера, пат-
терн «Посетитель» являет собой отражение некоторых фундаментальных биологических процессов. Соответственно, мы считаем целесообразным применять его абстракции в контексте
разработки систем сильного ИИ именно в этом ключе. Т. е. необходимо реализовать в рамках интеллектуальной системы механизм реализации самой возможности одних компонентов
системы трансформировать другие компоненты системы специфическим образом и не обязательно, а ситуативно, в зависимости
от контекста, а также таким образом, чтобы не осуществлялось
изменение самой сути всех компонентов, а только лишь трансформировался «фенотип» непосредственно изменяемых. Соответственно, необходимо некоторым образом оформить способ-
221

ности подобных компонентов к взаимодействию. И здесь также
неплохо подходит концепция key – value, таким же образом реализованная в рамках данного паттерна.
Выводы по главе 12
Как уже говорилось, поведенческие паттерны предназначены для обеспечения некоторых связей между ПК в контексте системы. Здесь постулировать о том, что они являются важными,
было бы тривиально, так как это само собой разумеется – компоненты программной системы должны быть взаимосвязаны,
иначе мы в принципе не можем говорить о системе. Однако поведенческие паттерны описывают специфические взаимосвязи
ПК, в основе которых лежит многообразие фундаментальных
аспектов, обуславливающих собой возможности компонентам
связываться друг с другом тем или иным способом. Т. е. поведенческие паттерны описывают наиболее продуктивные и целесообразные виды возможных связей между компонентами
в контексте достижения системой какой-либо конкретной цели.
И в этом смысле поведенческие паттерны и описываемые в их
рамках связи являются крайне значимыми.
К примеру, паттерн «Хранитель» не просто является определенной последовательностью действий по формированию ПК,
отвечающей за некую «память» вообще, скорее всего это было
бы расточительным и излишним. Данный паттерн обуславливает построение системы контроля версий какого-либо необходимого нам компонента (компонентов, групп) системы, причем
осуществляет это, не нарушая структуры этого компонента, так
как в таком случае было бы больше вреда, чем пользы. Данный
паттерн позволяет отдельным программным компонентам и их
группам возвращаться к своим прошлым состояниям, причем
в конкретные их версии, определенные необходимостью. И «Хранитель» помимо высокого уровня практической значимости обладает также и иной – значимостью экзистенциальной, так как
сам феномен возвращения, если он проявляется в результате самоорганизации, а не определен заранее, реализуется только на
человекоразмерном уровне.
222

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

страктное выражение, задает общее направление процессу интерпретирования, осуществляемому системой, и является крайне
значимым для дальнейшего формирования внутреннего контекста системы.
При исследовании паттерна «Стратегия» нами были выявлены множественные пересечения абстрактной сути паттерна и непосредственно процесса формирования системы сильного ИИ
(как он представляется в соответствии с нашей концепцией): из
изначально не вполне четко определенной системы, обладающей
некоторым потенциалом формирования в себе тех или иных механизмов, по итогу ее развития получается эффективно функционирующая сложная, распределенная, иерархически оформленная система, все ПК которой несут в себе свой функционал,
успешно справляются со своей ответственностью и действуют
в синергии.
Паттерн «Итератор» предлагает крайне удобный для системы
вариант поиска необходимых информационных «блоков» в структурах данных.
«Шаблонный метод» позволяет определить общую константную структуру некоторого сложного алгоритма и уже непосредственно локально, «на местах», реализовывать определенные
шаги в соответствии со строгой, изначально заданной их последовательностью.
Паттерн «Посредник», несмотря на его утилитарное название, предполагает последовательность действий, направленную
на формирование в контексте системы некоего аналога того, что
у человека называется мозгом и реализованной на основе мозга
психикой. Т. е. данный паттерн берет на себя ответственность за
формирование центрального «узла», который будет осуществлять оркестрацию всей системы в целом.
А паттерн «Посетитель» представляет собой программный
аналог функционирования ферментов в биологических системах и осуществляет преобразование ПК в соответствии с их
внутренним потенциалом, который все же активируется непосредственно ферментами (посетителями), а не сам по себе.
224

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

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

разработки программного обеспечения (посредством, в том числе, и структурных паттернов) и в макромире. Если представить
некую систему, которая изначально была более или менее однообразной, но затем начала претерпевать некоторые трансформации, в ходе которых из различных компонентов образуются более
крупные структуры, то сразу же придет аналогия с гравитацией, т. е. с ситуацией, в рамках которой более крупный объект
притягивает к себе более мелкие для дальнейшего осуществления процесса глобального «бодибилдинга». Или, к примеру, когда,
согласно некоторым психоаналитическим традициям, из изначально незначительно дифференцированной человеческой психики начинают формироваться «Эго», «Супер-Эго», «Оно» – процесс «бодибилдинга» уже интерпсихического. Примеры можно
продолжать, но суть ясна – структурные паттерны в рамках разработки компьютерных программ упорядочивают и регламентируют те же самые процессы в абстрактном их виде. И если,
к примеру, поведенческие паттерны выполняют то же самое
с функциональной точки зрения, то структурные паттерны, как
видно непосредственно из их определения, делают это со структурной точки зрения.
Таким образом, к структурным GoF-паттернам относятся семь
из общего их числа:
«Адаптер»
«Прокси»
«Мост»
«Компоновщик»
«Декоратор»
«Фасад»
«Приспособленец»
13.1. Структурный паттерн «Адаптер»
Идентификатор. Адаптер (Adapter).
Классические элементы. Целевой, адаптируемый, адаптер.
Назначение. Как указывается в Design patterns, «Адаптер»
«преобразует интерфейс одного класса в другой интерфейс, ко-
227

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

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

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