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

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

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
лее, определяющие специфику формирования ПК. Так как при построении интеллектуальных систем доминирующей является парадигма ООП, то мы будем ориентироваться именно на ее особенности.
Считается, что парадигма ООП зародилась из потребности повышения удобства разработки, а соответственно, и удобочи­таемости и выражалась в «уравнивании в правах» данных, т. е. информации, и методов для работы с этими данными, а именно алгоритмов. Идея возможности «срастить» в единую структуру информацию и способы ее использования значатся за авторством Кристена Нюгорта и Оле Джохана Дала в период их работы над языком программирования Simula-1 и были впервые ими реализованы в Simula-67 [111, 112]. Созданная в результате объединения данных и алгоритмов структура и получила назва­ние «объект». Затем уже концепция получила развитие (по отли­чающемуся в каждом случае сценарию) в языке Smalltalk у Ала­на Кея (изначально он применял термин «модуль» как аналог объекта) и в C++ у Бьёрна Страуструпа. Автором же самого по­нятия «объектно-ориентированное программирование» счита­ется Алан Кей [113]. Интересный факт заключается в том, что несколько позднее по схожей схеме – уравнивание в правах раз­личных типов данных, – но уже не в рамках формирования некой общей структуры, а по отношению сугубо к алгоритмам была оформлена иная методология – функционального программиро­вания. В ООП зачастую принято отождествлять объект в рам­ках ООП с самой методологией, так как он, являясь смысловым средоточием и инстанцированием всех ее фундаментальных особенностей, представляет «живой пример» функционирования всей методологии ООП в целом. Ключевым же понятием ООП является класс, т. е. наиболее абстрактный способ определения состояния программной сущности (данные), ее поведения (алго­ритмы), а также программного интерфейса для взаимодействия с этой сущностью со стороны других программных сущностей.
Фундаментальными свойствами класса как системы отно­шений между его компонентами являются инкапсуляция, поли­морфизм, наследование, абстракция и интерфейс.
111
Инкапсуляция – это способность связать в рамках класса информацию и алгоритмы (поля и методы) и завуалировать специфику их взаимодействия, т. е. скрыть все внутренние про­цессы, оставив доступ лишь к интерфейсу. Сама способность инкапсуляции с точки зрения целесообразности выглядит не­противоречиво и, при экстраполировании ее сути на объекты макромира, имеет множество примеров (человеческий череп и мозг, выделяющиеся надбровные дуги у неандертальцев, вооб­ще все внутренние органы и т. д.). Т. е. скрывать наименее проч­ное и наиболее значимое под наиболее прочным и наимением значимым – вот суть инкапсуляции, а также специфика взаимо­отношений между инкапсуляцией и интерфейсом.
В свою очередь интерфейс – это совокупность «входных то­чек» отдельного класса, т. е. всех его публичных данных и публичных методов для работы с этими данными. Все, что до­ступно в классе для использования другими классами, входит в интерфейс. Интерфейс также, несомненно, выглядит естествен­ным и напоминает некоторую систему отношений между сущ­ностями, в которой зафиксированы все возможные варианты взаимодействия. Довольно ярким примером в реальном мире может служить культура языка с конечным количеством слов и вариантов построения словарных последовательностей, т. е. лю­бого языка в мире.
Полиморфизм – это способность экземпляров одного и того же класса быть успешно реализованным в принципиально раз­ных контекстах, но с сохранением единого интерфейса для всех возможных контекстов. Это также способность методов с одина­ковым интерфейсом успешно обрабатывать различающиеся типы данных и, в свою очередь, способность «дочерних» классов быть использованными в контекстах, изначально предназначавшихся для классов «предков». Очевидно, что полиморфизм также ка­жется естественной и целесообразной способностью, так как, к примеру, сам человеческий организм также им обладает и, к сло­ву, употребление языковых конструкций иносказательно – при­мер полиморфизма.
112
Наследование – это способность к «продолжению рода» с со­хранением в «потомках» характерных особенностей «предков» в той или иной степени. Здесь, помимо ярко выраженной естествен­ности данной способности ПК в ООП, стоит также отдельно ска­зать о столь же яркой выраженности практической значимости наследования. А именно: наследование позволяет многократно использовать части компьютерной программы какое угодно ко­личество раз, не переписывая их снова и снова.
Абстракция же – это совокупность наиболее значимых ха­рактеристик программной сущности. Можно сказать, что специ­фичность «абстрактной палитры» и составляет фундаментальную основу для идентичности любой сущности в ООП. И в данном случае также прослеживается прямая связь между системным свойством в методологии ООП и «естественным положением вещей». Здесь напрашивается аналогия с понятием эйдоса у Пла­тона. Т. е., к примеру, один человек может очень сильно отли­чаться от другого, но и тот, и другой признают друг друга людь­ми. Также человек может лишиться ноги или руки, но от этого он не перестанет быть человеком, так как отсутствует качествен­ное преобразование сущности. И именно эта «качественность», которая делает человека человеком, и составляет «абстракцию человечности» – меру количественных преобразований, необхо­димых и достаточных для того, чтобы можно было точно ска­зать, где еще есть человек, а где его уже нет. Реализована ли идея (класс) человека на конкретной сущности или же сущность стала субстратом для реализации некой иной идеи – для ответа на данный вопрос и предназначена абстракция. Также, особенно в случае с множественным наследованием, выглядит непроти­воречивой параллель с архетипами Юнга, которые являются бо­лее мягкой версией паттерна «Прототип» (см. гл. 11) – наследуе­мого синтеза абстракций класса [114].
Из понятия класса иерархически «производится» понятие объекта, который представляет собой конкретный экземпляр конкретного класса. Объект сочетает в себе три ключевые со­ставляющие: состояние – совокупность всех свойств вместе со значениями этих свойств; поведение – совокупность всех мето-
113
дов (алгоритмов) объекта; и идентичность, т. е. некоторая аутен­тичность, уникальность и так далее, – отличия одного объекта класса от другого объекта класса.
Из вышесказанного явно прослеживается существенная не­принужденность формирования аналогий между ключевыми аспектами методологии ООП и макромиром с человеком в его рамках, так как действительно у каждого человека присутству­ют специфические особенности, заданные «классом» (классом в контексте ООП): две руки, две ноги, голова, системы крово­обращения, дыхания, пищеварения и т. д. Также у каждого чело­века в той или иной степени наличествуют характерные особен­ности, полученные им от родителей, ими от их родителей, от национальности в целом и прочее. Человек, наконец, обладает и состоянием, и поведением. И эти пересечения не являются случайными, так как при формировании парадигмы ООП в нее (как, собственно, и в любую иную методологию программиро­вания) закладывалась идея интуитивно понятного и удобного для разработчиков функционала, сформированного при помощи этой методологии. По крайней мере настолько, насколько это вообще возможно в имеющихся рамках.
Далее можно резюмировать, что основы ООП выглядят есте­ственными и непротиворечивыми с точки зрения целесообраз­ности построения ПК. Однако на данный момент при помощи ООП как доминирующей методологии ни в сфере формирова­ния ИИ, ни вообще в области разработки программного обеспе­чения не было создано «экземпляров» сильного ИИ. И нами предполагается, что причина может заключаться в следующем: инкапсулированный человеческий мозг в черепе с передним ин­терфейсом вряд ли предполагался именно и только таковым, – скорее всего, вариантов было (а может быть, и есть) на несколько сотен порядков больше. Однако общий принцип целесообразно­сти в рамках данного нам контекста макромира иным предпола­гаться не мог вовсе. Так же, как и «жизнеспособность» самой ин­капсуляции. А затем уже, в рамках целесообразности и сугубо естественным путем, путем самоорганизации, и был сформи­рован именно такой «порядок вещей»: интерфейс – спереди
114
и именно такой, а мозг – именно такой, внутри черепа и с опре­деленными характеристиками.
Т. е. при формировании закономерностей для какой-либо си­стемы необходимо делать их в общем смысле целесообразными для этой системы (как вселенские константы), но столь же необ­ходимо создавать условия для запуска естественного самоорга­низующегося процесса, в рамках которого и будут определены все возможные варианты развития системы и детали этого раз­вития. С учетом научно-технических реалий мы в данный мо­мент говорим о формировании самоорганизующегося паттерна, порождающего некие подпаттерны при каждой ранее не встре­чавшейся задаче, связывающего затем их в единый опыт (неко­торое воплощение синтеза паттернов, подобных «Абстрактной фабрике» и «Шаблонному методу») (см. гл. 11, 12) из GoF-паттер­нов с некоторыми существенными расширениями, дополнения­ми и адаптациями, конечно. Т. е. буквально мы имеем в виду следующее: не прописывать детально все поля и их значения, как и методы для работы с этими полями, а изначально форми­ровать лишь «абстракцию целесообразности» и определенный набор возможностей – по сути «законы физики» локального ки­берпространства. Если говорить в более общем смысле, то пер­спективным, с точки зрения формирования систем сильного ИИ при помощи методологии ООП, выглядит некое утрирование пятого принципа SOLID – принципа инверсии зависимостей из состояния «все должно зависеть только от абстракций» до «должны наличествовать только абстракции», в числе которых целесообразность и возможность самоорганизации [115].
Ранее мы пришли к выводу о том, что парадигма ООП с точ­ки зрения своих общих аутентичных характеристик отвечает требованиям целесообразности и некоторой естественности, в соответствии с которой и должны, по нашему мнению, созда­ваться системы сильного ИИ. Однако отсутствие сформирован­ного сильного ИИ как такового заставляет, в соответствии с оз­вученной нами выше гипотезой, полагать, что для реализации этого все же чего-то не хватает или же, напротив, нечто суще­ственно этому мешает.
115
Формирование паттернов, подобных тому, который был нами предложен и абстрактно охарактеризован, зиждется в первую очередь на «резюмировании принципов в методах», т. е. на реа­лизации высокоуровневых абстракций за счет определения «эссенции» их практикоориентированности и дальнейшего ее применения на низкоуровневом «субстрате». Т. е., по сути, про­исходящее является редуцированием фундаментальных аспектов теории к «злободневным» потребностям практики. Само со бой разумеется, что исследование заявленной проблематики в таком контексте в большей степени попадает под юрисдикцию, к при­меру, теории алгоритмов вообще, чем какой-либо парадигмы программирования. Тем не менее в рамках каждого отдельного подхода к построению ПК более общие принципы (к примеру, те же принципы теории алгоритмов) реализуются с опорой непо­средственно на дисциплинарные, внутренние принципы кон­кретной парадигмы. Т. е. на практике все происходит вполне ди­алектически: единое содержание принимает различные формы. В связи с этим считаем необходимым дать краткую характери­стику принципов ООП.
Принципы вообще, как общенаучные понятия, мы будем опре­делять как фундаментальные постулаты, регламентирующие формирование самого контекста предметной области. В рамках ООП принципы можно, по сути, разделить на две группы: струк­турные и организационные. Первые из них можно условно раз­делить на несколько подуровней по «степени фундаментально­сти». К примеру, обозначенные нами ранее в качестве ключевых характеристик инкапсуляция, наследование, полиморфизм, аб­стракция и интерфейс в общем смысле также относятся к струк­турным принципам. Однако их специфика и значимость для ООП несколько выше, чем у остальных, в том смысле, что без них вообще не было бы данной парадигмы. Поэтому они обозна­чаются нами как базовые системные свойства – свойства системы объектно-классовых отношений. А вот без остальных принци­пов вопрос о самом существовании парадигмы не ставится – она бы просто стала иначе и с практической точки зрения гораздо хуже функционировать. В рамках текущего исследования нам,
116
соответственно, важнее структурные принципы, но тем не ме­нее для полноты картины мы также дадим краткую характери­стику и принципам организационным, так как те и другие, разу­меется, взаимосвязаны.
Здесь стоит отдельно упомянуть о том, что организацион­ные принципы не являются уникальными для рассматриваемой нами методологии, а представляют скорее универсальные по­стулаты, характерные для многих подходов к программирова­нию. Еще следует сказать, что мы не будем в данном контексте упоминать о внутренних организационных принципах некото­рых отдельно взятых объектно-ориентированных языков про­граммирования, к примеру о Zen of Python и прочих. Мы оха­рактеризуем только те из организационных принципов, которые полноправно применяются в рамках ООП в целом. Касаемо же структурных принципов, также стоит заметить, что мы будем останавливаться только на тех из них, которые являются обще­методологическими, не затрагивая локальные принципы отдель­ных внутренних концепций, к примеру принципы REST, MVC и иные.
Начать мы полагаем со структурных принципов. К наиболее фундаментальным принципам ООП, по нашему мнению, следу­ет отнести два:
принцип сильной связности / сильная связность (High Cohesion)
принцип слабого зацепления / слабое зацепление (Low Coupling)
Для начала необходимо уточнить, что же такое вообще связ­ность и зацепление в программировании. Во-первых, следует сказать, что в связи с некоторыми нюансами перевода связность нельзя путать со связанностью, несмотря на их созвучность, так как связанность является синонимом зацепления (это взаимоза­меняемые понятия), а связность, соответственно, антонимом.
Связность представляет собой способ и степень взаимосвя­зи-взаимозависимости ПК во внутреннем смысле, т. е. одного элемента ПК по отношению к другим элементам этого же ПК. Выделяют следующие по возрастанию степени, типы связности: случайная, логическая, временная, процедурная, связность вза­имодействия, связность последовательности действий, функци-
117
ональная. Идеальная сильная связность ПК означает, что все его элементы тесно объединены в контексте достижения некоторой единой общей цели и сам ПК выполняет как можно меньше не­специфичных для него задач, а в идеале – всего одну «большую» задачу. Слабая связность означает, соответственно, обратную ситуацию.
Зацепление представляет собой способ и степень взаимосвя­зи-взаимозависимости ПК во внешнем смысле, т. е. одного ком­понента системы по отношению к другим компонентам системы. Выделяют следующие по убыванию степени, типы зацепления: зацепление содержимого, через общее, через внешнее, по управ­лению, по структурам данных, через данные, по сообщениям, а также отсутствие зацепления. Идеальное слабое зацепление означает такую ситуацию в рамках системы, в которой каждый ПК обладает высоким уровнем самодостаточности и в малой степени зависит от других компонентов. Также слабое зацепле­ние означает возможность эффективного повторного использо­вания ПК системы в других контекстах. Сильное зацепление, соответственно, инвертирует этот смысл.
Здесь будет целесообразно заметить, что все остальные принципы ООП в той или иной степени всего лишь дополняют и уточняют смысл вышеизложенных принципов слабого заце­пления и сильной связности. Грамотное сочетание слабого заце­пления и сильной связности позволяет создавать удобные в ис­пользовании и повторном использовании, легко поддерживаемые и читабельные программы. С точки зрения практического про­граммирования значимость этих принципов сложно переоценить.
С философско-методологической же точки зрения идеальная реализация синтеза этих принципов ведет к такой ситуации, в которой наличествует некоторое количество абсолютно неза­висимых самодостаточных и самоорганизованных ПК, каждый из которых имеет возможность формировать сцепку с любым другим программным компонентом в контексте текущей зада­чи, т. е. все без исключения компоненты конгруэнтны друг дру­гу. Соответственно, в такой ситуации предоставляется возмож­ность объединения любого количества любых компонентов для
118
решения любой конкретной задачи. Из этого следует, что смоде­лированная нами ситуация идеальной реализации фундамен­тальных принципов находится в полном соответствии с предло­женной нами ранее концепцией абстрактного паттерна для обработки данных со стороны системы сильного ИИ с той лишь оговоркой, что конкретная специализация каждого ПК в случае с предполагаемой нами концепцией не предусматривается, а вместо этого определяется только общий потенциал – грани возможного­невозможного. С точки зрения целесообразности и естественности означенных принципов следует отметить, что при обобщении смысл смоделированной нами ситуации оказывается следующим: наличествует энное количество «строительного материала», специфика которого позволяет создать любой возможный син­тез формы и содержания, потенциально обладающий крайне широким функциональным спектром. Отсюда сама собой следует аналогия с атомом, квантом или вообще любым «строительным материалом» бытия. Таким образом, фундаментальные принци­пы ООП – слабого зацепления и сильной связности – являются как целесообразными, так и, конечно же, естественными.
На основе рассмотренных принципов иерархическим образом формируются остальные, из которых нами будут охарактеризо­ваны принципы группы SOLID. Данное понятие было введено Майклом Фэзерсом и указывает на первые пять определенных Робертом Мартином принципов ООП [116]. SOLID представляет собой аббревиатуру, образованную от менее фундаментальных, чем ранее указанные, но тем не менее также фундаментальных принципов ООП: Single responsibility principle – принцип един­ственной ответственности, Open-closed principle – принцип откры­тости-закрытости, Liskov substitution principle – принцип подста­новки Барбары Лисков, Interface segregation principle – принцип разделения интерфейса и Dependency inversion principle – принцип инверсии зависимостей. Кратко охарактеризуем каждый из них.
Принцип единственной ответственности. Суть данного принципа заключается в следующем: ПК должен быть ответ­ственным только за одну задачу. Как можно заметить уже из на­звания, данный принцип уточняет и конкретизирует сильную
119
связность, дополняя к уже сказанному о ней то, что ПК должен иметь только одну причину для изменений. Реализация этого принципа на практике служит для предотвращения ошибок, связанных с возможным сложно прогнозируемым изменением поведения ПК в каком-либо одном присущем ему аспекте из-за изменений в некотором ином ему же присущем аспекте.
Принцип открытости-закрытости. Суть данного принци­па заключается в следующем: ПК должны быть открыты для расширения, но закрыты для изменения. Хоть это и не сразу оче­видно, однако данный принцип тесно перекликается как со сла­бым зацеплением, так и с сильной связностью. На практике этот принцип одновременно служит как для предотвращения оши­бок, связанных с возможными внутренними изменениями ПК, так и для предотвращения общих системных ошибок в результа­те, к примеру, каскадных изменений поведения цепочки зависи­мых классов из-за изменения в одном из них.
Принцип подстановки Барбары Лисков. Суть принципа в следующем: в рамках программной системы любые объек­ты-экземпляры класса-предка могут быть заменены объекта­ми-экземплярами класса-потомка без ухудшения функциональ­ности; также дочерние классы должны только лишь дополнять, но не переопределять функционал базового класса. Этот прин­цип так же, как и предыдущий, перекликается и с сильной связ­ностью, и со слабым зацеплением. На практике, соответственно, он служит для предотвращения ошибок в обоих упомянутых контекстах, так как его нарушение, к примеру переопределение какого-либо из методов базового класса, может привести к нега­тивным изменениям в системе в целом.
Принцип разделения интерфейса. Его суть резюмируется следующим образом: ПК не должны зависеть от методов, кото­рые они не используют. Тут очевидно, что данный принцип наследует смысл сильной связности, конкретизируя необходи­мость отсутствия всякой избыточности как в плане ответствен­ности, так и в контексте рационального использования ресурсов. Т. е. в случае, если в рамках компонента инкапсулированы ме­тоды, которые не являются необходимыми для осуществления
120
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]