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

Основные понятия объектно-ориентированного программирования (История создания объектно-ориентированного программирования)

Содержание:

ВВЕДЕНИЕ

Почему задуманный проект при расширении столь быстро может превратиться в кучу запутанного кода с тучей багов? Дело в том, что новички пишут код, который делает только то, что от него требуется в одной конкретной ситуации и не предусматривает внесение каких-либо изменений. Такой подход не приемлем, особенно для веб-приложений, которые неизбежно должны будут расти и развиваться если, конечно, будут популярны. Рано или поздно им, а может и другим разработчикам, будет необходимо возвращаться к написанному ранее коду и вносить в него изменения и чем проще это будет сделать, тем быстрее приложение будет развиваться и набирать популярность.

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

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

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

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

Объектная декомпозиция имеет несколько преимуществ перед алгоритмической:

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

Объект исследований – объектно-ориентированное программирование.

Предмет исследований - изучение основных методов и определений объектно-ориентированного программирования.

Цель работы – получить знания по данной теме.

Для достижения цели необходимо решить следующие задачи:

1. Исследовать предметную область.

2. На основании теоретического анализа изучения проблемы, собрать требуемые данные по указанной теме.

3. Систематизировать и обобщить существующие в специальной литературе, научные подходы к данной проблеме.

Теоретическая значимость проведенного исследования состоит в обобщении научного знания по данной проблеме.

Практическая значимость работы выражается в получении навыков и умения программирования.

Успешность выполнения задач по написанию работы в наибольшей степени зависит от выбранных методов исследования.

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

Из всего многообразия литературы считаю наиболее приемлемыми для себя и работы следующих авторов Гагарина Л. Г. , Ездаков А. Л. , Карпенков С. Х. , Колдаев В. Д. , Кудинов Ю. И. , Лазарева И. М., Малявко А. А., Орлов С. А., Тузовский А. Ф. , Федорова Г. Н. , Черпаков И. В.

Структура курсовой работы состоит из введения, трех глав, заключения и списка литературы.

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

Концепция объектно-ориентированного программирования (ООП) появилась более сорока лет назад, как развитие идей процедурного программирования. Идеология процедурного программирования, на мой взгляд, ничего особенного собой не представляет: все программы представлены набором процедур и функций, в то время как сами процедуры и функции – это последовательности операторов, выполняя которые компьютер модифицирует значения переменных в памяти.

ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны[1]. Для дальнейшего развития объектно-ориентированного программирования большое значение имели понятия события (в рамках событийно-ориентированного программирования) и компонента (в контексте компонентного программирования)[2].

Практически сразу после появления языков третьего поколения (1967 г.) ведущие специалисты в области программирования выдвинули идею преобразования постулата фон Неймана: «данные и программы неразличимы в памяти машины». Их цель заключалась в максимальном сближении данных и программы. Решая поставленную задачу, они столкнулись с задачей, решить которую без декомпозиции оказалось невозможно, а традиционные структурные декомпозиции не сильно упрощали задачу[3]. Усилия многих программистов и системных аналитиков, направленные на формализацию подхода, увенчались успехом.

Были разработаны три основополагающих принципа того, что потом стало называться объектно-ориентированным программированием (ООП):

- наследование;

- инкапсуляция;

- полиморфизм.

Результатом их первого применения стал язык Симула-1 (Simula-1), в котором был введен новый тип – объект. В описании этого типа одновременно указывались данные (поля) и процедуры, их обрабатывающие – методы. Родственные объекты объединялись в классы, описания которых оформлялись в виде блоков программы. При этом класс можно использовать в качестве префикса к другим классам, которые становятся в этом случае подклассами первого.

Впоследствии Симула-1 был обобщен, и появился первый универсальный ООП-ориентированный язык программирования – Симула-67 (67 – по году создания)[4].

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

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

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

2.1. Основные понятия объектно-ориентированного программирования

ООП является весьма популярной парадигмой программирования, которая заменила устаревший процедурный подход в программировании[6].

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

Класс - это тип, определяемый программистом, в котором объединяются структуры данных и функции их обработки. Конкретные переменные типа данных «класс» называются экземплярами класса, или объектами[7].

Класс содержит константы и переменные, называемые полями, а также выполняемые над ними операции и функции[8]. Функции класса называются методами (другое название — функции-члены). Предполагается, что доступ к полям класса возможен только через вызов соответствующих методов. Поля и методы являются элементами (членами) класса.

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

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

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

