Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

История и развитие методологии объектно-ориентированного программирования. Сферы ее применения.

Содержание:

Введение

Информационные и компьютерные технологии, программирование в частности, являются наиболее динамичной областью современной науки, находящейся под постоянным влиянием прогресса. Усложнение концепций, лежащих в основе программных и физических компонентов, а также появление новых версий операционных систем, программного обеспечения, усовершенствование моделей процессоров и комплектующих электронно-вычислительных машин неизбежно приводит к созданию новых методов, парадигм программирования. Ярким примером подобных парадигм является объектно-ориентированное программирование (ООП). Своё начало объектно-ориентированное программирование берёт аж в 60-х годах предыдущего (XX) века, с появлением таких языков программирования, разработанных норвежскими учеными Оле-Йоханом Далем и Кристеном Нюгором, как SIMULA I и SIMULA 67, которые включали в себя большую часть концепций ООП, однако не могли называться самостоятельными языками объектно-ориентированного программирования. Далее, в 1970-х годах, под влиянием SIMULA, был создан первый самостоятельный язык объектно-ориентированного программирования Smalltalk, развивший концепцию ООП и повлиявший на множество языков программирования, таких как Java, Python и Ruby. На сегодняшний день языки ООП получили большое распространение, многие из которых являются наиболее оплачиваемыми в среде фриланса (свободной наёмной работы). Объектно-ориентированное программирование используется во многих сферах, а именно: веб-программирование (PHP, Java), системное администрирование, а так же создание программного обеспечения, такого как растровый графический редактор «GIMP», пакет для создания трёхмерной компьютерной графики «Blender» (Python). Никто не будет сомневаться, что каждый уважающий себя программист и разработчик должен знать об основах методологии ООП и о сферах, где оно применяется.

1. Что такое объектно-ориентированное программирование

Объектно-ориентированное программирование является парадигмой, результатом слияния идей, понятий об инкапсуляции, полиморфизме и наследственности. Это своего рода «три кита» ООП. Главная идея, основа методологии объектно-ориентированного программирования заключается в том, что экземпляром класса является не прототип, а непосредственно объект.[1]

Понятие "объект" впервые было использовано более 20 лет назад при конструировании компьютеров с descriptor-based и capability-based архитектурами. В этих работах делались попытки отойти от традиционной архитектуры фон Неймана и преодолеть барьер между высоким уровнем программной абстракции и низким уровнем ЭВМ. По мнению сторонников этих подходов, тогда были созданы более качественные средства, обеспечивающие: лучшее выявление ошибок, большую эффективность реализации программ, сокращение набора инструкций, упрощение компиляции, снижение объема требуемой памяти. Ряд компьютеров имеет объектно-ориентированную архитектуру: Burroughs 5000, Plessey 250, Cambridge CAP, SWARD, Intel 432, Caltech's СОМ, IBM System/38, Rational R1000, BiiN 40 и 60.[2] Появление в ООП отдельного понятия класса закономерно вытекает из желания иметь множество объектов со сходным поведением. Класс в ООП — это в чистом виде абстрактный тип данных, создаваемый программистом. С этой точки зрения объекты являются значениями данного абстрактного типа, а определение класса задаёт внутреннюю структуру значений и набор операций, которые над этими значениями могут быть выполнены.[3] Желательность иерархии классов (а значит, наследования) вытекает из требований к повторному использованию кода — если несколько классов имеют сходное поведение, нет смысла дублировать их описание, лучше выделить общую часть в общий родительский класс, а в описании самих этих классов оставить только различающиеся элементы.

Понятие «Инкапсуляция» подразумевает под собой такую способность системы, как объединение данных и методов, работающих с ними в классе.[4]

Свойством наследственности является способность одного вида классов заимствовать (наследовать) поля и методы других классов, а так же возможность добавлять к ним свои. Преимуществом данной способности является использование проверенного, готового кода, что непосредственно позволяет ускорить процесс разработки.[5]

Полиморфизмом называется способность объекта, которая позволяет ему использовать методы производного класса, не существующего на момент создания базового. Проще говоря, один и тот же код используется для объектов разных классов.[6] Естественным завершением реализации этих идей, начавшейся с языка Simula и развитой в последующих языках в 1970-1980-е годы, стало сравнительно недавнее появление таких языков, как Smalltalk, Object Pascal, C++, CLOS, Ada и Eiffel. Эти языки получили название объектных или объектно-ориентированных.

Другими словами,: "Если процедуры и функции - глаголы, а данные - существительные, то процедурные программы строятся из глаголов, а объектно-ориентированные - из существительных" [7]. По этой же причине структура программ малой и средней сложности при объектно-ориентированном подходе представляется графом, а не деревом, как в случае алгоритмических языков. Кроме того, уменьшена или отсутствует область глобальных данных. Данные и действия организуются теперь таким образом, что основными логическими строительными блоками наших систем становятся классы и объекты, а не алгоритмы.[8]

Распространение методологии ООП связано с процессом разработки программ. В частности, процедурно-ориентированная декомпозиция программ уступила место объектно-ориентированной, при которой в качестве отдельных структурных единиц программы рассматриваются не процедуры и функции, а классы и объекты с соответствующими свойствами и методами. Как следствие, программа перестала быть последовательностью предопределенных на этапе кодирования действий, а преобразовалась в событийно управляемую. Последнее обстоятельство доминирует и при разработке широкого круга современных приложений. В этом случае каждая программа представляет собой бесконечный цикл ожидания заранее определенных событий. Инициаторами событий могут быть другие программы или пользователи, а при наступлении отдельного события программа выходит из состояния ожидания и реагирует на него вполне адекватным образом.[9]

Методы структурного проектирования помогают упростить процесс разработки сложных систем за счет использования алгоритмов как готовых строительных блоков. Аналогично, методы объектно-ориентированного проектирования созданы, чтобы помочь разработчикам применять мощные выразительные средства объектного и объектно-ориентированного программирования, использующего в качестве блоков классы и объекты.

Но в объектной модели отражается и множество других факторов. Как показано во врезке ниже, объектный подход зарекомендовал себя как унифицирующая идея всей компьютерной науки, применимая не только в программировании, но также в проектировании интерфейса пользователя, баз данных и даже архитектуры компьютеров.

Причина такой широты в том, что ориентация на объекты позволяет нам справляться со сложностью систем самой разной природы.[10]

ООП часто называют новой парадигмой программирования. Другие известные парадигмы программирования: директивная (структурное программирование – Pascal, C), логическая – Prolog, функциональная – Lisp, Effel. Парадигмы в программировании определяют, как проводить вычисления, как работа, выполняемая компьютером, должна быть структурирована и организована.[11]

Таким образом, Объектно-ориентированное программирование, некогда являвшимся небольшим экспериментальным проектом, на сегодняшний день является одной из часто используемых парадигм программирования в сфере информационных и компьютерных технологий.

Рис. 1.0 Топология языков конца третьего поколения.

2. Топология языков объектно-ориентрованного программирования.

Источник: Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.

История ООП

Как было сказано в ведении, SIMULA I и SIMULA 67 были созданы в конце шестидесятых годов двадцатого века и являются самыми первыми языками объектно-ориентированного программирования. Алану Кею, который в то время работал в Университете Юты, понравилась функциональность языка SIMULA. В его голове зародилась идея о персональном компьютере, который смог бы предоставлять графически-ориентированные приложения.[12]

