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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
им деятельности в соответствии с его ответственностью, то, во избежание возможных ошибок при использовании данного ком­понента, «лишняя» функциональность должна быть связана в новый ПК с уже новой специфической ответственностью. От­сюда очевидна практическая значимость данного принципа, которая заключается как в повышении читабельности кода и упро­щении повторного использования компонентов, так и в превен­тивном устранении возможных «багов». В целом же принцип довольно недвусмысленно направляет процесс разработки в сто­рону смоделированной нами ранее идеальной реализации силь­ной связности / слабого зацепления.
Принцип инверсии зависимостей. Уже упоминавшийся нами ранее принцип, суть которого определяется так: ПК более высокого уровня не должны зависеть от компонентов более низ­кого уровня – они должны зависеть от абстракций; абстракции не должны зависеть от частностей и деталей – частности и дета­ли должны зависеть от абстракций. Собственно, очевидно, что данный принцип упрочивает суть слабого зацепления, однако в его рамках происходит также некоторая конкретизация специ­фики внутрисистемных связей между ПК. Его практическая значимость характеризуется известным уровнем широты и за­ключается она как в упрощении повторного использования ком­понентов и предотвращения возможных системных ошибок, так и в улучшении читабельности кода и ранжировании ПК в рам­ках системы по значимости. Еще более важен тот факт, что в рамках данного принципа, как раз за счет вышеупомянутого ранжирования, вводится обоснование для «правильной» зависи­мости – зависимости от абстракций, которые, как мы уже знаем, являют собой наиболее значимые характеристики сущности (в данном случае – программной системы). По сути, здесь под­разумевается демаркация системы на некоторый незыблемый системный каркас, который, соответственно, и представлен аб­стракциями, и на «остальные» ПК, которые должны быть легко заменяемы или столь же легко изменяемы с учетом необходи­мой подстройки под актуальную ситуацию или, в более узком смысле, задачу. Это прямым образом коррелирует со специфи­кой предполагаемого нами абстрактного паттерна.
121
После разбора структурных принципов также кратко оха­рактеризуем основные из организационных. Сразу следует ска­зать, что организационные принципы ООП касаются в первую очередь стилистических и интерфейсных аспектов программи­рования и их ответственность заключается в максимальной унификации программного кода, увеличении его читабельно­сти, упрощении повторного использования и облегчении поль­зовательского взаимодействия с программным обеспечением. Очевидно, что с точки зрения целеполагания наблюдаются пе­ресечения с ответственностью принципов структурных, однако специфика достижения заявленных целей вовсе иная. Т. е., если структурные принципы апеллируют к сути формируемой программной системы, ее ключевым архитектурным особен­ностям и абстрактным сущностям, то принципы организацион­ные регламентируют специфику написания программного кода с точки зрения стилистики, а также формирование внешнего интерфейса программной системы – UI (User Interface).
К основным организационным принципам ООП можно от­нести следующие:
KISS – «Keep it simple, stupid!» – «Будь проще!». KISS-прин­цип изначально был введен в среде инженеров-авиаконструкто­ров, и его определение вполне точно отражает суть: всегда ре­шать проблему как можно более простым способом. Принцип, при его соответствующей реализации, существенно облегчает читабельность кода, а также интуитивное понимание интерфей­са создаваемого приложения.
SLAP – «Single level of abstraction principle» – «Принцип еди­ного уровня абстракций». Принцип гласит, что функции некото­рого отдельного уровня не должны выполнять задачи иного (более высокого или более низкого по отношению к своему «ос­новному») уровня «задачности», а для реализации дополнитель­ной функциональности следует формировать новые ПК на со­ответствующем уровне системы. Данный принцип, по сути, детерминирует подразделение кода на множество уровней и по­дуровней, обуславливая данную демаркацию степенью абстрак­ции и рамками ответственности ПК. Дополнительно стоит от-
122
метить, что из сущности данного принципа следует его неко­торая двойственность, т. е. SLAP в несколько большей степени ближе к структурным принципам, чем остальные из организа­ционных. Однако все же он идентифицируется как организаци­онный по причине некоторой недостаточности в плане фунда­ментальности.
DRY – «Don’t repeat yourself» – «Не повторяйся». Согласно этому организационному принципу, необходимо избегать дубли­рования. Причем здесь ситуация уже становится дискуссион­ной: некоторые исследователи утверждают, что необходимо из­бегать дублирования вовсе, т. е. дублирования как логики, так и данных; другие же настаивают только на необходимости от­сутствия дублирования данных. Данный принцип, хоть это сра­зу и не очевидно, пересекается с одним из структурных прин­ципов, а именно – с принципом разделения интерфейсов. Т. е., к примеру, если в рамках программной системы один и тот же участок кода несколько раз используется (не логика повторно используется, а именно схожие по логике участки кода исполь­зуются несколько раз) для обработки данных, то целесообразно инкапсулировать эту логику в отдельный ПК, чтобы затем при необходимости предоставлять возможность повторного исполь­зования кода. Подобный подход с практической точки зрения существенно упрощает внесение изменений, которые, при кор­ректной реализации принципа, необходимо будет вносить одно­кратно, а не множество раз.
YAGN I – «Your aren’t gonna need it» – «Тебе это не понадо­бится». Суть данного принципа заключается в превентивном устранении возможной избыточности функционала программ­ной системы. В этом контексте принцип пересекается с преды­дущим организационным принципом, а также с разделением интерфейсов. Он подразумевает пресечение возможных попыток преждевременной разработки не требующейся на данный мо­мент функциональности в рамках программной системы, так как реализация подобных действий может привести к массе не­желательных последствий, среди которых, к примеру, сложность внесения изменений. Здесь стоит отдельно заметить, что, как за-
123
частую происходит в парадигме ООП, данный принцип методо­логически противоречит одному из также немаловажных (но здесь отдельно не упомянутых) шаблонов распределения ответ­ственностей из GRASP-концепции – шаблона (на самом деле паттерна, а шаблон в данном случае – употребляемый иденти­фикатор) под названием «Устойчивость к изменениям» (Protected Variations), суть которого заключается в превентивном опреде­лении точек возможных изменений или нестабильностей и соот­ветствующем создании стабильной архитектуры вокруг них.
На данном этапе становится видна важность соблюдения ба­ланса между крайностями в контексте принципов ООП, причем важность диалектична, в том смысле что представляет собой естественный пример единства и борьбы противоположностей.
В целом же можно сказать, что система принципов ООП также является довольно самодостаточной, целесообразной, практико­ориентированной, функционирующей по законам с естествен­ными основаниями, не лишенной некоторых некритичных внутренних противоречий. Вполне вероятно наличие в ней опре­деленных проблем, что логично ввиду естественных оснований, однако некие ярко выраженные и обозначенные преграды на пути к созданию сильного ИИ отсутствуют.
Выводы по главе 9
В главе рассмотрены основы ООП. Было указано, что данная парадигма детерминирована потребностью уравнивания в пра­вах данных и методов для работы с этими данными, что приве­ло от наличия разнородных потенциалов к формированию четко оформленной структуры – объекта. Было показано, что объект и вся его специфика определяются классом – более формальной структурой, которая представляет собой наиболее общий спо­соб описания ПК, полностью определяющий его состояние, по­ведение и идентичность.
Были актуализированы наиболее фундаментальные аспекты ООП, среди которых инкапсуляция, полиморфизм, наследова­ние, абстракция и интерфейс.
124
Инкапсуляция нами определена как способность связать в рам­ках единого ПК (к примеру, класса) информацию и способы взаимодействия с этой информацией, и далее завуалировать спе­цифику их взаимодействия.
Полиморфизм определен как способность ПК одного и того же класса быть успешно реализованными в принципиально раз­ных контекстах, но с сохранением единого интерфейса для всех возможных контекстов.
Интерфейс обозначен как совокупность «входных точек» от­дельного класса, т. е. всех его публичных данных и публичных методов для работы с этими данными.
Наследование же – это способность к «продолжению рода» с сохранением в «потомках» характерных особенностей «пред­ков» в той или иной степени. В контексте ООП понятие наследо­вания аналогично классическому пониманию.
Под абстракцией же мы условились подразумевать наиболее значимые и характерные особенности какого-либо ПК.
Из определений вышеназванных понятий нами были прове­дены глубокие аналогии с естественной организацией систем, и было показано, что ключевые особенности ООП дублируют фундаментальные аспекты макромира.
Далее были рассмотрены фундаментальные принципы ООП, которые разделены нами на две группы: структурные принципы и организационные принципы. Было установлено, что структур­ные принципы вводят некоторый протокол построения ПК. И к этой группе нами отнесены два наиболее общих и базовых принципа ООП: принцип сильной связности и принцип слабого зацепления.
Указано, что принцип сильной связности регламентирует внутреннюю организацию ПК, а принцип слабого зацепления определяет специфику связей между различными частями про­граммной системы. Было выявлено, что все остальные принци­пы ООП просто дополняют эти два фундаментальных принципа.
Также к структурным принципам отнесены все пять прин­ципов группы SOLID, которые конкретизируют сильную связ­ность и слабое зацепление. Охарактеризованы все принципы данной группы.
125
Принцип единственной ответственности обозначен как опре­деляющий внутреннюю организацию ПК в плане сосредоточен­ности на некой единой задаче в противовес диссипативности функционала.
Принцип открытости-закрытости определяет готовность ком­понентов к некоторым изменением и неготовность к иным.
Принцип подстановки Барбары Лисков уточняет, что насле­дующие компоненты должны только дополнять, а не трансфор­мировать базовый функционал родительского компонента.
Принцип разделения интерфейсов гласит об избыточности функционала любого ПК в плане наличия у него только необхо­димых данных и функций.
А принцип инверсии зависимостей уточняет тот факт, что по возможности зависимости должны устанавливаться только лишь от абстракций.
Далее были уточнены организационные принципы, которые регламентируют в основном стилистику разработки. К ним от­несены: DRY – принцип, гласящий о повторном использовании ПК, в противовес построению одинаковых; KISS – принцип, четко указывающий на необходимость формирования наиболее возможно простой логики ПК, в противовес чрезмерной слож­ности; SLAP – принцип соблюдения единого уровня абстракций при построении ПК; YAGN I – принцип, определяющий полез­ность отсутствия преждевременной оптимизации ПК по причи­не частого отсутствия необходимости подобных действий.
В целом же нами было выявлено, что парадигма ООП обла­дает достаточной шириной и глубиной функционала для осу­ществления попытки формирования при помощи ее инструмен­тария систем сильного ИИ в соответствии с предлагаемым нами технотропным подходом.
Глава 10
ОБЩИЕ ПОЛОЖЕНИЯ ПОНЯТИЯ ПАТТЕРНА В ООП
10.1. Понятия паттерна, шаблона и алгоритма
После рассмотрения и переосмысления ключевых особенно­стей ООП, а также структурных и организационных принципов этой парадигмы мы на данном этапе исследования вывели ее об­щую естественность, умеренную и некритичную внутреннюю противоречивость, обширность предоставляемых ею возможно­стей и отсутствие как явных, так и латентных «указаний» на не­возможность создания системы сильного ИИ при помощи ООП. Более того, не было выявлено сущностных противоречий пара­дигмы ООП с предлагаемым в рамках исследования концептом самоорганизующегося паттерна, который, согласно нашей гипо­тезе, способен в перспективе предоставить интеллектуальной системе возможность для возникновения феномена технотроп­ного сознания.
В свете введения предлагаемого нами концепта в контекст текущего исследования ранее были упомянуты некоторые уже существующие и подробно задокументированные решения из области проектирования программного обеспечения, решения, применяемые для самых различных целей и задач, а не только в контексте разработки систем ИИ. А именно – «Абстрактная фабрика» и «Шаблонный метод» из числа паттернов «Банды че­тырех». Было упомянуто, что суть предлагаемого нами концеп­та некоторым образом коррелирует с методологическим синте­зом двух вышеупомянутых паттернов, разумеется, с некоторыми оговорками и дополнениями. Таким образом, в сфере разработ­ки ПК присутствует некоторое количество уже имеющихся «го­товых» вариантов реализации определенного проекта с весьма
127
широким тематическим спектром. Вопреки возможному «изобре­тению велосипеда» мы считаем целесообразным глубже ознако­миться с возможностями, предлагаемыми исследуемой сферой. И именно из этого мы выводим актуальность как практического, так и теоретического осмысления оговоренных ПП программ­ной продукции, а также данного феномена.
Постулируя с наиболее общих позиций, можно определить, что в контексте необходимости решения той или иной задачи, какой именно бы она ни была и к чему именно бы ни относи­лась, наличествует, как правило, некоторый набор возможных вариантов этих решений. Наиболее успешные, удачно спроекти­рованные, масштабируемые и гибкие из этих вариантов закре­пляются в предметной сфере и получают некоторую «презумп­цию оптимальности», которая актуальна до тех пор, пока не будет внедрено решение лучше. Говоря более формально, такого рода варианты определяются как последовательности действий, направленные на решение определенной задачи. И называются они «паттерны» (patterns).
Паттерны являются весьма распространенным явлением в большинстве сфер человеческой деятельности, и область про­граммирования, соответственно, тут не является исключением, а, напротив, отличается довольно-таки высоким уровнем разви­тия и распространения «паттернизации». Не в последнюю оче­редь по той причине, что концепция паттернов и предоставляемые ею возможности отличаются удобством в контексте унифика­ции дискурса в среде разработчиков и проектировщиков про­граммных систем, а также в плане более глубокого понимания действий друг друга в той или иной ситуации разработки.
Для примера. При отсутствии понятия паттерна разработчи­кам приходилось бы заново объяснять и обосновывать смысл своих действий, что занимало бы продолжительное время. В осо­бенности сильно это тормозило бы процесс на этапе определе­ния стратегии разработки того или иного технологического ре­шения, а также на этапе принятия решений о внедрении той или иной «фичи». При наличии паттернов же дискурс становится тезисным, а программные и архитектурные решения – куда бо-
128
лее интуитивно понятными. И это только один пример из мно­гих возможных (помощь отдельно взятому разработчику в кон­тексте необходимости решения какой-либо задачи, избегание в проектировании «плохих» паттернов и т. д.). С другой сторо­ны, необходимость обоснования целесообразности применения паттернов в сфере разработки программного обеспечения как таковая отсутствует по той причине, что, как уже говорилось, специфика самой сферы отличается довольно высоким прагма­тизмом и «то, что не полезно» там просто не оседает.
Отдельно следует заметить, что при всей практической зна­чимости паттернов они, будучи навязаны как обязательные к ис­полнению и реализации, теоретически, могут создавать эвристи­ческие рамки. Однако для того, чтобы уточнить, так это или нет или насколько это так, следует глубже ознакомиться с тематикой.
В первую очередь следует отметить терминологическую пу­таницу с понятиями «паттерн» (pattern) и «шаблон» (template). Некоторое недопонимание порой возникает в дискурсе исследо­вателей и разработчиков как в отечественном сообществе, так и за рубежом. Суть этой путаницы заключается в сложности од­нозначной интерпретации иностранных текстов, неоднозначно­сти определений обоих понятий, их некоторой синонимичности вплоть до взаимозаменяемости, а также определенной сущност­ной неоднозначности и т. д. Мы, в свою очередь, постараемся разделять данные понятия.
Паттерны будем определять как выявленные закономерно­сти последовательности действий в каком-либо контексте, на­правленные на решение некоторой задачи, имеющей один или более вариантов решения.
Шаблон определим как некоторый эталон, по «образу и по­добию» которого создаются определенные «изделия» со степе­нью отличия от эталона в строго ограниченных рамках по кон­тексту и вариантам.
Разумеется, при необходимости в данных определениях мож­но усмотреть некоторые пересечения, схожести и так далее, од­нако, по нашему мнению, они все же наличествуют в меньшей степени, чем различия. Фундаментальное же различие между
129
паттерном и шаблоном заключается в том, что, в то время как паттерн в упрощенном варианте представляет собой последова­тельность взаимосвязанных действий и его сутью именно эти действия и являются, шаблон никаких действий не подразуме­вает – он просто есть и, как следствие, пути, способы и вариан­ты воспроизведения своего «образа и подобия» в самом себе не несет, так как совершенно неважно, каким именно образом он будет «достигнут».
Также необходимо отдельно осветить еще одну сугубо кон­цептуальную проблему с понятием паттерна, а заодно упрочить отличие от понятия шаблона. А именно – как можно уловить, в том числе и по нашему определению, паттерны с некоторой частотой путают с алгоритмами, и опять же, вплоть до полной взаимозаменяемости этих понятий. Само собой разумеется, что подобное не вполне корректно. Детерминанты данной проблемы вполне очевидны и заключаются они в некоторой (порой доволь­но существенной) схожести сути паттерна с сутью алгоритма: в обоих случаях подразумевается выявленная и зафиксирован­ная последовательность определенных действий, направленных на решение некоторой проблемы.
Наиболее общее определение алгоритма можно сформули­ровать так: алгоритм – это набор последовательных действий, направленных на решение какой-либо задачи за определенное конечное время. Можно также детализировать суть и определить куда более формально: «…алгоритм – это точно установленное предписание (инструкция) о выполнении в определенном поряд­ке некоторой последовательности операций, однозначно веду­щих к решению той или иной конкретной задачи. Подразумева­ется, что результат выполнения алгоритма напрямую зависит от исходных данных: т. е. один и тот же алгоритм при разных ис­ходных данных даст разные результаты; с другой стороны, если одному и тому же алгоритму передать несколько раз одни и те же данные, он должен столько же раз выдать один и тот же ре­зультат» [117].
Как из первого, так и в особенности из второго определения заметны некоторые ключевые аспекты природы алгоритмов,
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]