. В качестве примера рассмотрим класс Human:

class Human {

private $words;

public function setWords($words) {

$this->words = $words;

}

public function getWords() {

return $this->words;

}

public function sayIt() {

return $this->getWords();

}

}

Здесь все достаточно просто. Human является именем класса, $words представляет собой переменную (поле), ну а setWords, getWords(), sayIt(), являются методами.

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

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

Некоторые элементы современного объектно-ориентированного программирования

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

События. Специальный вид объектов, создаваемый для оповещения одних объектов о событиях, происходящих с другими объектами. В разных языках программирования механизм событий реализуется по-разному: где-то с помощью специальных синтаксических конструкции, а где-то силами базовых средств ООП[14].

Универсальный тип. Концепция универсальных типов не связана непосредственно с концепцией ООП, но она является причиной появление таких элементов, как универсальный класс, универсальный метод, универсальное событие и т.д. Универсальный тип – это тип, параметризованный другим типом (набором типов)[15]. Кем является этот тип-параметр в контексте проектирования универсального типа неизвестно, хотя есть возможность ограничить значения типов-параметров, заставив их быть производными от конкретного класса или реализовывать определенные интерфейсы. В качестве примера можно привести универсальный класс сортировки последовательности элементов, где тип элемента в последовательности заранее неизвестен. При проектировании такого класса важно указать, что тип-параметр должен поддерживать операцию сравнения[16]. При создании объектов универсальных типов параметр указывается явно, например целочисленный или строковый тип, а сам объект начинает себя вести так, как если бы это был экземпляр класса, созданный специально для сортировки целых чисел или строк[17].

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

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

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

Глава 3. Свойства, достоинства и недостатки ООП

3.1 Основные свойства ООП

Есть сразу 3 основных принципа, которые составляют основу ООП.

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

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

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

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

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

Приведем в качестве примера инкапсуляции следующее:

class Human {

private $words;

private $sex;

public function setSex($sex) {

if($sex == "male") {

$this->sex = "male";

} else if($sex == "female") {

$this->sex = $sex;

} else {

echo "Error. Set only male or female sex";

}

}

public function setWords($words) {

$this->words = $words;

}

public function getWords() {

return $this->words;

}

public function sayIt() {

return $this->getWords();

}

}

$human = new Human();

$human->setSex("male");

$human->setWords("Hi!");

echo $human->sayIt();

Здесь показан Human, в данном классе добавили “sex” (пол), которое сделали приватным - это не позволит внешним пользователям получить к нему доступ.

Вот как будет выглядеть попытка получения доступа к данному поля вне самого класса:

$human->sex = "11"; Fatal error: Cannot access private property Human::$sex

Инкапсуляция является весьма полезным свойством ООП и применяется достаточно не редко. Инкапсуляция является невероятно полезной, если созданием определенного проекта занимается целая группа специалистов[23]. Каждый программист будет работать с определенным классом и методами, при этом, не создавая помех в работе другим специалистам.

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

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

Наследственность в ООП — это его основа. Следует понимать, что потомок — класс, от которого происходят другие классы, наследует свойства предка — класса, который происходит либо порожден из другого класса. Следовательно, потомок всегда «знает», какими он обладает свойствами, а предок не может «знать» свойства своего потомка, поскольку не может «знать» те свойства, которые будут добавлены в новый класс[26]. Данный метод наследования и принят в объектно-ориентированных языках.

Именно наследование дает возможность повторно использовать уже существующий код. С целью применения существующего кода, программист создает новый класс на базе уже существующих классов[27]. В итоге, наследование выполняет две функции: предотвращение дублирования кода, развитие работы в нужном направлении. Отношения между родительскими классами и его потомками именуется термином «Иерархия наследования»[28].

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

Существуют родительские классы с базовым функционалом - при создании нового класса, не потребуется создание новых базовых навыков, он изначально унаследует "базу" родительского класса. Это существенно упрощает работу программистам. Есть слово "extends", которое обозначает наследование.

/* Родительский класс Human */

class Human {

private $name;

/* Конструктор (в нем мы задаем поле $name при создании экземпляра класса) */

public function __construct($name) {

$this->name = $name;

}

/* Метод say(). Предполагаем, что Human изначально может говорить */

public function say() {

echo "Меня зовут ".$this->name." и ";

}

}

