Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сильный искусственный интеллект и объектно-ориентированное программирование синтез парадигм

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
группы изначально не заложено относительно автономное про­ведение нужной нам операции, но там оставлена возможность для компонентов второй группы такую операцию провести – «замок». Компоненты второй группы, в свою очередь, имеют определенный механизм фильтрации подходящих им компонен­тов первой группы – «ключ», и осуществляется эта фильтрация по типу компонентов первой группы. Изменение компонента первой группы при помощи компонента второй группы не изме­няет базовую сущность компонента (платоновский эйдос не ме­няется), а изменяет лишь сам компонент. И так далее. Практически идеальное соответствие паттерну «Посетитель», что уже само по себе интересно.
Осмысление структуры паттерна. Структура паттерна также является весьма эксплицитной. Само собой, понятно, что посетитель связан с конкретным посетителем отношениями наследования, как, собственно, и элемент с конкретным элемен­том. Структура объектов связана с конкретными элементами по типу композиции, т. е. она бы не смогла существовать без них. Объединяет конкретные элементы (в составе структуры объектов) с конкретным посетителем необходимость осущест­вления некоторой операции, обычно инициированная пользова­телем.
Значимость паттерна в контексте разработки систем сильного ИИ. Как мы уже упоминали в качестве примера, пат-
терн «Посетитель» являет собой отражение некоторых фунда­ментальных биологических процессов. Соответственно, мы счи­таем целесообразным применять его абстракции в контексте разработки систем сильного ИИ именно в этом ключе. Т. е. не­обходимо реализовать в рамках интеллектуальной системы ме­ханизм реализации самой возможности одних компонентов системы трансформировать другие компоненты системы специ­фическим образом и не обязательно, а ситуативно, в зависимости от контекста, а также таким образом, чтобы не осуществлялось изменение самой сути всех компонентов, а только лишь транс­формировался «фенотип» непосредственно изменяемых. Соот­ветственно, необходимо некоторым образом оформить способ-
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]