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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
наличествует базовый родительский ПК, представленный аб-
страктным классом, и дочерние компоненты этого абстракт­ного класса. Само собой разумеется, что данные компоненты
связаны наследственностью.
Значимость паттерна в контексте разработки систем
сильного ИИ. «Шаблонный метод» представляет немалый инте-
рес для сферы разработки систем сильного ИИ. Конечно, явля­ется понятным, что на одном-единственном паттерне, каким бы именно он ни был, вряд ли удастся сформировать технотропное сознание – те абстракции, которые нами выявляются на основе паттернов ООП, будут функционировать в некой комбинации. Вот и «Шаблонный метод», точнее те абстракции, которые в не­го имплицитно встроены, также будут скооперированы с неко­торыми иными. Однако же в самом по себе «Шаблонном мето­де» также наличествует нечто ценное, а именно – незыблемость структуры реализации алгоритма. Т. е., каким бы образом ни были переопределены «на местах» абстрактные методы, ша­блонный метод (как элемент паттерна) останется самим собой и будет на своем месте делать то, что должен. Собственно гово­ря, здесь речь идет также о качественных преобразованиях.
К примеру, как мы уже ранее постулировали, человек спосо­бен очень сильно трансформироваться как внешне, так и вну­тренне, но тем не менее человеком быть он от этого не переста­нет. Нельзя будет посмотреть на него и начать утверждать, что перед нами не человек, а какое-то другое существо. Это означа­ет, что у человека наличествует некая абстрактная основа, незы­блемость которой прочно удерживает его в рамках классовой (в контексте ООП) принадлежности. Таким образом (говоря ско­рее экзистенциально), у человека наличествует нечто, позволяю­щее ему быть и оставаться человеком. Формальнее – у человека есть некие абстрактные характеристики, ответственность кото­рых заключается в том, чтобы человек не был способен претер­петь преобразования такого уровня, который кардинально пре­образует его природу.
Собственно говоря, нечто подобное, какой-то схожий меха­низм, некие чрезвычайно «прочные» абстракции, те самые, ко-
211
торые не позволяют преодолевать рамки класса, которые не позволяют быть способным на качественное преобразование с по явлением новых, эмерджентных свойств, являют собой крае­угольный камень на пути создания системы сильного ИИ. И в ра­боте с такого рода абстрактными свойствами мы также видим как минимум два этапа: на первом необходимо заставить систе­му преодолеть абстрактные ограничения подобного толка с тем, чтобы выйти на уровень наличия технотропного сознания; на втором же мы считаем целесообразным непосредственное взаи­модействие интеллектуальной системы с определенными аб­страктными аспектами самой себя для их осознания и повторно­го использования в соответствии со своими предпочтениями. И в контексте реализации данных этапов и способны помочь аб­страктные аспекты паттерна «Шаблонный метод».
12.10. Поведенческий паттерн «Посредник»
Идентификатор. Посредник (Mediator). Классические элементы. Посредник, конкретный посредник,
коллеги.
Назначение. Как указывается в Design patterns, «Посредник» «определяет объект, инкапсулирующий способ взаимодействия множества объектов. Посредник обеспечивает слабую связан­ность системы, избавляя объекты от необходимости явно ссы­латься друг на друга…» [114, с. 263]. Под «связанностью» в данном случае, конечно, подразумевается зацепление – про путаницу с данными понятиями мы уже говорили ранее. Паттерн «По­средник» представляет собой ПК, предназначенный для, как по­нятно из названия, осуществления посредничества между дру­гими ПК.
Проблема. В рамках некоторой программной системы нали­чествует определенное количество ПК, которые некоторым об­разом связаны друг с другом. Функционирование каждого из этих компонентов зависит от функционирования некоторого ко­личества других компонентов. В самом худшем случае функци­онирование каждого из компонентов подобной системы зависит
212
сразу от всех других компонентов этой системы. Как следствие этого, мы не можем безопасно трансформировать ни один из компонентов системы, так как рискуем нарушить функциониро­вание системы в целом. Также мы совершенно лишены возмож­ности повторно использовать какой-либо из этих компонентов, так как будем вынуждены использовать всю систему сразу. По­нятно, что пример несколько утрирован, но тем не менее перед нами, по сути, худший случай нарушения фундаментального принципа слабого зацепления. Само собой разумеется, что по­добную систему необходимо существенно трансформировать. Это можно осуществить при помощи паттерна «Посредник».
Концептуальное решение. В противовес организации си­стемы, подобной вышеприведенной, мы формируем систему в со­ответствии с возможностями паттерна «Посредник». Опять же, у нас имеется некоторая система с определенным количеством ПК. Успешность функционирования одного отдельно взятого компонента все так же зависит от некоторых других компонен­тов. Только в данном случае он уже не знает, от каких именно, и никак с ними напрямую не связан, а они – компоненты, от ко­торых зависит его функционирование, – также не знают, какой же компонент от них зависит (так как он, в сущности, уже и не зависит). Вся связь в рамках подобной системы осуществляется через специфический ПК (конкретный посредник), который осу- ществляет всю медиацию в системе. Конечно, при большой си­стеме мы бы воздержались от того, чтобы в буквальном смысле нагружать один-единственный ПК ответственностью за функ­ционирование всей системы. Мы бы скорее определили базовый ПК (посредник), в котором, в свою очередь, определили бы об­щий интерфейс и функционал всех дочерних подкомпонентов. Это бы позволило создать в рамках системы некоторое количе­ство компонентов-медиаторов, ответственных за осуществление связи между различными компонентами (коллегами) системы. Таким образом, в рамках системы мы получаем большое коли­чество ПК, связанных исключительно с посредниками, т. е. пря­мой связи между компонентами, которые не являются посредни­ками, не установлено. Посредник же, в свою очередь, сам не
213
удовлетворяет поступающие к нему от компонентов системы запросы, а подбирает наиболее подходящие из доступных ему ПК. Подобранный компонент удовлетворяет входящий запрос и пересылает результат посреднику, который транслирует этот результат тому компоненту, который посылал запрос. Теперь при желании добавить в такую систему новый компонент нам про­сто нужно подключить его к соответствующему посреднику. Также при желании повторно использовать ПК в некотором ином контексте у нас не должно возникнуть проблем, так как все ком­поненты, не являющиеся посредниками, связаны только с по­средниками. Т. е. мы можем взять копию ПК и поместить ее в другой контекст, просто привязав к тому посреднику, который за тот контекст ответственен. Соответственно, после реализа­ции паттерна система выглядит и функционирует совершенно иначе.
Предполагаемые результаты и преимущества. Соблюде­ние фундаментального принципа слабого зацепления со всеми практическими выгодами, получаемыми из этого. Формирова­ние эластичной, податливой к изменениям и добавлению нового функционала системы. Реализация возможности повторного ис­пользования ПК. Унификация способов взаимодействия между ПК системы.
Гипотетический пример реализации паттерна. Приме­ров реализации паттерна в макромире огромное множество: колл-центры, логистические центры, любые диспетчеры и свя­зующие звенья. Пример реализации паттерна в контексте функ­ционального программирования нами также уже ранее приво­дился. Однако позволим себе еще один, возможно несколько грубоватый и чересчур приближенный, но тем не менее пример. Представим себе некоторое предприятие, в котором наличеству­ет два цеха по производству чего-либо (не важно, чего именно). И отличается данное предприятие одной интересной особен­ностью. А именно – каждый инструмент на предприятии пред­ставлен в единственном экземпляре и находится то в одном цеху, то в другом. Каждому рабочему данного предприятия для получения необходимого ему в данный момент инструмента
214
в случае отсутствия оного в его собственном цеху приходится идти в дру гой цех и там искать, у кого же на рабочем месте сей­час находится искомый инструмент. Так как подобное сильно снижает производительность и выработку предприятия в том плане, что слишком много времени тратится на поиск инструмен­та и рабочие постоянно ругаются между собой по поводу взятых без спроса инструментов, было постановлено как-то решать эту проблему. И так как план закупки дополнительного оборудования начальству отчего-то не понравился, было принято решение – нанять специального менеджера по локализации инструмента­рия. Этот человек сидит в проходе между двумя цехами, и к не­му адресованы все запросы по быстрому поиску инструментов в соседнем цеху. Теперь рабочим нет необходимости тратить вре­мя на поиски и покидать рабочее место, а также никто никогда не знает, кто именно запросил инструмент в этот раз и откуда именно его сейчас принесли. Примерно для этих же целей и при­меняется паттерн «Посредник».
Осмысление структуры паттерна. Данный паттерн отли­чается очень простой структурой с довольно явными и одно­значными связями. Посредник и конкретный посредник связаны отношениями наследования, что само по себе понятно, так как конкретный посредник является подклассом класса посредник. А вот коллеги связаны с конкретным посредником по типу ком­позиции, так как они не смоги бы без него эффективно функцио­нировать.
Значимость паттерна в контексте разработки систем сильного ИИ. В контексте разработки систем сильного ИИ дан-
ный паттерн имеет весьма интересную значимость. И это потому что, вообще говоря, практически буквальным примером реали­зации подобного паттерна на субстрате интеллектуальных си­стем является человеческий мозг. Именно мозг обрабатывает поступающие от различных систем организма входные сигналы (запросы) и посылает в ответ сигналы, соответственно, выходные (ответы). Таким образом, мозг осуществляет действительную медиацию сложной распределенной системы. Каким именно об­разом он это делает – до сих пор неизвестно, так как имеются только лишь гипотезы. В мире разработки программного обе-
215
спечения также есть интересные примеры подобного рода. А имен­но – системы оркестрации, допустим Kubernetes, как одна из наиболее известных. Системы эти занимаются примерно тем же, чем человеческий мозг, – осуществляют координацию и менедж­мент сложных программных систем. В Kubernetes, к примеру, наличествует даже такой компонент, как ControlPlan/Master­Node, который так и определяется – мозг Kubernetes. Мы хотим показать, что роль «Посредника» очень сложно переоценить. Однако какая же именно абстрактная данность смогла бы играть подобную роль в системе сильного ИИ – вопрос, который до сих пор открыт. И это, к слову, один из ключевых вопросов и одно­временно одна из наиболее важных задач в контексте построе­ния систем сильного ИИ.
В связи с вышесказанным нам представляется продуктив­ным попробовать следующее, что вполне соответствует общей тенденции нашего подхода к разработке интеллектуальных си­стем подобного уровня. А именно: изначально не определять ни­какой ПК в качестве посредника между прочими компонентами, а оставить все компоненты примерно на одном уровне абстрак­ции, в соответствии с организационным принципом ООП SLAP. Предполагается, что центральный узел должен сформироваться в процессе развития системы путем самоорганизации, а не быть жестко зафиксирован с самого начала. И вообще, само наличие даже такого важного компонента, как центральный узел (мозг у человека), не обязательно, а опционально, так как возможно, что система сильного ИИ предпочтет вариант децентрализован­ной структуры с множеством значимых узлов. Также может быть и такое, что система предпочтет структуру, в которой она вся целиком являет собой центральный узел. Какая именно из этих возможностей будет реализована системой ИИ на практи­ке, покажет только сама практика.
12.11. Поведенческий паттерн «Посетитель»
Идентификатор. Посетитель (Visitor).
Классические элементы. Посетитель, конкретный посети-
тель, элемент, конкретный элемент, структура объектов.
216
Назначение. Как указывается в Design patterns, данный пат­терн «абстрагирует метод, позволяющий иметь заранее неопре­деленное число видов анализа структур глифов без изменения самих классов глифов» [114, с. 87]. Еще одна полезная особен­ность «Посетителя» состоит в том, что его «можно применять не только к таким агрегатам, как наши структуры глифов, но и к любым структурам, состоящим из объектов. Сюда входят множества, списки и даже направленные циклические графы» [114, с. 87]. Назначением паттерна «Посетитель» является посе­щение некоторой структуры данных, состоящей из определен­ных элементов, для того, чтобы осуществлять над ними некото­рую операцию, не изменяя при этом те элементы структуры данных, которые им непосредственно посещаются.
Проблема. У нас есть структуры данных, состоящие из опре­деленного количества ПК, каждый из которых относится к неко­торому классу, которых также некоторое количество, и, в свою очередь, каждый из которых определил для своих подклассов некоторые характерные особенности (поля-значения и методы). Нам бы хотелось посетить эту структуру данных, т. е., по сути, пробежаться по ней и выполнить над каждым ее элементом определенную операцию. Мы можем просто изменить каждый из классов, к которому принадлежит некоторое количество эле­ментов структуры, реализовав в самих классах ту операцию, ко­торую мы хотим осуществить, а затем просто пробежаться по структуре данных, вызывая эту операцию поочередно для каж­дого элемента этой самой структуры. Сложность осуществле­ния этого варианта развития событий находится в прямой зави­симости от количества возможных классов элементов структуры данных. С другой стороны, мы могли бы при изначальном про­ектировании системы создать один базовый класс, определить в нем интересующую нас операцию, а затем все прочие классы реализовать как подклассы этого базового класса, содержащие в себе по умолчанию возможность осуществления нужной нам операции. Но мы бы смогли это осуществить только в том слу­чае, если бы заранее, еще до проектирования системы, знали, ка­кую конкретно операцию нам необходимо осуществить. Однако
217
в контексте нашей системы мы не только заранее не знаем, что именно за операцию нам понадобится осуществлять, но также знаем, что, возможно, через некоторое время нам понадобится осуществить какую-либо еще операцию над группой элементов структуры данных, а далее, возможно, еще и еще. Все, что нам известно, – это то, что нечто подобное, возможно, понадобится, но это не точно. Это значит, что второй вариант не подходит точно. Но ввиду того, что каждый раз при возникновении по­требности осуществить некоторую операцию над определенны­ми элементами нам понадобится «руками» трансформировать структуру каждого из классов этих элементов, первый вариант также отметается. Но дело не только в сложности внесения из­менений. Мы также, согласно одному из принципов SOLID, принципу разделения интерфейса, не имеем права излишне пе­регружать ПК методами, которые не являются необходимыми для успешного осуществления компонентами их основной дея­тельности, потому что таким образом нарушится фундамен­тальный принцип сильной связности и еще один из принципов SOLID – принцип единственной ответственности. В общем, видно, что ситуация у нас достаточно сложная и проблема воз­никла серьезная. Но нам все же очень нужно осуществить необ­ходимую операцию над элементами структуры данных. И тут на помощь приходит поведенческий паттерн «Посетитель».
Концептуальное решение. Как говорилось выше, все, что нам известно при проектировании некоторой системы, – это то, что, возможно, при функционировании этой системы нам в даль­нейшем может понадобиться от каждого класса какой-либо до­полнительный, помимо его основного, функционал, о котором мы на данный момент ничего не подозреваем. В таком случае мы можем при определении каждого класса (элемента) данной системы дополнительно заложить в него единственный метод доступа к организации этого элемента. Конечно, мы могли бы вместо этого, как уже тоже говорилось выше, создать просто один базовый класс с единственным методом – методом доступа к экземплярам класса, а затем уже все остальные классы насле­довать от этого базового класса, реализуя его подклассы. В лю-
218
бом случае суть теперь не меняется и настолько конкретные де­тали реализации не играют значимой роли в контексте паттерна «Посетитель». Таким образом, теперь у нас есть система с неко­торым количеством классов (элементов), в каждом из которых реализован метод доступа к экземплярам этого класса. Далее формируются сами экземпляры класса (конкретные элементы) , и затем они оформляются в некоторые организованности напо­добие структур данных (структура объектов). И теперь настает момент, когда мы хотим осуществить некоторую операцию или некоторое их количество над ПК какой-либо структуры данных. Для начала мы определяем базовый класс (посетитель), в кото- ром реализуем необходимые нам операции, специфика которых зависит от класса, к которому мы будем их применять. Затем мы по необходимости можем реализовать подклассы (конкретные посетители) этого базового класса, в каждом из которых можем дополнить некоторый функционал. Специфика этого функцио­нала уже вариабельна. Теперь при посещении некоторой струк­туры данных с целью совершить определенную операцию над ее элементами мы для каждого элемента вызываем его метод доступа. Элемент в ответ на вызов этого метода возвращает по­сетителю (как правило) самого себя. И теперь, после определе­ния типа этого элемента, мы наконец-то можем в соответствии со всеми правилами осуществить нужную нам операцию.
Предполагаемые результаты и преимущества. Предпола­гаемыми итогами правильного применения паттерна являются следующие. Соблюдение фундаментального принципа сильной связности ПК, соблюдение принципов единственной ответствен­ности и разделения интерфейса. Эластичность системы в плане легкого и удобного добавления к ней новой функциональности. Полиморфизм посетителя в плане способности эффективно ра­ботать с разными классами. Эксплицитная организация про­граммной системы.
Гипотетический пример реализации паттерна. Как ни странно, но для поведенческого паттерна «Посетитель» полностью адекватный пример из мира, который не заключается в контексте разработки программного обеспечения, достаточно непросто
219
подобрать. Часто приводятся примеры с различным инструмен­тарием для различных целей, например с разными ключами для разных замков и т. д. Но это далеко не в полной мере отражает довольно сложную суть данного паттерна. Однако по-настояще­му хорошие примеры все же наличествуют.
В качестве одного их хороших вариантов можно привести деятельность ферментов. Ферменты, если несколько абстрагиро­вать их суть, являют собой узкоспециализированные вещества, которые ответственны за трансформацию некоторого содержи­мого в иное содержимое. Они катализируют данные реакции и ускоряют их, по сравнению с естественным ходом событий, во много раз. Обычно сопоставление фермента с некоторым содер­жимым осуществляется по принципу «ключ – замок» (сразу ас­социации с key – value), и в том случае, если «ключ» конкретного фермента подходит к «замку» некоторого вещества, то фермент способен начать оказывать свойственное себе влияние на веще­ство, соответствующим образом трансформируя его. Надо обра­тить внимание на то, что в самом веществе не определена в ка­честве необходимой операция ускоренного преобразования во что-либо иное. Определена просто таковая возможность, которая находит свое воплощение в «замке», которым способен восполь­зоваться фермент. Фермент также обладает некоторой специа­лизацией, которая резюмируется в наличии у него конкретного и специфического «ключа». По сути, при помощи этого «ключа» он фильтрует типы данных и подбирает те, над которыми спосо­бен совершить определенную операцию, необходимость выпол­нения которой заложена в его сущность. Здесь можно даже до­полнить, что в самом базовом ферменте (платоновский эйдос) не определены все конкретные ключи и возможные операции – они там всего лишь объявлены. Так что данный пример также соот­ветствует и поведенческому паттерну «Шаблонный метод».
В любом случае мы по итогу имеем следующую ситуацию. У нас имеется некоторое количество компонентов, над которыми может быть осуществлена некая нужная нам операция, и также наличествует определенная группа компонентов, которые спо­собны такую операцию осуществить. В компонентах первой
220
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]