/* Класс Мужчина. Ключевым словом extends мы наследуем родителя Human */

class Man extends Human {

public function beard() {

echo "у меня растет борода";

}

}

/* Класс Женщина. Ключевым словом extends мы наследуем родителя Human */

class Women extends Human {

public function bearChildren() {

echo "я рожаю детей";

}

}

/* Создаем экземпляр класса Man и вызываем методы. */

$man = new Man("Sergey");

$man->say();

$man->beard();

/* Создаем экземпляр класса Women и вызываем методы. */

$women = new Women("Maria");

$women->say();

$women->bearChildren();

 Что же мы увидим в результате:

Меня зовут Sergey и у меня растет борода

Меня зовут Maria и я рожаю детей

Если рассматривать созданные классы - они оба обладают базовым набором навыков, но есть свои отличия - "Мужчина" отращивает бороду, "Женщина" рожает ребенка.

Метод под названием __construct - это конструктор класса.

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

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

Касательно средств, которые связаны с возможностью реализации полиморфизма, то следует упомянуть следующие виды методов в ООП:

    1. Статические методы класса включаются в код программы в процессе ее компиляции. Таким образом, до запуска программы уже известно, какая процедура будет вызвана в определенной точке.
    2. Виртуальные методы, которые подключаются к основному коду на этапе выполнения программы и дают возможность определить тип и конкретизировать экземпляр объекта в процессе исполнения, а затем вызвать методы этого объекта. Данный механизм обеспечивает полиморфизм и именуется также поздним связыванием.

Полиморфизм дает возможность создавать множественные определения для операций и функций[32]. Какое именно определение будет использоваться, зависит от контекста программы. ООП предоставляет возможности, связанные с полиморфизмом, такие как: шаблоны функций, перегрузка функций, перегрузка операций, использование виртуальных методов, шаблоны классов[33]. Перегрузка операций позволяет применять для собственных классов те же операции, что используются для встроенных типов C++. Виртуальные методы обеспечивают возможность выбрать на этапе выполнения нужный метод среди одноименных методов базового и производного классов. Шаблоны классов позволяют описать классы, инвариантные относительно типов данных.

Пример полиморфизма:

/* Это интерфейс Say */

interface Say {

public function say();

}

/* Это абстрактный класс Human имплементирующий интерфейс Say */

abstract class Human implements Say{

private $name;

public function __construct($name) {

$this->name = $name;

}

public function getName() {

return $this->name;

}

}

/* Класс Man наследуют класс Human и обязан реализовать метод say() */

class Man extends Human {

public function __construct($name) {

parent::__construct($name);

}

public function beard() {

echo "у меня растет борода";

}

public function say() {

echo "У меня мужской голос, меня зовут ".$this->getName()." и ";

}

}

/* Класс Women наследуют класс Human и обязан реализовать метод say() */

class Women extends Human {

public function __construct($name) {

parent::__construct($name);

}

public function bearChildren() {

echo "я рожаю детей";

}

public function say() {

echo "У меня женский голос, меня зовут ".$this->getName()." и ";

}

}

$man = new Man("Sergey");

$man->say();

$man->beard();

$women = new Women("Maria");

$women->say();

$women->bearChildren();

?>

 Результат:

У меня мужской голос, меня зовут Sergey и у меня растет борода

У меня женский голос, меня зовут Maria и я рожаю детей

В данном примере разная реализация метода say() в классах Man, а также, Women - Это и есть полиморфизм.

Достоинства и недостатки объектно-ориентированного программирования

Перечислим достоинства, которые приобретает программа при использовании объектно-ориентированного подхода к ее проектированию и кодированию.

Инкапсуляция повышает надежность работы программного кода, поскольку гарантирует, что определенные данные не могут быть изменены за пределами содержащего их класса[34].

Наследование – это эффективный способ выделения многократно используемых фрагментов кода, но у него есть и минусы, о которых будет рассказано далее[35].

Собственно, абстрагирование есть следствие наследования: базовые классы не всегда имеют свою проекцию на объекты реального мира, а создаются исключительно с целью выделить общие черты целой группы объектов[36]. К примеру, объект мебель – это базовое понятие для стола, стула и дивана, всех их объединяет то, что это движимое имущество, часть интерьера помещений, и они могут быть выполнены для дома или офиса, а также относиться к “эконом” или “премиум” классу. В ООП есть для этого отдельное понятие абстрактный класс – класс, объекты которого создавать запрещено, но можно использовать в качестве базового класса. Наследование и абстрагирование позволяют описывать структуры данных программы и связи между ними точно так же, как выглядят соответствующие им объекты в рассматриваемой модели предметной области.

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