По его мнению, язык наподобие SIMULA мог бы предоставить удобный способ создания подобных приложений для людей, не являющихся специалистами в данной сфере. Алан Кей продал свою концепцию научно-исследовательскому центру Xerox Parc, позднее в начале 1970-х, команда, под руководством Алана Кея создала первый персональный компьютер, названный «Dynabook». Smalltalk создавался, как объектно-ориентированный язык программирования, разработанный, как программная составляющая Dynabook. Smalltalk существует и по сей день, несмотря на то, что он не является широко распространённым в коммерческой среде языком программирования.[13] Идея объектно-ориентированного программирования получила широкое распространение в 1970-х и начале 1980-х годов двадцатого века. Бьёрн Страуструп интегрировал ООП в язык C. В результате появился язык, названный «C++», это был первый язык объектно-ориентированного программирования, получивший широкое коммерческое распространение. [14]В начале 1990-х группа в Sun Microsystems, под руководством Джеймса Гослинга разработала упрощенную версию C++, названную Java, изначально предполагавшуюся, как язык программирования для Video-on-Demand приложений. Оригинальный проект не получил успеха, пока группа не сменила назначение языка, представив его, как язык для веб-программирования. Язык получил широкое распространение, так как интернет на тот момент активно развивался. [15] Язык Java оказал большое влияние на создание еще языка объектно-ориентированного программирования Python, который был разработан нидерландским программистом Гвидо ван Россумом.[16] Python используется при создании межсетевых протоколов (SMTP, HTTP, FTP, XML-RPC, POP, IMAP, CGI-программировании), а также при создании программного обеспечения и разработке веб-приложений.[17] Язык Python получил большое коммерческое распространение и использовался при создании таких проектов, как

файловые хостинги Dropbox и Яндекс Диск, торрент-трекер BitTorrent, растровый редактор Gimp, центр приложений Ubuntu (Ubuntu Software Center).

Одним из языков, оказавших влияние на Python, был Dylan (Dynamic Language), разработанный 1992-м году компанией Apple, поддерживающий парадигмы объектно-ориентированного и функционального программирования. Dylan нацелен на быструю разработку программ и приложений, преимущественно для операционной системы Mac OS.[18]

Dylan поддерживает полиморфизм, множественное наследование и многие другие парадигмы, присущие методологии объектно-ориентированного программирования.[19]

Одним из новейших языков программирования является C#, унаследовавший синтаксис от C++ и Java[20], созданный компанией Microsoft относительно недавно (в 2000-ном году). Данный язык объектно-ориентированного программирования в основном используется для создания приложений для платформы Microsoft .NET Framework.

Java и C# во многом схожи, так как синтаксис обоих языков во многом наследует синтаксис C++, в связи с этим, Java и C# являются конкурирующими языками, применяющихся, зачастую в одних и тех же сферах.[21]

Одним из популярных, широко используемых языков объектно-ориентированного программирования является Delphi, некогда носивший название Object Pascal (объектно-ориентированный Паскаль).

Delphi применяется при разработке приложений для Windows и Linux.

Язык Delphi был создан в 1995-м под руководством Андерса Хейлсберга.[22] Одним из языков, повлиявших на Delphi, был Eiffel, вышедший в 1986-м году, разработанный Бертраном Мейером и обладающий алголоподобным синтаксисом.

Примечателен Eiffel тем, что в данном языке впервые был реализован метод контрактного программирования. [23]

Контрактное программирование представляет собой метод проектирования программного обеспечения, предполагающий, что проектировщик должен определить формальные, точные и верифицируемые спецификации интерфейсов для компонентов системы.[24]

Подводя итог, касательно истории, можно сказать, что на данный момент существует множество языков объектно-ориентированного программирования, ООП получило широкое распространение во всех сферах и на данный момент используется повсеместно, от системного администрирования до разработки программного обеспечения.

Методология ООП

Основами методологии объектно-ориентированного программирования являются инкапсуляция (объединение данных и методов, работающих с ними в классе), наследственность (способность одного вида классов заимствовать поля и методы других классов) и полиморфизм (способность действий, выполняемых одноименными методами различаться в зависимости от того, к какому из классов относится тот или иной метод). Помимо выше упомянутых принципов, методология объектно-ориентированное программирования состоит из: абстракции, класса, объекта, предметной области, объектно-ориентированного анализа и проектирования. Абстракция (abstraction) - характеристика сущности, которая отличает ее от других сущностей. Абстракция определяет границу представления соответствующего элемента модели и применяется для определения фундаментальных понятий ООП, таких как класс и объект. [25]

Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных. Абельсон и Суссман назвали такое разделение смысла и реализации барьером абстракции [26], который основывается на принципе минимизации связей, когда интерфейс объекта содержит только существенные аспекты поведения и ничего больше.[27] Первым, кто указал на необходимость построения систем в виде структурированных абстракций, был Дейкстра. Позднее Парнас ввел идею скрытия информации[28], а в 70-х годах ряд исследователей, главным образом Лисков и Жиль[29], Гуттаг [30], и Шоу[31], разработал механизмы абстрактных типов данных. Хоар дополнил эти подходы теорией типов и подклассов[32]. Развивавшиеся достаточно независимо технологии построения баз данных также оказали влияние на объектный подход[33], в первую очередь благодаря так называемой модели "сущность-отношение" (ER, entity-relationship) [34]. В моделях ER, впервые предложенных Ченом [35], моделирование происходит в терминах сущностей, их атрибутов и взаимоотношений. Разработчики способов представления данных в области искусственного интеллекта также внесли свой вклад в понимание объектно-ориентированных абстракций. В 1975 г. Мински выдвинул теорию фреймов для представления реальных объектов в системах распознавания образов и естественных языков[36]. Фреймы стали использоваться в качестве архитектурной основы в различных интеллектуальных системах.

Класс — универсальный, комплексный тип данных, абстракция совокупности реальных объектов. Каждый объект строится из класса.[37]

Объект — это тип данных, поэтому он определяется в разделе описания типов[38]. В методологии объектно-ориентированного программирования рассматривается как экземпляр класса. Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств.[39] Понятия класса и объекта настолько тесно связаны, что невозможно говорить об объекте безотносительно к его классу. Однако существует важное различие этих двух понятий. В то время как объект обозначает конкретную сущность, определенную во времени и в пространстве, класс определяет лишь абстракцию существенного в объекте. Таким образом, можно говорить о классе "Млекопитающие", который включает характеристики, общие для всех млекопитающих. Для указания на конкретного представителя млекопитающих необходимо сказать "это - млекопитающее" или "то - млекопитающее".

Иерархия классов представляет собой классификацию объектных типов, рассматривая объекты как реализацию классов.

Управлять большим количеством разрозненных классов довольно сложно. С этой проблемой можно справиться путем упорядочивания и ранжирования классов, то есть объединяя общие для нескольких классов свойства в одном классе и используя его в качестве базового. Эту возможность предоставляет механизм наследования.[40]

Наследование тесно связано с иерархией классов, определяющей, какие классы следует считать наиболее абстрактными и общими по отношению к другим классам. При этом если общий или родительский класс (предок) обладает фиксированным набором свойств и поведением, то производный от него класс (потомок) должен содержать этот же набор свойств и подобное поведение, а также дополнительные, которые будут характеризовать уникальность полученного класса.

