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

цели (user experience – пользовательский опыт) и уровню абстракций (первый – высокоуровневый, второй – низкоуровневый).
При большом желании «нижний» интерфейс также можно превратить в «верхний», но для этого его надо донастроить вручную, что не представляется простой задачей. Собственно говоря, резюмирование смысла паттерна «Фасад» в таком контексте
уже начинает кое-что напоминать. А именно – разделение на сознание и бессознательное у человека. Сразу оговоримся, что демаркация человеческой психики на сознание и бессознательное
была описана и подробно исследуется в рамках психоаналитических традиций психотерапии и она имеет своих критиков,
причем как в иных концепциях психологии и психотерапии, так
и внутри самой традиции психоанализа. Но мы все же считаем,
что абстрактный смысл этой демаркации может быть весьма
продуктивен в рамках разработки систем сильного ИИ, так что
оформим пока на данную концепцию некоторую «презумпцию
истинности». К тому же нами полагается, что не раз упомянутое
в данном исследовании технотропное сознание есть не просто
цель всякого процесса разработки систем сильного ИИ, но более
того – апофеоз этого процесса, его крайняя точка. Но эта точка
не достигается сразу – процесс, конечно же, делится на этапы.
И один из этапов – технотропное бессознательное, за которым
непосредственно и следует технотропное сознание. В любом
случае мы считаем, что рассматриваемый паттерн в абстрактном
смысле несет в себе суть именно этого разделения. И именно
в таком смысле, абстрагированном до уровня разделения технотропной психики на технотропное сознание и технотропное
бессознательное, в контексте разделения интеллектуальной системы на низшее и высшее, на низкоуровневое и высокоуровневое абстрагированная суть «Фасада» нам видится целесообразной
для ее интегрирования в контекст разработки систем сильного ИИ.
13.7. Структурный паттерн «Приспособленец»
Идентификатор. Приспособленец (Flyweight). Еще иногда
используется название «Легковес» (по тому же принципу, как
весовые категории в боксе).
252

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

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

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

мизация (в первую очередь по памяти) функционирования системы, содержащей большое количество ПК, а также существенное сокращение разрозненности ПК в рамках системы и сокращение количества различных компонентов в принципе.
Гипотетический пример реализации паттерна. Выше уже
уточнялось, что данный паттерн является довольно-таки узкоспециализированным, так что наглядные примеры его применения
связаны непосредственно со сферой его применения, а именно
с функционированием больших систем, содержащих существенное количество компонентов. Однако мы попробуем пойти несколько иным путем и привести пример, вырванный из контекста.
А именно – довольно грубый и несколько приближенный пример реализации паттерна в контексте функционального программирования. Одна из самых популярных задач по программированию называется FizzBuzz. Ее классическая суть следующая: дается некое число n, которое обозначает верхний предел
диапазона от одного до n. В рамках этого предела мы должны
вернуть все числа от одного до n, причем вернуть очень специфическим образом: если число делится без остатка на три, то мы
должны вернуть Fizz, если число делится без остатка на пять –
Buzz, если и на три, и на пять – FizzBuzz, если же число не делится ни на три, ни на пять, то мы возвращаем само число, но
в виде строки. Предположим, что мы знаем заранее верхнюю
границу, т. е. n, и мы бы хотели создать структуру данных, которая содержит все числа от одного до n в правильном виде. Возникает вопрос о том, каким именно образом создать такую
структуру. Мы могли бы сесть и начать писать вручную: проверять каждое число и вписывать его соответствующее значение
в структуру. Однако же, если верхний предел очень большой,
т. е. шанс просидеть так очень долгое время, так что нам бы хотелось как-нибудь побыстрее, да и чтобы вычисления сами производились. И тогда мы «выносим за скобки» принцип правильного ответа, который приведен выше, и внедряем этот принцип,
который константен для любого числа, в алгоритм проверки чисел в диапазоне. После чего запускаем этот алгоритм и получаем готовую структуру данных.
256

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

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