Интерфейс. В некоторых языках программирования (C#, Java) понятие интерфейса выделено явно - это не только открытые методы и свойства самого класса[37]. Такие языки, как правило, не поддерживают множественного наследования и компенсируют это тем, что любой объект может иметь один базовый объект и реализовывать любое количество интерфейсов. Интерфейс в их интерпретации – это подобие абстрактного класса, содержащего только описание (сигнатуру) открытых методов и свойств. Реализация интерфейса ложится на плечи каждого класса, который собирается его поддерживать[38]. Один и тот же интерфейс могут реализовывать классы абсолютно разных иерархий, что расширяет возможности полиморфизма. К примеру, интерфейс «сохранение/восстановление информации в базе данных» могли бы реализовывать как классы иерархии «мебель», так и классы, связанные с оформлением заказов на изготовление мебели, а при нажатии на кнопку “сохранить” программа бы прошлась по всем объектами, запросила бы у них этот интерфейс и вызвала бы соответствующий метод.

Недостатки объектно-ориентированного программирования

Про то, что популярность объектно-ориентированного подхода к созданию программных продуктов огромна уже было сказано. Много тех, кто стремится расширить эту парадигму довольно много,. Но есть еще один способ выделиться среди огромного сообщества специалистов в информационных технологиях – это заявить, что ООП себя не оправдало, что это не панацея, а, скорее, плацебо[39]. Есть среди этих людей действительно специалисты очень высокого класса, такие как Кристофер Дэйт, Александр Степанов, Эдсгер Дейкстра и другие, и их мнение заслуживает внимания. Вот они, наиболее очевидные недостатки ООП, на которые указывают специалисты:

  1. ООП порождает огромные иерархии классов, что приводит к тому, что функциональность расползается или, как говорят, размывается по базовым и производным членам класса, и отследить логику работы того или иного метода становится сложно.
  2. В некоторых языках все данные являются объектами, в том числе и элементарные типы, а это не может не приводить к дополнительным расходам памяти и процессорного времени.
  3. Также, на скорости выполнения программ может неблагоприятно сказаться реализация полиморфизма, которая основана на механизмах позднего связывания вызова метода с конкретной его реализацией в одном из производных классов.
  4. Психологический аспект. Многие считают, что ООП это круто и начинают использовать его подходы всегда и везде и без разбору. Все это приводит к снижению производительности программ в частности и дискредитации ООП в целом.

ЗАКЛЮЧЕНИЕ

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

К настоящему времени насчитывается более сотни различных объектных и объектно-ориентированных языков.

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

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

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

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

Были указаны недостатки ООП, но при этом весь предыдущий материал объективно свидетельствовал о достоинствах этого подхода.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Гагарина Л. Г. Введение в архитектуру программного обеспечения : учебное пособие : [для студентов, обучающихся по направлениям подготовки 09.03.04 "Программная инженерия" (профиль бакалавриата "Программные технологии распределенной обработки информации"), 09.04.04 "Программная инженерия" (программа магистратуры "Программное обеспечение автоматизированных систем и вычислительных комплексов")] / Л. Г. Гагарина, А. Р. Федоров, П. А. Федоров. - Москва : ФОРУМ : ИНФРА-М, 2017. - 319 с.
  2. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие / А. Л. Ездаков. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. – 118 с.
  3. Карпенков С. Х. Современные средства информационных технологий : [учебное пособие для студентов высших учебных заведений, обучающихся по направлениям подготовки дипломированных специалистов "Информатика и вычислительная техника" и "Информационные системы"] / С. Х. Карпенков. - 2-е изд., испр. и доп. - Москва : КноРус, 2017. – 399 с.
  4. Колдаев В. Д. Основы алгоритмизации и программирования : [учебное пособие для студентов учреждений среднего профессионального образования, обучающихся по группе специальностей 2200 "Информатика и вычислительная техника"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения / В. Д. Колдаев ; под ред. Л. Г. Гагариной. - Москва : ФОРУМ : ИНФРА-М, 2016. - 413 с.
  5. Кудинов Ю. И. Основы современной информатики : [учебное пособие для студентов высших учебных заведений, обучающихся по специальности "Прикладная информатика"] / Ю. И. Кудинов, Ф. Ф. Пащенко. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. - 255 с.
  6. Лазарева И. М. Теория языков программирования и методы трансляции : учебное пособие : [по дисциплине "Теория языков программирования и методы трансляции" по направлению подготовки 01.03.02 "Прикладная математика и информатика: Системное программирование и компьютерные технологии"] / И. М. Лазарева ; М-во образования и науки Рос. Федерации, Мурм. аркт. гос. ун-т. - Мурманск : Мурманский арктический государственный университет, 2018. - 97 с.
  7. Малявко А. А. Формальные языки и компиляторы : учебное пособие для вузов : [для студентов высших учебных заведений, обучающихся по направлению подготовки "Информатика и вычислительная техника"] / А. А. Малявко ; Новосиб. гос. техн. ун-т. - Москва : Юрайт, 2017. - 431 с.
  8. Орлов С. А. Программная инженерия. Технологии разработки программного обеспечения : [учебник для студентов высших учебных заведений, обучающихся по специальности "Программное обеспечение вычислительной техники и автоматизированных систем" направлений подготовки дипломированных специалистов "Информатика и вычислительная техника"] / С. А. Орлов. - 5-е изд., обновл. И доп. - Санкт-Петербург [и др.] : Питер, 2016. - 640 с.
  9. Тузовский А. Ф. Объектно-ориентированное программирование : учебное пособие для прикладного бакалавриата / А. Ф. Тузовский ; Нац. исслед. Том. политехн. ун-т. - Москва : Юрайт, 2016. - 206 с.
  10. Федорова Г. Н. Разработка программных модулей программного обеспечения для компьютерных систем : учебник : [для использования в учебном процессе образовательных организаций, реализующих программы среднего профессионального образования по специальности "Программирование в компьютерных системах"] / Г. Н. Федорова. - Москва : Академия, 2016. – 332 с.
  11. Черпаков И. В. Основы программирования : учебник и практикум для СПО : [для студентов образовательных учреждений среднего профессионального образования] / И. В. Черпаков ; Финансовый ун-т при Правительстве Рос. Федерации, 2017. – 198 с.
  1. Колдаев В. Д. Основы алгоритмизации и программирования : соответствует Федеральному государственному образовательному стандарту 3-го поколения / В. Д. Колдаев ; под ред. Л. Г. Гагариной. - Москва : ФОРУМ : ИНФРА-М, 2016. – С. 28..

  2. Малявко А. А. Формальные языки и компиляторы : учебное пособие для вузов : / А. А. Малявко ; Новосиб. гос. техн. ун-т. - Москва : Юрайт, 2017. – С. 31.

  3. Черпаков И. В. Основы программирования : учебник и практикум для СПО / И. В. Черпаков ; Финансовый ун-т при Правительстве Рос. Федерации. - Москва : Юрайт, 2017. – С. 29.

  4. Орлов С. А. Программная инженерия. Технологии разработки программного обеспечения. - 5-е изд., обновл. И доп. - Санкт-Петербург [и др.] : Питер, 2016. – С. 67.

  5. Кудинов Ю. И. Основы современной информатики / Ю. И. Кудинов, Ф. Ф. Пащенко. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. - С. 41.

  6. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие / А. Л. Ездаков. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. –С. 89.

  7. Черпаков И. В. Основы программирования : учебник и практикум для СПО; Финансовый ун-т при Правительстве Рос. Федерации. - Москва : Юрайт, 2017. – С. 56.

  8. Гагарина Л. Г. Введение в архитектуру программного обеспечения : учебное пособие. - Москва : ФОРУМ : ИНФРА-М, 2017. – С. 112.

  9. Тузовский А. Ф. Объектно-ориентированное программирование : учебное пособие для прикладного бакалавриата / А. Ф. Тузовский ; Нац. исслед. Том. политехн. ун-т. - Москва : Юрайт, 2016. – С. 42.

  10. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. –С. 103.

  11. Гагарина Л. Г. Введение в архитектуру программного обеспечения : учебное пособие : [для студентов, обучающихся по направлениям подготовки 09.03.04 "Программная инженерия" (профиль бакалавриата "Программные технологии распределенной обработки информации"), 09.04.04 "Программная инженерия" (программа магистратуры "Программное обеспечение автоматизированных систем и вычислительных комплексов")]. - Москва : ФОРУМ : ИНФРА-М, 2017. – С. 89.

  12. Орлов С. А. Программная инженерия. Технологии разработки программного обеспечения : [учебник для студентов высших учебных заведений, обучающихся по специальности "Программное обеспечение вычислительной техники и автоматизированных систем" направлений подготовки дипломированных специалистов "Информатика и вычислительная техника"]. - 5-е изд., обновл. И доп. - Санкт-Петербург [и др.] : Питер, 2016. –С. 92.

  13. Лазарева И. М. Теория языков программирования и методы трансляции : учебное пособие : [по дисциплине "Теория языков программирования и методы трансляции" по направлению подготовки 01.03.02 "Прикладная математика и информатика: Системное программирование и компьютерные технологии"] / И. М. Лазарева ; М-во образования и науки Рос. Федерации, Мурм. аркт. гос. ун-т. - Мурманск : Мурманский арктический государственный университет, 2018. – С. 12..

  14. Тузовский А. Ф. Объектно-ориентированное программирование : учебное пособие для прикладного бакалавриата / А. Ф. Тузовский ; Нац. исслед. Том. политехн. ун-т. - Москва : Юрайт, 2016. – С. 124.

  15. Черпаков И. В. Основы программирования : учебник и практикум для СПО : [для студентов образовательных учреждений среднего профессионального образования] / И. В. Черпаков ; Финансовый ун-т при Правительстве Рос. Федерации, 2017. – С. 51.

  16. Малявко А. А. Формальные языки и компиляторы : учебное пособие для вузов : [для студентов высших учебных заведений, обучающихся по направлению подготовки "Информатика и вычислительная техника"] / А. А. Малявко ; Новосиб. гос. техн. ун-т. - Москва : Юрайт, 2017. - 121 с.

  17. Кудинов Ю. И. Основы современной информатики : [учебное пособие для студентов высших учебных заведений, обучающихся по специальности "Прикладная информатика"]. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. – С. 102.

  18. . Ездаков А. Л. Функциональное и логическое программирование : учебное пособие / А. Л. Ездаков. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. – С. 77.

  19. Карпенков С. Х. Современные средства информационных технологий : [учебное пособие для студентов высших учебных заведений, обучающихся по направлениям подготовки дипломированных специалистов "Информатика и вычислительная техника" и "Информационные системы. - 2-е изд., испр. и доп. - Москва : КноРус, 2017. – С. 109.

  20. Карпенков С. Х. Современные средства информационных технологий : [учебное пособие для студентов высших учебных заведений, обучающихся по направлениям подготовки дипломированных специалистов "Информатика и вычислительная техника" и "Информационные системы"]. - 2-е изд., испр. и доп. - Москва : КноРус, 2017. – С. 134.

  21. Колдаев В. Д. Основы алгоритмизации и программирования : [учебное пособие для студентов учреждений среднего профессионального образования, обучающихся по группе специальностей 2200 "Информатика и вычислительная техника"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения ; под ред. Л. Г. Гагариной. - Москва : ФОРУМ : ИНФРА-М, 2016 – С. 131.

  22. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие / А. Л. Ездаков. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. – С. 79.

  23. Колдаев В. Д. Основы алгоритмизации и программирования : [учебное пособие для студентов учреждений среднего профессионального образования, обучающихся по группе специальностей 2200 "Информатика и вычислительная техника"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения / В. Д. Колдаев ; под ред. Л. Г. Гагариной. - Москва : ФОРУМ : ИНФРА-М, 2016 – С. 145.

  24. Гагарина Л. Г. Введение в архитектуру программного обеспечения : учебное пособие : [для студентов, обучающихся по направлениям подготовки 09.03.04 "Программная инженерия" (профиль бакалавриата "Программные технологии распределенной обработки информации"), 09.04.04 "Программная инженерия" (программа магистратуры "Программное обеспечение автоматизированных систем и вычислительных комплексов")] / Л. Г. Гагарина, А. Р. Федоров, П. А. Федоров. - Москва : ФОРУМ : ИНФРА-М, 2017. – С. 78.

  25. Кудинов Ю. И. Основы современной информатики : [учебное пособие для студентов высших учебных заведений, обучающихся по специальности "Прикладная информатика"]. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. – С. 138.

  26. Кудинов Ю. И. Основы современной информатики : [учебное пособие для студентов высших учебных заведений, обучающихся по специальности "Прикладная информатика. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. – С. 167.

  27. Лазарева И. М. Теория языков программирования и методы трансляции : учебное пособие : [по дисциплине "Теория языков программирования и методы трансляции" по направлению подготовки 01.03.02 "Прикладная математика и информатика: Системное программирование и компьютерные технологии"] / И. М. Лазарева ; М-во образования и науки Рос. Федерации, Мурм. аркт. гос. ун-т. - Мурманск : Мурманский арктический государственный университет, 2018. – С. 168.

  28. Орлов С. А. Программная инженерия. Технологии разработки программного обеспечения : [учебник для студентов высших учебных заведений, обучающихся по специальности "Программное обеспечение вычислительной техники и автоматизированных систем" направлений подготовки дипломированных специалистов "Информатика и вычислительная техника"]. - 5-е изд., обновл. И доп. - Санкт-Петербург [и др.] : Питер, 2016. - С. 263.

  29. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. – С. 18.

  30. Малявко А. А. Формальные языки и компиляторы : учебное пособие для вузов : [для студентов высших учебных заведений, обучающихся по направлению подготовки "Информатика и вычислительная техника"] / А. А. Малявко ; Новосиб. гос. техн. ун-т. - Москва : Юрайт, 2017. – С. 211.

  31. Орлов С. А. Программная инженерия. Технологии разработки программного обеспечения : [учебник для студентов высших учебных заведений, обучающихся по специальности "Программное обеспечение вычислительной техники и автоматизированных систем" направлений подготовки дипломированных специалистов "Информатика и вычислительная техника"] / С. А. Орлов. - 5-е изд., обновл. И доп. - Санкт-Петербург [и др.] : Питер, 2016. – С. 138.

  32. Тузовский А. Ф. Объектно-ориентированное программирование : учебное пособие для прикладного бакалавриата / А. Ф. Тузовский ; Нац. исслед. Том. политехн. ун-т. - Москва : Юрайт, 2016. – С. 91.

  33. Колдаев В. Д. Основы алгоритмизации и программирования : [учебное пособие для студентов учреждений среднего профессионального образования, обучающихся по группе специальностей 2200 "Информатика и вычислительная техника"] : соответствует Федеральному государственному образовательному стандарту 3-го поколения; под ред. Л. Г. Гагариной. - Москва : ФОРУМ : ИНФРА-М, 2016. – С. 76.

  34. Кудинов Ю. И. Основы современной информатики : [учебное пособие для студентов высших учебных заведений, обучающихся по специальности "Прикладная информатика"]. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. – С. 93

  35. Ездаков А. Л. Функциональное и логическое программирование : учебное пособие / А. Л. Ездаков. - 2-е изд. - Москва : БИНОМ. Лаборатория знаний, 2017. – С. 83.

  36. Черпаков И. В. Основы программирования : учебник и практикум для СПО : [для студентов образовательных учреждений среднего профессионального образования] / И. В. Черпаков ; Финансовый ун-т при Правительстве Рос. Федерации, 2017. – С. 102.

  37. Малявко А. А. Формальные языки и компиляторы : учебное пособие для вузов : [для студентов высших учебных заведений, обучающихся по направлению подготовки "Информатика и вычислительная техника"] / А. А. Малявко ; Новосиб. гос. техн. ун-т. - Москва : Юрайт, 2017. – 216. с.

  38. Гагарина Л. Г. Введение в архитектуру программного обеспечения : учебное пособие : [для студентов, обучающихся по направлениям подготовки 09.03.04 "Программная инженерия" (профиль бакалавриата "Программные технологии распределенной обработки информации"), 09.04.04 "Программная инженерия" (программа магистратуры "Программное обеспечение автоматизированных систем и вычислительных комплексов")]. - Москва : ФОРУМ : ИНФРА-М, 2017. – C. 127.

  39. Кудинов Ю. И. Основы современной информатики : [учебное пособие для студентов высших учебных заведений, обучающихся по специальности "Прикладная информатика"] / Ю. И. Кудинов, Ф. Ф. Пащенко. - Изд. 3-е, стер. - Санкт-Петербург [и др.] : Лань, 2016. – С. 143.