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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
контекст, а в случае с паттерном – всегда «ожидаемые», «плани­руемые», «прогнозируемые» и никогда не гарантированные. Уже упоминалось, что так происходит ввиду сущностных различий между феноменами паттерна и алгоритма: алгоритм всегда кон­кретен, а паттерн всегда до определенной степени абстрактен.
Мы же, в контексте нашего исследования, будем опираться на своеобразный шаблон исследования и осмысления паттерна, некоторую, можно выразиться, карточку паттерна, которая со­стоит из девяти ключевых пунктов:
Идентификатор. Имя паттерна, привязанное к его значению.
Классические элементы. Составляющие паттерна, которые, как правило, признаются обязательными.
Назначение. Для достижения каких целей предназначен паттерн.
Проблема. Какие проблемы решает паттерн.
Концептуальное решение. Описание паттерна.
Предполагаемые результаты и преимущества. Позитивные ожидания от использования паттерна.
Гипотетический пример реализации паттерна. Пример реа­лизации паттерна в вариабельном контексте.
Осмысление структуры паттерна. Связи элементов паттерна друг с другом.
Значимость паттерна в контексте разработки систем сильно­го ИИ. Выявление ключевых абстрактных особенностей паттер­на, которые предположительно способны оказаться значимыми для сферы построения сильного ИИ.
Выводы по главе 10
На основе проведенного исследования мы пришли к выводу, что шаблон, алгоритм и паттерн являются различными поняти­ями по причине сущностной разницы между ними. Паттерны мы определили как выявленные закономерности последователь­ности действий в каком-либо контексте, направленные на реше­ние некоторой задачи, имеющей один или более вариантов ре­шения. Шаблон был нами определен как некоторый эталон, по «образу и подобию» которого создаются определенные «изде-
141
лия» со степенью отличия от эталона в строго ограниченных рамках по контексту и вариантам. Под алгоритмом же мы усло­вились понимать набор последовательных действий, направленных на решение какой-либо задачи за определенное конечное время.
Было показано, что основное отличие алгоритма от паттерна заключается в том, что алгоритм всегда обладает крайне четко очерченной структурой и не допускает вариаций ее трансфор­мирования, а также всегда дает гарантированный результат, и, более того, всегда возвращает одинаковые выходные данные при одинаковых входных данных. Структура паттерна же вариа­тивна и может трансформироваться в зависимости от контекста. А также применение паттерна никогда не может гарантировать результат, и паттерн не является четкой последовательностью конкретных действий, так как он по своей сути абстрактен и об­ладает больше формой, чем содержанием, т. е. паттерн – это скорее совокупность абстрактных образов действия, чем непо­средственно конкретики. Также было продемонстрировано, что к шаблону паттерн и алгоритм, по сути, отношения не имеют, так как шаблон, являясь просто неким эталоном, к которому нужно стремиться, абсолютно индифферентен к способам его «достижения».
Далее исследована генеалогия паттернов ООП и указано, что их истоки ведут к ПП городских зданий, что само по себе под­тверждает фундаментальность и всеобщность паттернов в це­лом. Также было указано на то, что паттерны ООП вполне могут быть экстраполированы в контекст функционального програм­мирования с некоторыми их «адаптациями». Были освещены GoF-паттерны и указано, что данные паттерны являются клас­сическими для ООП и, как правило, ассоциируются с паттерна­ми ООП вообще.
Уточнена специфика нашего исследования ПП, ПК, связей между ними и их структурами. Специфика заключается в выяв­лении ключевых деталей и максимально возможном абстраги­ровании сути любого феномена. Также было указано на класси­ческий шаблон рассмотрения ПП и разработан наш собственный шаблон их исследования.
Глава 11
ПОРОЖДАЮЩИЕ ПАТТЕРНЫ ООП
Паттерны из группы порождающих, как и следует из назва­ния группы, ответственны за создание новых ПК. Паттерны этой группы отличаются двумя ключевыми характеристиками: они содержат информацию о функционале определенных ПК, характерных для конкретной системы, т. е. в некотором роде определяют грани возможного-невозможного; они не раскрыва­ют подробностей реализации своей функциональности, так как она, разумеется, инкапсулирована.
Как указывают сами авторы Design patterns, говоря о спе­цифике функционирования порождающих паттернов: «Един­ственная информация об объектах, известная системе, – это их интерфейсы, определенные с помощью абстрактных классов. Следовательно, порождающие паттерны обеспечивают большую гибкость в отношении того, что создается, кто это создает, как и когда» [114, с. 89].
Здесь стоит отдельно сказать о том, что собой представляет только что упомянутый в цитате абстрактный класс, так как этот феномен ООП крайне значим в контексте построения систем сильного ИИ. Разумеется, абстракция сама по себе, как поня­тийная сущность, возводящая в абсолют превалирование формы над содержанием, допускает достаточно широкое толкование, и все ее подсущности, ответвления и экземпляры отличаются этим же качеством. Поэтому помимо нашего определения воз­можны и иные. Мы же определяем абстрактный класс как наи­более высокоуровневый способ описания сущности в контексте ООП, отличающийся тем, что он не определяет конкретную реа­лизацию своих методов, лишь обозначая их, а также не создает
143
экземпляров. От абстрактного класса можно лишь наследоваться другим классам, а затем непосредственно реализовывать его – абстрактного класса – функционал, и только лишь после этого возможным становится создавать экземпляры, т. е. сами объек­ты, воплощающие локально, «на местах», тот функционал, осно­ва которого была изначально обобщенно и «высокоуровнево» заложена и окаймлена уже в рамках абстрактного класса. По сути, абстрактный класс лишь задает константы и определяет «законы физики» в рамках конкретной программной системы.
В случае с данным феноменом, как можно заметить, напра­шиваются некоторые параллели с предлагаемым нами и фор­мально охарактеризованным ранее решением – созданием систе­мы, в рамках которой не реализуется конкретный функционал, а лишь определяются «грани реальности» и все зависимости сводятся к зависимости только от абстракций. Но так как фено­мен абстрактного класса в ООП существует, а сильный ИИ на данный момент принципиально не существует, очевидно, что чего-то не хватает. Однако феномен абстрактного класса, точнее присущую ему идею – реализацию самой сути абстракции на допустимо конкретном уровне – не стоит сбрасывать со счетов только по причине актуального отсутствия сильного ИИ. Впол­не вероятно, что в данном контексте просто отсутствует меха­низм запуска конкретного и необходимого для создания систе­мы сильного ИИ процесса, а также возможно, что феномен абстрактного класса реализуется в рамках паттернов или групп паттернов, не соответствующих необходимостям создания си­стем сильного ИИ.
В любом случае при помощи функционала порождающих паттернов в программной системе происходит примерно следу­ющее: создаются некоторые ПК с определенным интерфейсом и этот интерфейс – все, что известно о них всей остальной системе. Их, созданных при помощи порождающих паттернов ПК, генеа­логические и онтологические аспекты, конечно же, инкапсули­рованы непосредственно в функционал этих самых порождающих паттернов. Подобный контекст в рамках программной системы примерно подобен смоделированной ситуации в рамках пара-
144
дигмы сильного ИИ, при которой система сильного ИИ уже не­посредственно наличествует и функционирует, но ни о генеало­гических его аспектах, ни об онтологическом его статусе мы ничего не только не знаем, но и априори не способны узнать. Также это несколько напоминает ситуацию с уже реально нали­чествующим человеческим сознанием: мы взаимодействуем с его интерфейсом и это, по крайней мере на данный момент, есть предел наших возможностей – не существует единого мнения ни на тему его происхождения, ни на тему его сущностных ха­рактеристик.
Из этого следует, что тенденция к естественности и прибли­женности к реалиям макромира в контексте ООП сохраняется, как мы и постулировали ранее. На данном этапе уже становится понятно, почему это так: будь оно иначе в ООП – на примере паттерна – паттерны бы не смогли «выжить». Не следует забывать, что паттерны не есть некое искусственное образование (силь­ный ИИ тоже, к слову сказать, лишь называется «искусствен­ный», а подразумевается «альтернативный» или «другой», «не­человеческий»), напротив, паттерны есть выявленные успешные последовательные действия в каком-либо контексте, направлен­ные на решение какой-либо задачи. Т. е. это (как и все составля­ющие ООП) – некий успешный продукт макромира, «победитель» в своем контексте. А ООП, подобно нейролингвистическому программированию (которое, конечно, не является написанием компьютерных программ), просто аккумулирует в себе таких «победителей».
Также помимо естественности мы отметили стремление к сокрытию функционала, который в рамках разработки про­граммных систем оправдан безопасностью: отсутствует воз­можность переопределения методов высокоуровневых классов, что само по себе, как наличествующая в контексте возможность, может нарушить функционирование системы в целом. Причи­ной является тот факт, что порождающие паттерны – это вы­сокоуровневые феномены, т. е. абстрактные, имеющие больше формы, чем содержания, и, соответственно, им заранее не может быть известно, какое именно содержание понадобится им для
145
заполнения этой самой формы в определенный момент, при ре­шении какой-либо конкретной задачи и в некотором определен­ном контексте, однако заранее известно, что быть может и чего не может быть. Ну и, разумеется, для эффективного функциони­рования в зоне своей ответственности основной потенциал ПК должен быть инкапсулирован, в полном соответствии с ключе­выми аспектами парадигмы ООП.
К группе порождающих относят пять паттернов: «Абстрактная фабрика» «Фабричный метод» «Строитель» «Прототип» «Одиночка»
11.1. Порождающий паттерн «Абстрактная фабрика»
Идентификатор. Абстрактная фабрика (Abstract factory). Классические элементы. Абстрактная фабрика, конкретная
фабрика, абстрактный продукт, конкретный продукт, клиент.
Назначение. Создание ПК, объединенных некоторой ассо- циацией в общем смысле. Как указывается в Design patterns, «Абстрактная фабрика» «предоставляет интерфейс для созда­ния семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов» [114, с. 93].
Проблема. Необходимость наличия в системе некоего цен­трального узла, ответственного за создание ПК, в качестве отве­тов на возникающие в рамках системы потребности. Детер­минанты этого в том, что спектр возникающих потребностей достаточно широк, ситуации их возникновения весьма обшир­ны и заранее точно что-либо спрогнозировать, как правило, за­труднительно.
Концептуальное решение. Создание абстрактного класса со способностью порождать так называемые конкретные классы, т. е. стандартные классы с конкретной спецификой реализации их функционала, при запросе на их существование в контексте системы. Таких классов в рамках данного паттерна создается два: абстрактная фабрика и абстрактный продукт.
146
Предполагаемые результаты и преимущества. Высокая эластичность системы, т. е. способность системы гибко реагиро­вать на возникающие потребности и создавать полноценные об­работчики входящих запросов и ответов на них в зависимости от текущей ситуации. Масштабируемость системы, выражаемая в виде способности системы подстраиваться к количественно изменяющемуся и повышающемуся уровню потребностей. Ши­рина спектра предоставляемых системой возможностей по при­чине наличия, по сути, только лишь граней возможного-невоз­можного, внутри которых допустимы разнообразные вариации.
Гипотетический пример реализации паттерна. Предста­вим, что у нас имеются в наличии довольно большие финансо­вые и социальные ресурсы, присутствует непреодолимая по­требность их реализовывать, также имеется неограниченный запас альтруизма, выражаемый в приверженности к спонсор­ству, и маниакальная склонность в обеспечении бесперебойного функционировании рынка в плане соблюдения постоянного со­отношения спроса с предложением. У нас есть некоторая заго­товка, которая служит для нас средством реализации наших потребностей. Т. е. имеется некоторая исследовательская служба, которая осуществляет постоянный мониторинг рынка и ищет новые ниши спроса для реализации предложения. Также у нас имеется некоторый абстрактный шаблон того, что мы можем предложить, и некоторый абстрактный шаблон того, как именно мы это реализуем. При нахождении некоторого спроса (запроса) в дело вступают службы реализации. Одна из многих заготовок нашего производства быстро перепрофилируется под новый за­прос, а заготовка продукции поступает в производство на этих изменившихся условиях алгоритма производства. Как итог – быстро полученный новый продукт, строго соответствующий поступившему запросу с рынка. Суть здесь в наличии двух аб­страктных заготовок и двух конкретных их реализаций.
Осмысление структуры паттерна. Центральный узел аб- страктной фабрики, абстрактный класс, связан с конкретными
реализациями, конкретными фабриками, по типу агрегации, т. е. он вполне способен существовать автономно и изначально
147
при запуске функционирующей системы именно так и происхо­дит. Конкретные фабрики и продукты в зачаточном своем со­стоянии связаны с центральным узлом по типу композиции, т. е. без него они бы не смогли существовать. Затем эти же отноше­ния могут трансформироваться в отношения делегирования, т. е. абстрактная фабрика делегирует некоторые ответственно­сти и полномочия конкретной фабрике, затем же конкретная фабрика функционирует достаточно автономно: контроль реа­лизации конкретной фабрики для центрального узла заканчива- ется на этапе создания, и далее ответственность не распростра­няется – все же это не контролер, а создатель. Т. е. конкретные
фабрики не являют собой подлинно внутренние компоненты абстрактной фабрики, как происходит при классическом деле-
гировании, они есть ее более или менее автономные порождения. Сильное зацепление отсутствует, а также, само собой разумеет­ся, каждая конкретная фабрика должна быть сильно связана во внутреннем смысле. Тип связи между отдельно взятыми конкрет- ными фабриками зависит от текущей ситуации в рамках систе­мы и определяется контекстом. Функционал каждой конкретной фабрики по умолчанию инкапсулирован, и для взаимодействия с иными принадлежащими системе ПК каждая конкретная фаб- рика использует сугубо интерфейс.
Значимость паттерна в контексте разработки систем
сильного ИИ. Значимость «Абстрактной фабрики» для нужд
разработки систем сильного ИИ сложно переоценить. Достаточ­но вспомнить, что мы изначально упоминали о том, что этот паттерн может (с некоторыми замечаниями, дополнениями и из­менениями) составить определенный базис для интеллектуаль­ной системы с претензией на сильный ИИ. Вообще же сама идея наличия этой самой «заготовки на все случаи жизни» является фундаментальной в широком контексте и не ограничена сферой разработки ПК. В качестве наиболее яркого примера служит че­ловеческий мозг, который в любом случае имеет некоторую ней­робиологическую основу (абстрактная фабрика), которая гене- рирует основу уже функциональную (абстрактный продукт) в виде высшей нервной деятельности, которая, в свою очередь,
148
трансформируется в сложные психические процессы (конкрет- ные фабрики), продуцирующие речь, поведение, все формы актив­ности и так далее (конкретный продукт). Будет ли этот паттерн столь же эффективен в контексте необходимости сформировать не просто нейронную сеть как частный случай системы слабого ИИ, а человекоразмерный объект – систему сильного ИИ – во­прос, само собой, открытый. Однако у нас есть только то, что эффективно сработало на нас самих. Поэтому нам и необходимо именно это апробировать на чем-то новом. В данном случае – на системах, которые мы стараемся обеспечить сознанием. В любом случае мы считаем, что структуру и идею паттерна «Абстракт­ная фабрика» необходимо использовать при подобного рода раз­работках, разумеется, в составе целостной системы.
11.2. Порождающий паттерн «Фабричный метод»
Идентификатор. Фабричный метод (Factory method).
Классические элементы. Продукт, конкретный продукт, со-
здатель, конкретный создатель.
Назначение. Создание центральным программным компо­нентом (центральным узлом) некой более или менее абстракт­ной основы для конкретных ПК с дальнейшей реализацией их деталей при помощи подкомпонентов самого центрального узла. Как указывают авторы Design patterns, «Фабричный метод» «определяет интерфейс для создания объекта, но оставляет под­классам решение о том, экземпляры какого класса должны соз­даваться. Фабричный метод позволяет классу делегировать со­здание экземпляров подклассам» [114, с. 111].
Проблема. Необходимость наличия в системе конкретных типов реагирования на различные ситуации, возникающие в про­цессе функционирования системы.
Концептуальное решение. Создание абстрактного класса со способностью порождать заготовки других классов, конкретная классовая принадлежность которых будет определяться непо­средственно на местах их реализации. Переадресация ответствен­ности за подбор необходимого класса для заготовки делегиру-
149
ется центральным узлом своим подкомпонентам и ими реа ли­зуется.
Предполагаемые результаты и преимущества. Способ­ность системы быстро и эффективно реагировать на часто воз­никающие в процессе ее функционирования ситуации, отлича­ющиеся широким спектром разнообразия. Высокая экономичность и эффективность.
Гипотетический пример реализации паттерна. Предста­вим себе компьютерную игру в жанре Action/RPG от третьего лица (по типу Diablo). Игрокам предлагается выбрать игрового персонажа из некоторого числа реализованных вариантов с опре­деленной функциональностью, прописанными способностями, своими преимуществами и недостатками. В различных ситуа­циях предлагаемые персонажи ведут себя по-разному, и каждый из них лучше подходит к одной ситуации и хуже, соответственно, к другой. Задача игрока в том, чтобы максимально эффективно использовать сильные стороны выбранного персонажа и в то же время наилучшим образом купировать его слабые стороны. Разу­меется, менять персонажа во время выполнения (в runtime) не представляется возможным. Так вот паттерн «Фабричный метод» предоставляет некоторую заготовку подобного персонажа с этой самой возможностью трансформировать его классовую принад­лежность в runtime, что, разумеется, приносит неоспоримые преимущества игроку. Еще один пример. Ситуация боевого столкновения войск. Есть, к примеру, три возможные дистанции боя: ближняя, средняя, дальняя. Допустим, что одно войско лучше себя чувствует на ближней дистанции, а другое – проти­востоящее – на дальней. Соответственно, несложно предсказать, что именно будет происходить при столкновении: те, кто лучше себя чувствуют на дальней дистанции, будут, отступая, нано­сить урон, а те, кто более хорош в ближнем бою, будут стараться навязать противнику именно его. Паттерн «Фабричный метод» предоставляет возможность быть одновременно отличным вой­ском на всех дистанциях в зависимости от имеющейся на поле боя актуальной ситуации: войско просто смогло бы становиться то одного типа войском, то другого. Или, краткий пример, как
150
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]