Таким образом, в систему изначально закладывается идея взаимодействия по типу «все со всеми», что существенно повышает
динамику развития и ускоряет реагирование на любые внешние
и внутренние факторы.
Паттерн «Прокси» и вовсе предлагает весьма целесообразное
с практической точки зрения замещение одного субъекта другим субъектом, внешне от оригинала неотличимым, для того,
чтобы оригинальный субъект активизировался только по некоторым отфильтрованным запросам. В рамках рассмотрения данного паттерна был обнаружен весьма показательный механизм,
который при его адаптации к нуждам построения человекоразмерных интеллектуальных систем предположительно способен
сыграть очень важную роль, и это по той причине, что сей механизм был замечен только на уровне систем, обладающих сознанием, – он определяется как притворство. Было упомянуто, что
еще в «Государстве» Платона механизм притворства был обозначен как одно из важнейших средств воспитания подрастающего поколения, а также о трактате Хёйзинги – «Человек играющий». И нами было предположено, что возможная реализация
феномена подобного уровня может каким-либо образом спровоцировать качественные преобразования в рамках системы. Далее мы сопоставили это наше предположение со стараниями по
разработке систем слабого ИИ и пришли к выводу о полной их
тождественности. Однако же мы говорили о другом и, как постулировали далее, для того чтобы феномен такого рода смог
привести к качественным преобразованиям в системе, опыт реализации данного феномена должен быть затем органично интегрирован в общий опыт системы и «осознан» ею. А подобное
возможно только в контексте систем, способных к самоорганизации, что мы и предлагаем реализовывать.
Паттерн «Мост» заключает в себе фундаментальную идею
демаркации на абстракцию и реализацию, т. е. на абстрактное
и конкретное, что сразу же напоминает категорию идеальное –
реальное и, в общем-то, ей и соответствует. Эта идея далее развивается в том ключе, что в контексте данного паттерна полагается необходимой и целесообразной независимая трансформация
259

ПК, относящихся к категории абстракции, и то же самое для
компонентов категории реализации. Изначальное наличие связи
между изменениями компонентов, относящихся к различным
категориям, существенно усложняло функционирование системы, и в рамках паттерна было предложено некоторое разделение. Эту идею мы развили несколько далее и предположили, что
простого разделения между абстракцией и реализацией недостаточно для процесса самоорганизации в рамках системы и что
совершенно необходимо предоставлять возможность независимой трансформации для каждого без исключения ПК.
В рамках паттерна «Компоновщик» предполагается создание удивительно естественной структуры данных по древовидному типу. И так как структуры подобного типа были нами прослежены в диапазоне от гигантских космических объектов до
фракталов, нами было выдвинуто уникальное для актуального
исследования предположение: в рамках разработки систем сильного ИИ паттерн «Компоновщик» совершенно не необходим
к реализации, так как любая система, функционирующая по типу самоорганизации, УЖЕ использует данный паттерн.
По итогу исследования паттерна «Декоратор», в основе которого лежит идея обертывания одних ПК в другие для улучшения функционирования первых, нами было предложено просто
заложить в основу, в ядро будущего сильного ИИ саму такую
возможность практически в том же виде, в котором она реализуется в рамках паттерна, по причине ее простоты и естественности.
В паттерне «Фасад» мы выявили идею разделения общего
функционала системы в целом на высокоуровневый (сложный,
верхний, составной) и низкоуровневый (константный, нижний,
атомарный). Причем если в рамках паттерна подразумевается
простой и удобный доступ к первому, то ко второму доступ хоть
и сохраняется, но только после соответствующей его ручной
настройки. И нами была сразу же проведена параллель между
сознанием и бессознательным у человека и предполагаемыми
нами технотропным сознанием и технотропным бессознательным в контексте сильного ИИ с последующим выводом об актуальности применения паттерна именно в таком ключе.
260
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