В этом случае говорят, что производный класс наследует свойства и поведение родительского класса. Для иллюстрации принципа наследования можно привести следующий пример. Общий класс "Компьютер". Он определяется как абстракция свойств и поведения всех, реально существующих электронных вычислительных машин. При этом общими свойствами класса "Компьютер" могут быть такие, как наличие процессора, оперативной памяти, устройств ввода и вывода информации.

Если в качестве производного рассмотреть класс "Персональный компьютер", то все выделенные выше свойства будет содержать и этот класс. Можно сказать, что класс "Персональный компьютер" наследует свойства родительского класса "Компьютер". Однако кроме перечисленных свойств классу-потомку будут присущи дополнительные, например, наличие системного блока и материнской платы с разъемом для установки микропроцессора. В свою очередь класс "Персональный компьютер" может быть классом-предком для других классов, в частности "Рабочая станция", "Сервер" и "Ноутбук". С этой точки зрения все указанные классы наследуют свойства родительского класса "Персональный компьютер", а возможно и переопределяют некоторые из них.

Описанная выше текстовая информация о соотношении классов в данном примере обладает одним серьезным недостатком, а именно, отсутствием наглядности. В этой связи возникает вопрос: а возможно ли представить иерархию наследования классов в визуальной форме? В понятийной логике для изображения понятий используются окружности или прямоугольники. С помощью графической нотации на рисунке под номером 2, иерархию классов для рассмотренного примера можно представить в виде вложенных прямоугольников или окружностей, каждый из которых соответствует отдельному классу.[41]

­­­Рис. 2.0, Пример иерархии классов.

3. Иерархия вложенности классов для примера общего класса

"Компьютер"

Источник: НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. URL:[ http://www.intuit.ru/EDI/25_12_15_1/1450995683-14467/tutorial/92/objects/1/files/1-1.gif]

Инкапсуляция характеризует сокрытие отдельных деталей внутреннего устройства классов от внешних по отношению к нему объектов или пользователей. На примере с классом "Компьютер" нетрудно проиллюстрировать инкапсуляцию следующим образом. Основным субъектом, который взаимодействует с объектами этого класса, является пользователь. Вполне очевидно, что не каждый пользователь в совершенстве знает внутреннее устройство того или иного компьютера. К тому же, отдельные детали этого устройства сознательно скрыты в корпусе системного блока или монитора. А в случае нарушения работы компьютера, которое является причиной неадекватности его поведения, необходимый ремонт выполняет профессиональный специалист.[42]

Предметная область (domain) - часть реального мира, которая имеет существенное значение или непосредственное отношение к процессу функционирования программы. Другими словами, предметная область включает в себя только те объекты и взаимосвязи между ними, которые необходимы для описания требований и условий решения конкретной задачи. Выделение исходных или базовых компонентов предметной области, требуемых для решения той или иной задачи, представляет, в общем случае, нетривиальную проблему. Сложность данной проблемы проявляется в неформальном характере процедур или правил, которые можно применять для этой цели. Более того, эта работа должна выполняться совместно со специалистами или экспертами, хорошо знающими предметную область. Например, если разрабатывается база данных для обслуживания пассажиров крупного аэропорта, то в проектировании концептуальной схемы базы данных должны принимать участие штатные сотрудники аэропорта. Эти сотрудники хорошо знают весь процесс обслуживания пассажиров или данную предметную область. Сложность моделирования предметной области и разработки корпоративных информационных систем привело к появлению новой методологии объектно-ориентированный анализ и проектирование.[43] Полиморфизм также один из основных принципов ООП. Под полиморфизмом (греч. Poly - много, morfos - форма) понимается свойство объектов принимать различные внешние формы в зависимости от обстоятельств. Применительно к ООП полиморфизм означает, что действия, выполняемые одноименными методами, могут различаться в зависимости от того, к какому из классов относится тот или иной метод.

Объектно-ориентированный анализ и проектирование (ООАП, Object-Oriented Analysis/Design) - технология разработки программных систем, в основу которых положена объектно-ориентированная методология представления предметной области в виде объектов, являющихся экземплярами соответствующих классов. Объектно-ориентированный анализ и проектирование принципиально отличаются от традиционных подходов структурного проектирования:[44] здесь нужно по-другому представлять себе процесс декомпозиции, а архитектура получающегося программного продукта в значительной степени выходит за рамки представлений, традиционных для структурного программирования. Отличия обусловлены тем, что структурное проектирование основано на структурном программировании, тогда как в основе объектно-ориентированного проектирования лежит методология объектно-ориентированного программирования.

Компонентно-ориентированное программирование является логическим продолжением объектно-ориентированного программирования, по сути это - набор правил и ограничений, направленных на построение крупных развивающихся программных систем с большим временем жизни.[45] Можно сказать, что КОП — это такое ООП, которое подчинено требованиям безопасности "старого" структурного и модульного программирования примерно в том виде, в каком эти требования были реализованы в классической Модуле-2 (в отличие от языков типа Smalltalk, в которых ООП является основным механизмом, который применяется без ограничений). КОП можно описать примерно такой формулой:

КОП = ООП

+ модульность (включая упрятывание информации и позднее связывание модулей, т.е. возможность подгружать необходимые модули в процессе выполнения программы, а не заранее, как это обычно делается в старых системах программирования)

+ безопасность (статический контроль типов переменных и автоматическое управление памятью)

- наследование реализации через границы модулей. [46]Понятие программного компонента (software component) является одним из ключевых в современной инженерии ПО.

Этим термином обозначают несколько различных вещей, часто не уточняя подразумеваемого в каждом конкретном случае смысла. Если речь идет об архитектуре ПО (или ведет ее архитектор ПО), под компонентом имеется в виду то же, что часто называется программным модулем. Это достаточно произвольный и абстрактный элемент структуры системы, определенным образом выделенный среди окружения, решающий некоторые подзадачи в рамках общих задач системы и взаимодействующий с окружением через определенный интерфейс На диаграммах компонентов в языке UML часто изображаются компоненты, являющиеся единицами сборки и конфигурационного управления, — файлы с кодом на каком-то языке, бинарные файлы, какие-либо документы, входящие в состав системы. Иногда там же появляются компоненты, представляющие собой единицы развертывания системы, — это компоненты уже в третьем, следующем смысле. [47]

Компоненты развертывания являются блоками, из которых строится компонентное программное обеспечение. Эти же компоненты имеются в виду, когда говорят о компонентных технологиях, компонентной или компонентно-ориентированной (component based) разработке ПО, компонентах JavaBeans, EJB, CORBA, ActiveX, VBA, COM, DCOM, .Net, Web-службах (web services), а также о компонентном подходе, упоминаемом в названии данного курса. Такой компонент представляет собой структурную единицу программной системы, обладающую четко определенным интерфейсом, который полностью описывает ее зависимости от окружения. Такой компонент может быть независимо поставлен или не поставлен, добавлен в состав некоторой системы или удален из нее, в том числе, может включаться в состав систем других поставщиков.[48] Различие между этими понятиями, хотя и достаточно тонкое, все же может привести к серьезному непониманию текста или собеседника в некоторых ситуациях.

В определении архитектурного компонента или модуля делается акцент на выделение структурных элементов системы в целом и декомпозицию решаемых ею задач на более мелкие подзадачи. Представление такого компонента в виде единиц хранения информации (файлов, баз данных и пр.) не имеет никакого значения. Его интерфейс хотя и определен, но может быть уточнен и расширен в процессе разработки.[49]

Понятие компонента сборки и конфигурационного управления связано со структурными элементами системы, с которыми приходится иметь дело инструментам, осуществляющим сборку и конфигурационное управление, а также людям, работающим с этими инструментами. Для этих видов компонентов интерфейсы взаимодействия с другими такими же элементами системы могут быть не определены. Понятие «компоненты в третьем смысле имеет несколько аспектов» Компонент в этом смысле — выделенная структурная единица с четко определенным интерфейсом. Он имеет более строгие требования к четкости определения интерфейса, чем архитектурный компонент. Абсолютно все его зависимости от окружения должны быть описаны в рамках этого интерфейса. Один компонент может также иметь несколько интерфейсов, играя несколько разных ролей в системе.

При описании интерфейса компонента важна не только сигнатура операций, которые можно выполнять с его помощью. Становится важным и то, какие другие компоненты он может задействовать при работе, а также каким ограничениям должны удовлетворять входные данные операций и какие свойства выполняются для результатов их работы. Эти ограничения являются так называемым интерфейсным контрактом или программным контрактом компонента. Интерфейс компонента включает набор операций, которые можно вызвать у любого компонента, реализующего данный интерфейс, и набор операций, которые этот компонент может вызвать в ответ у других компонентов. Интерфейсный контракт для каждой операции самого компонента (или используемой им) определяет предусловие и постусловие ее вызова. Предусловие операции должно быть выполнено при ее вызове, иначе корректность результатов не гарантируется. Если эта операция вызывается у компонента, то обязанность позаботиться о выполнении предусловия лежит на клиенте, вызывающем операцию. Если же эта операция вызывается компонентом у другого компонента, он сам обязуется выполнить это предусловие. С постусловием все наоборот — постусловие вызванной у компонента операции должно быть выполнено после ее вызова, и это — обязанность компонента. Постусловие операции определяет, какие ее результаты счита ются корректными. В отношении вызываемых компонентом операций выполнение их постусловий должно гарантироваться теми компонентами, у которых они вызываются, а вызывающий компонент может на них опираться в своей работе.[50] Компонентно-ориентированный подход может применяться во многих языках программирования, с помощью стандартных конструкций (таких как: классы, интерфейсы, пакеты, модули).

Существуют языки программирования, реализующие на конструктивном уровне компонентно-ориентированное программирование:

«Оберон» (ограниченно);

«Компонентный Паскаль».

В рамках языка «Java» — компонентно-ориентированное программирование реализуется посредством компонентов, называемых «JavaBeans», поддержанных в одной из ранних спецификаций языка;

В платформе «.NET» — реализован компонентно-ориентированный подход, обеспечивающий создание и повторное использование компонентов для любого языка программирования, поддерживаемого платформой.[51]

Рис. 1.0 «Основные элементы компонентного программного обеспечения»

Основные элементы компонентного программного обеспечения

Источник: «НОУ Интуит Лекция 12: Компонентные технологии и разработка распределенного ПО.» URL:[ http://www.intuit.ru/studies/courses/64/64/lecture/1888]

Компоненты отличаются от классов объектно-ориентированных языков:

Класс определяет не только набор реализуемых интерфейсов, но и саму их реализацию, поскольку он содержит код определяемых операций. Контракт компонента, чаще всего, не фиксирует реализацию его интерфейсов.

Класс написан на определенном языке программирования. Компонент же не привязан к определенному языку, если, конечно, его компонентная модель этого не требует, — компонентная модель является для компонентов тем же, чем для классов является язык программирования.

Обычно компонент является более крупной структурной единицей, чем класс. Реализация компонента часто состоит из нескольких тесно связанных друг с другом классов. Понятие компонента является более узким, чем понятие программного модуля. Основное содержание понятия модуля — наличие четко описанного интерфейса между ним и окружением. Понятие компонента добавляет атомарность развертывания, а также возможность поставки или удаления компонента отдельно от всей остальной системы.

Возможность включения и исключения компонента из системы делает его отдельным элементом продаваемого ПО. Компоненты, хотя и не являются законченными продуктами, могут разрабатываться и продаваться отдельно, если они следуют правилам определенной компонентной модели и реализуют достаточно важные для покупателей функции, которые те хотели бы иметь в рамках своей программной системы. Надо отметить, что, хотя рынок ПО существует достаточно давно, а компонентные технологии разрабатываются уже около 20 лет, рынок компонентов развивается довольно медленно. Поставщиками компонентов становятся лишь отдельные компании, тесно связанные с разработчиками конкретных компонентных сред, а не широкое сообщество индивидуальных и корпоративных разработчиков, как это представляли себе создатели компонентных технологий при их зарождении. По-видимому, один из основных факторов, мешающих развитию этого рынка, — это "гонка технологий" между поставщиками основных компонентных сред. Ее следствием является отсутствие стабильности в их развитии. Новые версии появляются слишком часто, и достаточно часто при выходе новых версий изменяются элементы компонентной модели. Так что при разработке компонентов для следующей версии приходится следовать уже несколько другим правилам, а старые компоненты с трудом могут быть переиспользованы.[52]

Еще одним стилем объектно-ориентированного программирования является прототипное программирование. Главное отличие от ООП заключается в том, что понятие класса отсутствует, а наследование производится путём клонирования существующего экземпляра объекта — прототипа.[53]

В отличие от способа определения объектов с использованием классов, прототипные объектные системы поддерживают более прямой метод создания объектов. Например, в JavaScript объект представляет собой простой список свойств. Каждый объект содержит специальную ссылку на другой родительский объект или прототип— объект, поведение которого наследуется.

Между классическими и прототипными объектными системами существует фундаментальное различие. Классические объекты определяются абстрактно как часть некоторой концептуальной группы и наследуют характеристики других классов или групп объектов. Напротив, прототипные объекты определяются конкретно как специальные объекты и наследуют поведение других специальных объектов.

Таким образом, объектно-ориентированный язык программирования, основанный на классах, имеет двойственную природу, требующую наличия по меньшей мере двух основополагающих конструкций: классов и объектов. В результате такой двойственности по мере расширения основанного на классах программного обеспечения возникает тенденция к развитию сложных иерархий классов. Как правило, не всегда возможно заранее предсказать все способы последующего использования классов, поэтому для облегчения внесения изменений требуется постоянный рефакторинг подобной иерархии классов.

Языки, основанные на прототипах, избавляют от необходимости учета такой двойственности и упрощают прямое создание объектов и манипулирование ими. Отсутствие привязки объектов к классам позволяет создавать более слабо связанные системы объектов, помогающие поддерживать модульность и уменьшающие необходимость в рефакторинге. [54]

Языками программирования, поддерживающими прототипную парадигму программирования, являются: ECMAScript, Falcon, Io, Lua.[55]

Подводя итог к этой главе, можно сделать вывод, что методология ООП развивается. Объектно-ориентированная парадигма успела дать начало таким видам парадигм, как прототипная, компонентная и класс-ориентированная, которые являются переосмыслением и дополнением стандартной методологии объектно-ориентированного программирования.

4. Критика объектно-ориентированного программирования

Несмотря на широкое распространение методологии объектно-ориентированного программирования, данная парадигма подвергается критике по некоторым причинам, включая несоответствие заявленным целям о повторном использовании и модульности[56], а так же преувеличении важности одних парадигм (таких, как классы и объекты) над важными аспектами (процедуры, алгоритмы).

Так, Лука Карделли утверждает, что объектный код «по своей сути менее эффективен», чем процедурный код, в объектно-ориентированном программировании уходит больше времени на компиляцию, в сравнении с процедурной парадигмой. По словам Карделли, языки ООП обладают «крайне плохими свойствами модульности по отношению к расширению и модификации классов» и имеют тенденцию быть чрезвычайно сложными. С последним утверждением солидарен Джо Армстронг, создатель функционально-ориентированного языка Erlang, которому принадлежит цитата:

«Проблема с ОО-языками заключается в том, что они тянут за собой всё своё окружение. Вы хотели всего лишь банан, но в результате получаете гориллу, держащую этот банан, и все джунгли в придачу».[57]

Исследование Potok et al. Не показало существенной разницы в производительности между объектно-ориентированным и процедурным программированием.[58]

Кристофер Дейт пришел к выводу, что критическое сравнение объектно-ориентированного программирования с другими технологиями, реляционным программированием в частности, является крайне затруднительным, в связи с отсутствием строгого согласованного определения ООП. Однако Датэр и Дарвен предложили теоретическую основу ООП, использующую ООП как своего рода настраиваемую систему типов для поддержки РСУБД (Реляционной системы управления базами данных).[59]

Объектно-ориентированное программирование было раскритиковано российским учёным в области информатики Александром Степановым:

«Я нахожу объектно-ориентированное программирование технически неосновательным. Оно пытается разложить мир на части в терминах интерфейсов, которые изменяются в пределах одного типа. Чтобы иметь дело с реальными проблемами, вам нужны многосортные алгебры -- семейства интерфейсов, которые простираются на многие типы.

Я нахожу объектно-ориентированное программирование философски нездоровым. Оно утверждает, что всё является объектом. Даже если это так, это не очень интересно: сказать, что всё является объектом -- значит, не сказать вообще ничего. Я нахожу объектно-ориентированное программирование неправильным методологически. Оно начинается с классов. Это как если бы математик начал с аксиом. Вы не начинаете с аксиом -- вы начинаете с доказательств. Только когда вы нашли кучу соотносящихся доказательств, вы предлагаете аксиомы. Вы заканчиваете аксиомами.То же справедливо и в программировании: вы должны начать с интересных алгоритмов. Только когда вы хорошо их понимаете, вы можете предложить интерфейс, который позволит им работать».[60]

Пол Грэм предположил, что популярность ООП в крупных компаниях объясняется «большими (и часто меняющимися) группами посредственных программистов». По словам Грэма, дисциплина, навязанная ООП, не позволяет программисту «совершить много ошибок». [61]

Стив Йегге отметил, что в ООП отличие от функционального программирования: [62]

«Объектно-ориентированное программирование ставит имена прежде всего. Зачем вам идти до такой степени, чтобы поставить одну часть речи на пьедестал? Почему один вид концепции должен иметь приоритет над другим? Это не значит, что ООП неожиданно сделало глаголы менее важными в том смысле, в котором мы на самом деле думаем. Это странно искаженная перспектива».

Ричард Хики, создатель Clojure, описал объектные системы как чрезмерно упрощенные модели реального мира. Он подчеркнул неспособность ООП правильно моделировать время, что становится все более проблематичным по мере того, как программные системы продолжают конкурировать.[63]

Роб Пайк, программист, принимавший участие в создании UTF-8 и Go, назвал объектно-ориентированное программирование «римскими цифрами среди программирования» сказав, что языки ООП часто переводят внимание со структур данных и алгоритмов на типы данных. [64] Пайк приводит в пример случай с неким профессором, чьё «идиоматическое» решение проблемы было создание новых шести классов, вместо того, чтобы просто применить таблицу поиска.[65]

Эрик Раймонд, программист Unix-систем и сторонник программного обеспечения с открытым исходным кодом опроверг заявления о том, что современное объектно-ориентированное программирование является «единственным верным решением». Сообщив, что объектно-ориентированные языки программирования имеют тенденцию стимулировать многоуровневые программы, плохо влияющие на чистоту языка (программирования). Раймонд критикует методологию ООП, сравнивая её с подходом, используемым в Unix и языке программирования C. [66]

Эдсгер Дейкстра указывал: «…то, о чём общество в большинстве случаев просит — это эликсир от всех болезней. Естественно, "эликсир" имеет очень впечатляющие названия, иначе будет очень трудно что-то продать: „Структурный анализ и Дизайн“, „Программная инженерия“, „Модели зрелости“, „Управляющие информационные системы“ (Management Information Systems), „Интегрированные среды поддержки проектов“, „Объектная ориентированность“, „Реинжиниринг бизнес-процессов“…»[67].

Никлаус Вирт считает, что ООП — не более чем тривиальная надстройка над структурным программированием, и преувеличение её значимости, выражающееся, в том числе, во включении в языки программирования всё новых модных «объектно-ориентированных» средств, вредит качеству разрабатываемого программного обеспечения.

Эдсгер Дейкстра указывал: «…то, о чём общество в большинстве случаев просит — это эликсир от всех болезней. Естественно, "эликсир" имеет очень впечатляющие названия, иначе будет очень трудно что-то продать: „Структурный анализ и Дизайн“, „Программная инженерия“, „Модели зрелости“, „Управляющие информационные системы“ (Management Information Systems), „Интегрированные среды поддержки проектов“, „Объектная ориентированность“, „Реинжиниринг бизнес-процессов“…»[68]

Патрику Киллелиа принадлежит цитата «…ООП предоставляет вам множество способов замедлить работу ваших программ…».[69]

Фредерик Брукс указывает, что наиболее сложной частью создания программного обеспечения является «…спецификация, дизайн и тестирование концептуальных конструкций, а отнюдь не работа по выражению этих концептуальных конструкций…». ООП (наряду с такими технологиями как искусственный интеллект, верификация программ, автоматическое программирование, графическое программирование, экспертные системы и др.), по его мнению, не является «серебряной пулей», которая могла бы на порядок величины снизить сложность разработки программных систем. Согласно Бруксу, «…ООП позволяет сократить только привнесённую сложность в выражение дизайна. Дизайн остаётся сложным по своей природе…»[70]

Указывается на то, что целый ряд «врождённых особенностей» ООП-технологии делает построенные на её основе программы технически менее эффективными, по сравнению с аналогичными необъектными программами. Не отрицая действительно имеющихся дополнительных накладных расходов на организацию работы ООП-программ (см. раздел «Производительность» выше), нужно, однако, отметить, что значение снижения производительности часто преувеличивается критиками. В современных условиях, когда технические возможности компьютеров чрезвычайно велики и постоянно растут, для большинства прикладных программ техническая эффективность оказывается менее существенна, чем функциональность, скорость разработки и сопровождаемость. Лишь для некоторого, очень ограниченного класса программ (ПО встроенных систем, драйверы устройств, низкоуровневая часть системного ПО, научное ПО) производительность остаётся критическим фактором.

Итого, несмотря на то, что объектно-ориентированная парадигма пользуется значительной популярностью и применяется в большом количестве современных коммерческих проектов, имеющих отношение к информационным технологиям, ООП подвержено критики со стороны отдельных авторитетных ученых, таких как Александр Степанов, Никлаус Вирт и Лука Карделли.

5. Сферы применения технологии ООП

С распространением таких языков, как UML, C#, Python, Java, Python объектно-ориентированное программирование проникло во все сферы, включая разработку веб-приложений, серверных приложений в сфере финансовых услуг, программного обеспечения (в том числе и прикладного), встроенных систем, игр (как вспомогательный язык), создания алгоритмов управления вертикальным транспортом, системном администрировании.[71] Языки объектно-ориентированного программирования активно используются при разработке программного обеспечения. Такие программы, как растровый редактор Gimp, 3d редактор Blender, центр приложений Ubuntu написаны на языке ООП Python. Так, Python используют такие корпорации, как Dropbox (одноименный сервис полностью разработан на языке Python), Google, Linux, Яндекс, Yahoo Groups и Mail.ru. Язык объектно-ориентированного программирования Java крепко проник в сферу Android-приложений, подавляющее число приложений для операционной системы Android написано на языке Java. Обширна Java и в области электронной коммерции, этот язык объектно-ориентированного программирования широко используется в финансовой сфере и инвестиционных банках. Широкое распространение объектно-ориентированное программирование получило в области веб-приложений. Многие веб-фреймворки, такие как Django, Pylons, TurboGears, CherryPy, Flask, Pyramid, Spring MVC, Struts 2.0 и Servlet написаны на таких языках ООП, как Java и Python. Даже простейшие приложения, основанные на Servlet, JSP и Struts, достаточно популярны в различных государственных проектах. Многие веб-приложения государственных, оздоровительных, страховых, образовательных, оборонительных и некоторых других отделений написаны на Java.[72]

Такие объектно-ориентированные языки программирования, как Python, Ruby и Perl используются при выполнении задач для автоматизации работы системного администрирования. Python установлен на все Linux-сервера по умолчанию. Так же, Python и Java используются для программирования встроенных систем (embedded systems). Встроенная система – это микропроцессорное устройство, обычно служащее модулем некоторого устройства. Самые известные встроенные системы, использующие язык Python - это Raspberry Pi [73]и CubieBoard[74].

Применяется объектно-ориентированное программирование и в области научных исследований. На языке Python написаны такие библиотеки для научных исследований, как Astropy[75] (используется при выполнении астрономических расчётов), SciPy (предназначена для выполнения научных и инженерных расчётов), Biopython (используется в вычислительной биологии и биоинформатике), Matplotlib (прндназначена для визуализации данных двумерной графики), а так же библиотеки, предназначенные для математических вычислений, как NumPy, Mathics, Matplotlib, Plotly, SageMath, SymPy.

Помимо этого, принцип ООП используется при создании алгоритмов управления вертикальным транспортом, таким как лифт[76]. Автоматное программирование может использоваться в одном из двух вариантов: как процедурное программирование с явным выделением состояний или как объектно-ориентированное программирование с явным выделением состояний.

В настоящей работе, как и в работе, используется второй подход, основанный на двух парадигмах: объектной и автоматной. При этом отметим, что в указанной статье автоматы реализуются, как методы классов, в то время как в настоящей работе предлагается реализовывать их, как классы. Это позволяет в полной мере совместить гибкость объектно-ориентированного программирования с наглядностью и ясностью автоматного подхода. Проектирование каждого автомата состоит в создании по словесному описанию (декларации о намерениях) схемы связей, описывающей его интерфейс, и графа переходов, определяющего его поведение. По этим двум документам формально и изоморфно может быть построен модуль программы, соответствующий автомату. Проектирование каждого автомата состоит в создании по словесному описанию (декларации о намерениях) схемы связей, описывающей его интерфейс, и графа переходов, определяющего его поведение. По этим двум документам формально и изоморфно может быть построен модуль программы, соответствующий автомату. [77]

Языки объектно-ориентированного программирования используются в разработке мультимедийных развлекательных программ/приложений (таких, как интерактивные фильмы и компьютерные игры). В таких играх, как Civilization IV[78] и World of Tanks язык [79]ООП Python используется в качестве скриптового языка, применяется для управления искусственным интеллектом.

Подводя итог, объектно-ориентированное программирование за более, чем сорок лет приобрело популярность в самых разнообразных сферах компьютерных и информационных технологий. На сегодняшний день, объектно-ориентированная парадигма используется в большинстве сфер, от создания алгоритмов для управления лифтов. программирования встроенных систем до разработки веб-приложений и системного администрирования.

Заключение

Объектно-ориентированное программирование, являвшееся небольшим проектом в шестидесятые года, получило своё развитие спустя десятилетие, при создании языка Smalltalk, под руководством Алана Кея. ООП является полноправной парадигмой программирования, наравне с функциональной, процедурной, автоматной и обобщённой. В свою очередь, ООП послужило основой создания новых парадигм, таких как класс-ориентированная, концептная и компонентно-ориентированная.

Несмотря на то, что объектно-ориентированная парадигма подвергается критике со стороны некоторых авторитетных учёных, таких как Александр Степанов, Никлаус Вирт и Лука Карделли, ООП используется в большом количестве коммерческих проектов, связанных с информационными технологиями. Объектно-ориентированная парадигма используется при разработке веб-приложений, программного обеспечения, серверных приложений, развлекательных мультимедийных приложений, системном администрировании, научных проектах, программировании встроенных систем и т.д.

ООП продолжает развиваться и ныне, приобретая всё большее распространение.

Библиография

Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++, Классы и объекты.;

Жоголев Е.А. Лекции по технологии программирования: Учебное пособие. М.: Издательский отдел факуль-тета ВМиК МГУ, 2001;

Знакомство с прототипным объектно-ориентированным программированием. Официальный сайт IBM. URL: [https://www.ibm.com/developerworks/ru/library/wa-protoop/];

Иан Грэхем. Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Princi-ples & Practice. — 3-е изд. — М.: «Вильямс», 2004. — С. 880.;

Л. А. Наумов, А. А. Шалыто. Искусство программирования лифта. Объектно-ориентированное программирование с явным выделением состояний.;

НОУ «Интуит» Лекция 14: Иерархия классов. URL:[http://www.intuit.ru/studies/courses/486/342/lecture/8244];

НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. URL:[ http://www.intuit.ru/studies/courses/32/32/lecture/1000];

НОУ «Интуит» Лекция 6: Введение в объектно-ориентированное программирование. URL:[http://www.intuit.ru/studies/courses/15889/484/lecture/10994];

НОУ Интуит Лекция 12: Компонентные технологии и разработка распределенного ПО.;

Официальный сайт Adobe. Object-oriented programming concepts: Objects and classes. URL: [http://www.adobe.com/devnet/actionscript/learning/oop-concepts/objects-and-classes.html];

Официальная документация по технологиям Java. URL: [http://www.oracle.com/technetwork/java/index.html];

Официальный сайт Raspberry Pi URL: [https://www.raspberrypi.org/documentation/usage/python/];

Патрик Киллелиа. «Тюнинг веб-сервера».;

Трей Нэш «C# 2010: ускоренный курс для профессионалов»;

Что такое компонентно-ориентированное программирование (краткая справка) (рус.). Архивировано из первоисточника на WebCite 13 февраля 2012 года. URL: [http://www.inr.ac.ru/~info21/info/qtocop.htm];

Шахгельдян К.И., редактор: Александрова Л.И:Объектно-ориентированное программирование (Учебное пособие).;

Atkinson, M. and Buneman, P. June 1987. Types and Persistence in Database Programming Languages. ACM Com-puting Surveys vol.19(2), p.105.;

Armstrong, Joe. In Coders at Work: Reflections on the Craft of Programming.;

About Astropy. URL: [http://www.astropy.org/];

Bertrand Meyer. Eiffel: The Language;

Barr,A.and Feigenbaum. E. 1981. The Handbook of Artificial Intelligence. vol.1.Los Altos, CA: William Kaufmann, p.216.;

Benjamin C. Pierce. Types and Programming Languages. — MIT Press, 2002-01-01;

Chen, P. March 1976. The Entity-Relationship Model - Toward a Unified View of Data. ACM Transactions on Data-base Systems vol.1(1).;

Cardelli, Luca (1996). "Bad Engineering Properties of Object-Oriented Languages".;

C. J. Date, Hugh Darwen. Foundation for Future Database Systems: The Third Manifesto (2nd Edition);

“Civilization IV Official Press Sheet". IGN. 31 May 2005. 620531p1.” URL: [http://pc.gamespy.com/pc/civilization-iv/662218p1.html];

David T. Craig. Apple Lisa Computer: History of Apple and Pascal.;

Eric Kidd. Getting Started with Dylan;

Eric S. Raymond (2003). "The Art of Unix Programming: Unix and Object-Oriented Languages".;

EWD 1175: The strengths of the academic enterprise;

EWD 1175: The strengths of the academic enterprise. The University of Texas in Austin. Department of Computer Science. URL: [http://www.cs.utexas.edu/users/EWD/transcriptions/EWD11xx/EWD1175.html];

General Python FAQ. What is Python good for? URL: [https://docs.python.org/3/faq/general.html#why-was-python-created-in-the-first-place];

Guttag, J. 1980. Abstract Data Types and the Development of Data Structures, in Programming Language Design. New York, NY: Computer Society Press.;

Graham, Paul. "Why ARC isn't especially Object-Oriented.";

“GUI в игре World of Tanks. Часть вторая: обзор структуры GUI и планы на будущее” Хабрахабр. [https://habrahabr.ru/company/wargaming/blog/229261/];

Javarevisited. Where is Java used in Real World? URL: [http://javarevisited.blogspot.bg/2014/12/where-does-java-used-in-real-world.html];

Liskov, B. and Zilles, S. 1977. An Introduction to Formal Specifications of Data Abstractions. Current Trends in Pro-gramming Methodology: Software Specification and Design vol.1. Englewood Cliffs. NJ: Prentice-Hall.;

Neal Feinberg. Dylan Programming: An Object-oriented and Dynamic Language. — Addison-Wesley, 1997. — 442 с.;

Nygaard, K. and Dahl, O-J. 1981. The Development of the Simula Languages, in History of Programming Languages. New York, NY: Academic Press, p.460.;

«No Silver Bullet. Essence and Accidents of Software Engineering» (Computer Magazine; April 1987);

Oracle: The History of Java Technology. URL: [http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html];

Parnas, D. 1979. On the Criteria to the Be Used in Decomposing Systems into Modules, in Classics in Software En-gineering. New York, NY: Yourdon Press.;

Potok, Thomas; Mladen Vouk; Andy Rindos (1999). "Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment";

Pike, Rob "Less is exponentially more".;

Pike, Rob. "A few years ago, I saw this page".;

Radeck, Kirk C# and Java: Comparing Programming Languages (англ.). MSDN (October 2003);

Rumbaugh, J. April 1988. Relational Database Design Using an Object-oriented Methodology. Communications of the ACM vol.31(4), p.415.;

Rich Hickey, JVM Languages Summit 2009 keynote, Are We There Yet?;

Shaw: Abstraction Techniques.;

Stepanov, Alexander. "STLport: An Interview with A. Stepanov".;

Stevey's Blog Rants. Execution in the Kingdom of Nouns;

The Making of Python, A Conversation with Guido van Rossum, Part I by Bill Venners, January 13, 2003;

Using Python Program Control GPIOs URL: [http://docs.cubieboard.org/tutorials/common/using_python_program_control_gpios];

Walter, Bright D Programming Language, Contract Programming. Digital Mars;

Zakas N. ECMAScript // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009.;

Приложение

Рис. 1.0 Топология языков конца третьего поколения.

Источник: Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++. ;

­­­Рис. 2.0, Пример иерархии классов

Источник: НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем.;

Рис. 1.0 «Основные элементы компонентного программного обеспечения»

Источник: «НОУ Интуит Лекция 12: Компонентные технологии и разработка распределенного ПО.»;

  1. Парадигмы объектно-ориентированного программирования на примере Java. Technerium.

  2. Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++

  3. A Brief History of Object-Oriented Programming. The university of Tenesse Knoxville.

    URL: [http://web.eecs.utk.edu/~huangj/CS302S04/notes/oo-intro.html]

  4. НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. URL:[ http://www.intuit.ru/studies/courses/32/32/lecture/1000]

  5. The Birth of Object Orientation: the Simula Languages. Ole-Johan Dahl. June 2001

  6. O.-J. Dahl, K. Nygaard: SIMULA { A language for programming and

    description of discrete event systems. Introduction and user's manual.

    NCC Publ. no. 11, 1965.

  7. Macintosh MacApp 1.1.1 Programmer's Reference. 1986. Cupertino, CA: Apple Computer, p.2.

  8. Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.

  9. НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. URL:[ http://www.intuit.ru/studies/courses/32/32/lecture/1000]

  10. Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++

  11. Объектно-ориентированное программирование (Учебное пособие). Автор: Шахгельдян К.И. , редактор: Александрова Л.И.

  12. A Brief History of Object-Oriented Programming. The university of Tenesse Knoxville.

    [http://web.eecs.utk.edu/~huangj/CS302S04/notes/oo-intro.html]

  13. Alan C. Kay “The Early History of SmallTalk”.

  14. Bjarne Stroustrup's FAQ: When was C++ invented? [http://www.stroustrup.com/bs_faq.html#invention]

  15. Oracle: The History of Java Technology. URL:[http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html]

  16. The Making of Python, A Conversation with Guido van Rossum, Part I by Bill Venners, January 13, 2003

  17. General Python FAQ. What is Python good for?

    [https://docs.python.org/3/faq/general.html#why-was-python-created-in-the-first-place]

  18. Eric Kidd. Getting Started with Dylan

  19. Neal Feinberg. Dylan Programming: An Object-oriented and Dynamic Language. — Addison-Wesley, 1997. — 442 с.

  20. Трей Нэш «C# 2010: ускоренный курс для профессионалов»

  21. Radeck, Kirk C# and Java: Comparing Programming Languages (англ.). MSDN (October 2003)

  22. David T. Craig. Apple Lisa Computer: History of Apple and Pascal.

  23. Bertrand Meyer. Eiffel: The Language

  24. Walter, Bright D Programming Language, Contract Programming. Digital Mars

  25. НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. URL:[ http://www.intuit.ru/studies/courses/32/32/lecture/1000]

  26. Abelson, H. and Sussman, G. 1985. Structure and Interpretation of Computer Programs. Cambridge, MA: The MIT Press, p.126.

  27. Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++

  28. Parnas, D. 1979. On the Criteria to the Be Used in Decomposing Systems into Modules, in Classics in Software Engineering. New York, NY: Yourdon Press.

  29. Liskov, B. and Zilles, S. 1977. An Introduction to Formal Specifications of Data Abstractions. Current Trends in Programming Methodology: Software Specification and Design vol.1. Englewood Cliffs. NJ: Prentice-Hall.

  30. Guttag, J. 1980. Abstract Data Types and the Development of Data Structures, in Programming Language Design. New York, NY: Computer Society Press.

  31. Shaw. Abstraction Techniques.

  32. Nygaard, K. and Dahl, O-J. 1981. The Development of the Simula Languages, in History of Programming Languages. New York, NY: Academic Press, p.460.

  33. Atkinson, M. and Buneman, P. June 1987. Types and Persistence in Database Programming Languages. ACM Computing Surveys vol.19(2), p.105.

  34. Rumbaugh, J. April 1988. Relational Database Design Using an Object-oriented Methodology. Communications of the ACM vol.31(4), p.415.

  35. Chen, P. March 1976. The Entity-Relationship Model - Toward a Unified View of Data. ACM Transactions on Database Systems vol.1(1).

  36. Barr,A.and Feigenbaum. E. 1981. The Handbook ofArtificial Intelligence. vol.1.Los Altos, CA: William Kaufmann, p.216.

  37. Официальный сайт Adobe. Object-oriented programming concepts: Objects and classes. URL:[http://www.adobe.com/devnet/actionscript/learning/oop-concepts/objects-and-classes.html]

  38. НОУ «Интуит» Лекция 6: Введение в объектно-ориентированное программирование. [http://www.intuit.ru/studies/courses/15889/484/lecture/10994]

  39. Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++, Классы и объекты.

  40. НОУ «Интуит» Лекция 14: Иерархия классов. URL:[http://www.intuit.ru/studies/courses/486/342/lecture/8244]

  41. НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем URL:[ http://www.intuit.ru/EDI/25_12_15_1/1450995683-14467/tutorial/92/objects/1/files/1-1.gif]

  42. НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. URL: [ http://www.intuit.ru/studies/courses/32/32/lecture/1000].

  43. НОУ «Интуит». Лекция 1: Современные технологии объектно-ориентированного анализа и проектирования информационных систем. [ http://www.intuit.ru/studies/courses/32/32/lecture/1000]

  44. Гради Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++.

  45. Жоголев Е.А. Лекции по технологии программирования: Учебное пособие. М.: Издательский отдел факультета ВМиК МГУ, 2001

  46. Что такое компонентно-ориентированное программирование (краткая справка) (рус.). Архивировано из первоисточника на WebCite 13 февраля 2012 года. URL: [http://www.inr.ac.ru/~info21/info/qtocop.htm]

  47. НОУ Интуит Лекция 12: Компонентные технологии и разработка распределенного ПО.URL:[ http://www.intuit.ru/studies/courses/64/64/lecture/1888]

  48. Официальная документация по технологиям Java. URL:[http://www.oracle.com/technetwork/java/index.html]

  49. Benjamin C. Pierce. Types and Programming Languages. — MIT Press, 2002-01-01

  50. НОУ «Интуит» Лекция 12: Компонентные технологии и разработка распределенного ПО.URL:[ http://www.intuit.ru/studies/courses/64/64/lecture/1888]

  51. Что такое компонентно-ориентированное программирование (краткая справка) (рус.). Архивировано из первоисточника на WebCite 13 февраля 2012 года. URL: [http://www.inr.ac.ru/~info21/info/qtocop.htm]

  52. НОУ «Интуит» Лекция 12: Компонентные технологии и разработка распределенного ПО.

  53. Иан Грэхем. Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. — 3-е изд. — М.: «Вильямс», 2004. — С. 880.

  54. Знакомство с прототипным объектно-ориентированным программированием. Официальный сайт IBM. URL: [https://www.ibm.com/developerworks/ru/library/wa-protoop/]

  55. Zakas N. ECMAScript // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009.

  56. Cardelli, Luca (1996). "Bad Engineering Properties of Object-Oriented Languages".

  57. Armstrong, Joe. In Coders at Work: Reflections on the Craft of Programming.

  58. Potok, Thomas; Mladen Vouk; Andy Rindos (1999). "Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment"

  59. C. J. Date, Hugh Darwen. Foundation for Future Database Systems: The Third Manifesto (2nd Edition)

  60. Stepanov, Alexander. "STLport: An Interview with A. Stepanov".

  61. Graham, Paul. "Why ARC isn't especially Object-Oriented."

  62. Stevey's Blog Rants. Execution in the Kingdom of Nouns

  63. Rich Hickey, JVM Languages Summit 2009 keynote, Are We There Yet?

  64. Pike, Rob "Less is exponentially more".

  65. Pike, Rob. "A few years ago I saw this page".

  66. Eric S. Raymond (2003). "The Art of Unix Programming: Unix and Object-Oriented Languages".

  67. EWD 1175: The strengths of the academic enterprise

  68. EWD 1175: The strengths of the academic enterprise. The University of Texas in Austin. Department of Computer Science. URL: [http://www.cs.utexas.edu/users/EWD/transcriptions/EWD11xx/EWD1175.html]

  69. Патрик Киллелиа. «Тюнинг веб-сервера».

  70. «No Silver Bullet. Essence and Accidents of Software Engineering» (Computer Magazine; April 1987)

  71. Benjamin C. Pierce. Types and Programming Languages. — MIT Press, 2002-01-01

  72. Javarevisited. Where is Java used in Real World? URL: [http://javarevisited.blogspot.bg/2014/12/where-does-java-used-in-real-world.html]

  73. Официальный сайт Raspberry Pi URL: [https://www.raspberrypi.org/documentation/usage/python/]

  74. Using Python Program Control GPIOs URL:[http://docs.cubieboard.org/tutorials/common/using_python_program_control_gpios]

  75. About Astropy. [http://www.astropy.org/]

  76. Л. А. Наумов, А. А. Шалыто. Искусство программирования лифта. Объектно-

    ориентированное программирование с явным выделением

    состояний

  77. Л. А. Наумов, А. А. Шалыто. Искусство программирования лифта. Объектно-

    ориентированное программирование с явным выделением

    состояний

  78. “Civilization IV Official Press Sheet". IGN. 31 May 2005. 620531p1.” URL: [http://pc.gamespy.com/pc/civilization-iv/662218p1.html]

  79. “GUI в игре World of Tanks. Часть вторая: обзор структуры GUI и планы на будущее” Хабрахабр. URL: [https://habrahabr.ru/company/wargaming/blog/229261/]