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

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

Содержание:

ВВЕДЕНИЕ

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

Термин «информационные технологии» или просто известный как ИТ - это общее название, данное всем улучшениям, которые происходят в нашем мире из-за взаимосвязанного прогресса в области технологий, обучения и информации. Этот термин относится к новейшим технологическим достижениям, которые происходят в нашем мире благодаря лучшим технологиям.

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

Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

Цель данной работы исследование истории и развития объектно-ориентированного программирования. Соответственно объектом исследования является методология ООП.

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

В рамках курсового проекта должны быть решены следующие задачи:

  • проанализировать понятие «программирование» и историю его развития;
  • провести анализ различных методологий программирования;
  • изучить историю появления и развития объектно-ориентированного программирования;
  • выделить ключевые особенности ООП.

Для решения выше перечисленных вопросов была изучена соответствующая литература. В конце работы приведен перечень используемой литературы.

1. Анализ предметной области

1.1 История появления и развития программирования

Одной из самых революционных идей, приведших к созданию автоматических цифровых вычислительных машин, была высказанная в 20-х годах 19 века Чарльзом Бебиджем мысль о предварительной записи порядка действия машины для последующей автоматической реализации вычислений – программе. И, хотя использованная Бебиджем запись программы на перфокартах, придуманная для управления такими станками французским изобретателем Жозефом Мари Жаккаром, технически не имеет ничего общего с современными приемами хранения программ в ПК, принцип здесь по существу один. [22]

С этого момента начинается история программирования. Аду Левлейс, современницу Бебиджа, называют первым в мире программистом. Она теоретически разработала некоторые приемы управления последовательностью вычислений, которые используются в программировании и сейчас. Ею же была описана и одна из важнейших конструкций практически любого современного языка программирования – цикл.

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

Система кодирования, предложенная им, вдохновила одну из его сотрудниц Грейс Мюррей Хоппер. При работе на компьютере «Марк-1» ей и ее группе пришлось столкнуться со многими проблемами и все, что ими придумано, было впервые. В частности, они придумали подпрограммы. И еще одно фундаментальное понятие техники программирования впервые ввели Хоппер и ее группа – «отладка». [4, 11]

В конце 40-х годов Дж. Моучли создал систему под названием «Short Code», которая являлась примитивным языком программирования высокого уровня. В ней программист записывал решаемую задачу в виде математических формул, а затем, используя специальную таблицу, переводил символ за символом, преобразовывал эти формулы в двухлитерные коды. В дальнейшем специальная программа компьютера превращала эти коды в двоичный машинный код. Система, разработанная Дж. Моучли, считается одним из первых примитивных интерпретаторов.

Уже в 1951 г. Хоппер создала первый в мире компилятор и ею же был введен сам этот термин. Компилятор Хоппер осуществлял функцию объединения команд и в ходе трансляции производил организацию подпрограмм, выделение памяти компьютера, преобразование команд высокого уровня (в то время псевдокодов) в машинные команды. «Подпрограммы находятся в библиотеке (компьютера), а когда вы подбираете материал из библиотеки – это называется компиляцией» – так она объясняла происхождение введенного ею термина. [4, 8]

В 1954 году группа под руководством Г. Хоппер разработала систему, включающую язык программирования и компилятор, которая в дальнейшем получила название Math-Matic. После удачного завершения работ по созданию Math-Matic Хоппер и ее группа принялись за разработку нового языка и компилятора, который позволил бы пользователями программировать на языке, близком к обычному английскому. В 1958 г. появился компилятор Flow-Matic. Компилятор Flow-Matic был первым языком для задач обработки коммерческих данных. [22]

Разработки в этом направлении привели к созданию языка Кобол (COBOL – Common Business Oriented Language). Он был создан в 1960 году. В этом языке по сравнению с Фортраном и Алголом, слабее развиты математические средства, но зато хорошо развиты средства обработки текстов, организация вывода данных в форме требуемого документа. Он задумывался как основной язык для массовой обработки данных в сферах управления и бизнеса.

Середина 50-х годов характеризуется стремительным прогрессом в области программирования. Роль программирования в машинных командах стала уменьшаться. Стали появляться языки программирования нового типа, выступающие в роли посредника между машинами и программистами. Первым и одним из наиболее распространенных был Фортран (FORTRAN, от FORmula TRANslator – переводчик формул), разработанный группой программистов фирмы IBM в 1954 году (первая версия). Этот язык был ориентирован на научно-технические расчеты математического характера и является классическим языком программирования при решении на ПК математических и инженерных задач. [1, 22]

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

Особое место среди языков программирования занимает Алгол, первая версия которого появилась в 1958 году. Одним из разработчиков Алгола был «отец» Фортрана Джон Бэкус. Название языка ALGOrithmic Language подчеркивает то обстоятельство, что он предназначен для записи алгоритмов. Благодаря четкой логической структуре Алгол стал стандартным средством записи алгоритмов в научной и технической литературе. [6]

В середине 60-х годов Томас Курц и Джон Камени (сотрудники математического факультета Дартмунтского колледжа) создали специализированный язык программирования, который состоял из простых слов английского языка. Новый язык назвали «универсальным символическим кодом для начинающих» (Beginner All-Purpose Symbolic Instruction Code, или, сокращенно, BASIC). Годом рождения нового языка можно считать 1964. Сегодня универсальный язык Бейсик (имеющий множество версий) приобрел большую популярность и получил широкое распространение среди пользователей ПК различных категорий во всем мире. В значительно мере этому способствовало то, что Бейсик начали использовать как встроенный язык персональных компьютеров, широкое распространение которых началось в конце 70-х годов. Однако Бейсик неструктурный язык, и поэтому он плохо подходит для обучения качественному программированию. Справедливости ради следует заметить, что последние версии Бейсика для ПК (например, QBasic) стали более структурными и по своим изобразительным возможностям приближаются к таким языкам, как Паскаль.

Разработчики ориентировали языки на разные классы задач, в той или иной мере привязывали их к конкретной архитектуре ПК, реализовывали личные вкусы и идеи. В 60-е годы были предприняты попытки преодолеть эту «разноголосицу» путем создания универсального языка программирования. Первым детищем этого направления стал PL/1 (Programm Language One), разработанный фирмой IBM в 1967 году. Этот язык претендовал на возможность решать любые задачи: вычислительные, обработки текстов, накопления и поиска информации. Однако он оказался слишком сложным, транслятор с него – недостаточно оптимальным и содержал ряд невыявленных ошибок. [1, 22]

Однако линия на универсализацию языков была поддержана. Старые языки были модернизированы в универсальные варианты: Алгол-68 (1968 г.), Фортран-77. Предполагалось, что подобные языки будут развиваться и усовершенствоваться, станут вытеснять все остальные. Однако ни одна из этих попыток не увенчалась успехом.

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

Пролог разработан во Франции в 1972 году для решения проблем «искусственного интеллекта». Пролог позволяет в формальном виде описывать различные утверждения, логику рассуждений и заставляет ПК давать ответы на заданные вопросы. [22]

Значительным событием в истории языков программирования стало создание в 1971 году языка Паскаль. Его автор – швейцарский ученый Никлаус Вирт. Вирт назвал его в честь великого французского математика и религиозного философа XVII века Блеза Паскаля, который изобрел первое суммирующее устройство, именно поэтому новому языку было присвоено его имя. Этот язык первоначально разрабатывался как учебный язык структурного программирования, и, действительно, сейчас он является одним из основных языков обучения программированию в школах и вузах.

В 1975 году два события стали вехами в истории программирования – Билл Гейтс и Пол Аллен заявили о себе, разработав свою версию Бейсика, а Вирт и Йенсен выпустили классическое описание языка «Pascal User Manual and Report».

Не менее впечатляющей, в том числе и финансовой, удачи добился Филип Кан, француз, разработавший в 1983 году систему Турбо-Паскаль. Суть его идеи состояла в объединении последовательных этапов обработки программы – компиляции, редактирования связей, отладки и диагностики ошибок – в едином интерфейсе. Турбо-Паскаль – это не только язык и транслятор с него, но еще и операционная оболочка, позволяющая пользователю удобно работать на Паскале. Этот язык вышел за рамки учебного предназначения и стал языком профессионального программирования с универсальными возможностями. В силу названных достоинств Паскаль стал источником многих современных языков программирования. С тех пор появилось несколько версий Турбо-Паскаля, последняя – седьмая. [4, 9]

Фирма Borland/Inprise завершила линию продуктов Турбо-Паскаль и перешла к выпуску системы визуальной разработки для Windows – Delphi.

Большой отпечаток на современное программирование наложил язык Си (первая версия – 1972 год), являющийся очень популярным в середе разработчиков систем программного обеспечения (включая операционные системы). Этот язык создавался как инструментальный язык для разработки операционных систем, трансляторов, баз данных и других системных и прикладных программ. Си сочетает в себе как черты языка высокого уровня, так и машинно-ориентированного языка, допуская программиста ко всем машинным ресурсам, чего не обеспечивают такие языки как Бейсик и Паскаль.

Период с конца 60-х до начала 80-х годов характеризуется бурным ростом числа различных языков программирования, сопровождавшим кризис программного обеспечения. В январе 1975 года Пентагон решил навести порядок в хаосе трансляторов и учредил комитет, которому было предписано разработать один универсальный язык. В мае 1979 года был объявлен победитель – группа ученых во главе с Жаном Ихбиа. Победивший язык окрестили Ада, в честь Огасты Ады Левлейс. Этот язык предназначен для создания и длительного (многолетнего) сопровождения больших программных систем, допускает возможность параллельной обработки, управления процессами в реальном времени. [4, 12]

В течение многих лет программное обеспечение строилось на основе операционных и процедурных языков, таких как Фортран, Бейсик, Паскаль, Ада, Си. По мере эволюции языков программирования получили широкое распространение и другие, принципиально иные, подходы к созданию программ.

1.2 Методологии программирования

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

Управление потоком в императивном программировании является явным: команды показывают, как вычисление происходит, шаг за шагом.

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

Вычисления выполняются с помощью последовательности шагов, в которой эти переменные упоминаются или изменяются. Порядок шагов имеет решающее значение, поскольку данный шаг будет иметь разные последствия в зависимости от текущих значений переменных при выполнении шага. [1, 7, 17]

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

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

Преимущества императивного подхода:

  • эффективность;
  • близость к «железу»;
  • популярность;
  • знаком программистам.

Недостатки императивного подхода:

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

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

Логическая программа разделена на три раздела:

  1. ряд определений/деклараций, определяющих проблемную область;
  2. заявления соответствующих фактов;
  3. постановка целей в форме запроса.

Возвращается любое выводимое решение для запроса. Определения и декларации строятся целиком из отношений. т.е. X является членом Y или X находится внутри между a и b, и т. д. [6, 10]

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

  • система решает проблему, поэтому само программирование сводятся к минимуму;
  • доказательство действительности разработанных на нём программ является простым.

В целом, классификация языков показана на рисунке 1.

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

Рисунок 1 — Классификация языков программирования

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

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

Имеются следующие преимущества функционального программирования:

  1. Высокий уровень абстракции, особенно когда используются чистые функции, которые исключают многие нюансы программирования и, таким образом, устраняют возможность совершения многих классов ошибок;
  2. Отсутствие зависимости от операций присваивания. Эта независимость в отношении оценки делает функционально-ориентированные языки хорошими кандидатами для программирования параллельных компьютерных систем;
  3. Отсутствие операций присваивания делает функционально-ориентированные программы гораздо более пригодными для математического доказательства и анализа, чем настольные программы, поскольку функциональные программы обладают ссылочной прозрачностью. [12, 20]

К недостаткам можно отнести следующие:

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

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

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

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

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

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

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

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

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

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

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

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

2. Методология объектно-ориентированного программирования

2.1 Понятие «объектно-ориентированное программирование»

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

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

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

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

  1. Концепция класса данных позволяет определять подклассы объектов данных, которые разделяют некоторые или все характеристики основного класса. Это свойство ООП, называемое наследованием, требует более тщательного анализа данных, сокращает время разработки и обеспечивает более точное кодирование.
  2. Поскольку класс определяет только те данные, с которыми он должен иметь дело, при запуске экземпляра этого класса (объекта) код не сможет случайно получить доступ к другим программным данным. Эта характеристика сокрытия данных обеспечивает большую безопасность системы и предотвращает непреднамеренное повреждение данных.
  3. Определение класса может использоваться повторно не только программой, для которой он изначально создан, но также и другими объектно-ориентированными программами (и по этой причине может быть более легко распространено для использования в сетях).
  4. Концепция классов данных позволяет программисту создавать любой новый тип данных, который еще не определен в самом языке.

2.2 История появления ООП

Основа для ООП началась в начале 1960-х годов. Прорыв, связанный с экземплярами и объектами, был достигнут в MIT с помощью PDP-1, и первым языком программирования, который использовал объекты, был Simula 67. Он был разработан с целью создания симуляций и был разработан Кристеном Найгаардом и Оле-Йоханом Далем в Норвегия. [18]

Simula, как уже было сказано выше, была первым объектно-ориентированным языком программирования. Java, Python, C++, Visual Basic .NET и Ruby являются самыми популярными ООП языками. Язык программирования Java разработан специально для использования в распределенных приложениях в корпоративных сетях и Интернете. Ruby используется во многих веб-приложениях. Curl, Smalltalk, Delphi и Eiffel также являются примерами объектно-ориентированных языков программирования.

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

Термин «объектно-ориентированное программирование» впервые был использован Xerox PARC в их языке программирования Smalltalk. Термин использовался для обозначения процесса использования объектов в качестве основы для вычислений. Команда Smalltalk была вдохновлена ​​проектом Simula 67, но они разработали Smalltalk так, чтобы он был динамичным. Объекты можно изменять, создавать или удалять, и это отличает его от обычно используемых статических систем. Smalltalk также был первым языком программирования, который представил концепцию наследования. Именно эта особенность позволила Smalltalk превзойти Simula 67 и аналоговые системы программирования. Хотя эти системы были усовершенствованы для своего времени, они не использовали концепцию наследования. [19]

Simula 67 была новаторской системой, которая вдохновила большое количество других языков программирования, и некоторые из них включают Pascal и Lisp. К 1980-м годам объектно-ориентированное программирование стало заметным, и основным фактором в этом является C++. Объектно-ориентированное программирование также было важно для разработки графических пользовательских интерфейсов. Структура Какао, существующая в Mac OS X, является хорошим примером динамического графического интерфейса пользователя, который работает с объектно-ориентированным языком программирования. Эта парадигма программирования также сыграла важную роль в развитии событийного программирования.

Никлаус Вирт и его сотрудники искали такие области, как модульное программирование и абстракция данных, и разработали две системы, которые включали эти элементы. Этими двумя системами являются Оберон и Модула-2. Оберон использовал уникальный подход к классам и объектной ориентации, который сильно отличается от C++ или Smalltalk. Со времени введения ООП большое количество современных языков программирования в настоящее время используют эту концепцию. Некоторые из них это Fortran, BASIC и Pascal. Были некоторые проблемы совместимости, потому что многие программы не были разработаны с учетом подхода ООП. В «объектно-ориентированных» языках программирования, которые были «чистыми», не было многих функций, которые требовались программистам.

Чтобы решить эти проблемы, ряд исследователей пытались разработать новые языки программирования, которые использовали бы объектно-ориентированные концепции, но при этом сохранили многие функции, которые были необходимы программистам. Одним из примеров языка программирования, который в какой-то степени достиг этого, является Eiffel. Другим языком программирования, который пытался решить эту проблему, является Java. Она стала популярной, потому что она использует виртуальную машину, и она очень похожа на C++ и C. Виртуальная машина важна, потому что она позволяет запускать код на нескольких платформах без необходимости изменения. Другая похожая система — это Microsoft .NET. Многие разработчики теперь понимают важность ООП и активно используют его в своих программах. Многие исследователи продолжают делать успехи, используя объектно-ориентированный подход.

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

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

2.3 Эволюция методологии и сферы применения

Сегодня существует достаточное количество объектно-ориентированных языков программирования, наиболее популярными из которых в настоящее время являются C++, Delphi, Java, Visual Basic, Flash. Но, кроме того, многие языки, которые принято причислять к процедурной парадигме, тоже обладают свойствами ООП, имея возможность работать с объектами. Так, объектно-ориентированное программирование в C — это большой раздел программирования на данном языке, то же самое касается ООП в python и многих других структурных языках.

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

Противоречие было разрешено в C++ с помощью принципа гомогенности. C + был создан на основе С. Таким образом осуществился следующий этап развития ООП. Этот язык был создан Б.Страуструпом в 1983 году. [14]

C++ предоставляет набор интегрированных классов и возможность объявлять новые типы разработчиками. Классы могут наследовать один или несколько классов, обеспечивая одинаковое и многократное наследование, соответственно. В C++ есть возможность описания параметризованных классов и функций (шаблонов) и возможность описания исключений. Но также есть ряд противоречий в C++. Использование множественного наследования порождает проблемы, связанные с неопределенностью выбора между методами, имея такие же имена, из чистых классов. Например, мы вызываем метод Show() для объекта, и такой же метод в классе, но есть такие методы в родительских классах. Таким образом, возникает противоречие, которое ранее было не так-то просто решить. Из-за отсутствия идентификации между конструкциями начала и конца читаемость программного кода снижается, т.е. с увеличением количества программного кода читабельность кода недопустимо уменьшается. Следствием того факта, что C++ на тот момент не имел собственных библиотека и развивался долгое время изолированно. Но после, его развитию, как-раз послужило именно наличие большого количества библиотек для выполнения одних и тех же операций. Однако иногда трудно найти хорошую библиотеку для какой-то цели, т.е. с увеличением количества внешних библиотек эффективность ее использование уменьшается. На эйфелевом языке с использованием принципа предварительного действия были введены специальные операторы. Они помогают объявлять правила выбора методов при использовании множественного наследования. [17]

Определенные противоречия C++ были разрешены в Python. Используя некоторые принципы и предварительные действия в язык добавлен алгоритм линеаризации суперкласса. Алгоритм устанавливает порядок методов и выбор, когда мы используем наследование. В то же время, есть возможность переопределить этот вариант путем переопределения. Использование принципов извлечения и однородность некоторых синтаксических конструкций были исключены, в частности конструкции, обозначенные начало и конец процедуры.

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

В Java, использующей принцип частичных или чрезмерных действий, была добавлена ​​возможность объявления интерфейса (интерфейс определяет методы и атрибуты, которые должны реализовывать реализующие классы). Это решение позволяет получение многих преимуществ множественного наследования без полной реализации. В Java использовался принцип выведения множества небезопасных и узконаправленных функций C++ в то же время, используя принцип однородности Java синтаксиса из C++, который сокращает время для освоения языка. В Delphi, используется принцип предварительного действия таблицы виртуальных методов (VMT), завершающейся перед конструктором. Это позволяет исключить проблемы, связанные с вызовом виртуальных методов, таких как в C ++. [19]

В Perl 6 с использованием принципа универсальности был добавлен новый механизм — роли (черты). Роль позволяет моделировать как поведение интерфейса, указывающее необходимые для роли методы и атрибуты (спецификация) как методы реализация внутри роли. Это помогает использовать один раз написанный код многократно.

В C# основаны принципы самообслуживания и частичных или чрезмерных действий. Этот язык пытается скрыть как можно больше технических подробностей от разработчика программы, включая все управление. Благодаря этому, программист, используя C#, может сосредоточиться на содержании проблемы лучше, чем на реализации. В то же время разработчик может управлять памятью в режиме «небезопасного» кода, если это необходимо. Также, используя этот принцип заранее добавлена ​​возможность смягчения указывания имени интерфейса для методов с похожими именами, и объявление различных реализаций для этих методов.

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

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

Таким образом, были следующие этапы в эволюции ООП:

Первый этап. Базовый язык Simula-67, наследник языка - Smalltalk и C++, который является основой для следующего этап. [20]

Второй этап Базовый язык C++, наследственные языки Eiffel (одновременно является наследником Simula-67), Python, Delphi, Java, который является основой для следующего этапа.

Третий этап. Базовый язык Java, наследственные языки - Perl 6, PHP, C#, Scala.

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

С 1990-х гг. ООП развивается как методологическое основание технологий программирования, ориентированных на значительное повышение производительности совместных разработок коллективами программистов. Непрерывно растёт область применения ООП, прирастает семейство языков, совершенствуются системы программирования, увеличивается число программных продуктов различного назначения, разработанных на языках ООП.

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

3. Основные принципы ООП

3.1 Абстракция

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

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

Рисунок 2 — Пример абстракции

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

Абстракция данных — популярная и в общем неверно определяемая техника программирования. Фундаментальная идея состоит в разделении несущественных деталей реализации подпрограммы и характеристик существенных для корректного ее использования. Такое разделение может быть выражено через специальный «интерфейс», сосредотачивающий описание всех возможных применений программы. [17]

3.2 Инкапсуляция

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

Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public.

Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.

Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием).

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

  • предельная локализация изменений при необходимости таких изменений,
  • прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений. [17]

3.3 Наследование

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

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

Простое наследование: класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). [16]

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

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя. [5]

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

Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

3.4 Полиморфизм

Полиморфизм — возможность объектов с одинаковой спецификацией иметь различную реализацию.

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

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

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

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

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

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

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

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

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

Полиморфизм-перегрузка — это частный случай полиморфизма.

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

ЗАКЛЮЧЕНИЕ

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

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

В рамках проекта были решены следующие задачи:

  • проанализировать понятие «программирование» и историю его развития;
  • провести анализ различных методологий программирования;
  • изучить историю появления и развития объектно-ориентированного программирования;
  • выделить ключевые особенности ООП.

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

  1. Буч Гради Объектно-ориентированное проектирование с примерами применения. — Конкорд, 2014. — 519 с.
  2. Васильев А. Java. Объектно-ориентированное программирование. — Питер, 2013. — 397 с.
  3. Дейтел Пол, Дейтел Харви С для программистов с введением в С11. — ДМК Пресс, 2013. — 546 с.
  4. Джеймс Рамбо, М. Блаха UML 2.0. Объектно-ориентированное моделирование и разработка. — Питер, 2005. — 545 с.
  5. Дронов В. HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. — БХВ-Петербург, 2013. — 408 с.
  6. Колисниченко Д. PHP и MySQL. Разработка веб-приложений. — БХВ-Петербург, 2015. — 573 с.
  7. Крейг Уоллс Spring в действии. — ДМК Пресс, 2013. — 754 с.
  8. Магда Ю. Программирование и отладка C/C++ приложений для микроконтроллеров ARM. — ДМК Пресс, 2012. — 170 с.
  9. Мартин Роберт Идеальный программист. Как стать профессионалом разработки ПО. — Питер, 2011. — 240 с.
  10. Павловская Т. А. C/C++. Процедурное и объектно-ориентированное программирование. Учебник для вузов. — Питер, 2015. — 496 с.
  11. Пьюривал С. Основы разработки веб-приложений. — Питер, 2015. — 272 с. Хабибуллин И. Самоучитель Java (3-е издание). — БХВ-Петербург, 2008. — 759 с.
  12. Ральф Джонсон, Джон Влиссидес, Ричард Хелм, Эрих Гамма Приемы объектно-ориентированного проектирования. Паттерны проектирования. — Питер, 1995. — 368 с.
  13. Симдянов И. Кузнецов М. Объектно-ориентированное программирование на PHP. — БХВ-Петербург, 2008. — 606 с.
  14. Bob Bryla, Kevin Loney. Oracle Database 12c The Complete Reference (Oracle Press) 1st Edition. — McGraw-Hill Education, 2013. — 1472 p.
  15. Herbert Schildt Java: A Beginner's Guide, Seventh Edition. — McGraw-Hill Education, 2017. — 752 p.
  16. Joshua Bloch Effective Java. — Addison-Wesley Professional, 2018. — 412 p.
  17. Joyce Farrell Java Programming. — Cengage Learning, 2015. — 976 p.
  18. Stroustrup Bjarne The Design and Evolution of C++. — Addison-Wesley, 2015. — 462 p.
  19. Tony Gaddis Starting Out with C++ from Control Structures to Objects. — Pearson, 2017. — 1344 p.
  20. Paul Barry Head First Python: A Brain-Friendly Guide. — O'Reilly Media, 2016. — 624 p.
  21. Jessica Miller, Victoria Kirst, Marty Stepp Web Programming Step by Step. — Step by Step Publishing, 2012. — 668 p.
  22. GcUp.ru [Электронный ресурс] История создания и эволюции языков программирования. Режим доступа: https://gcup.ru/publ/programming/istorija_sozdanija_i_ehvoljucii_jazykov_programmirovanija/8-1-0-539 Дата обращения (01.02.2019)
  23. Большая Российская энциклопедия [Электронный ресурс] Объектно-ориентированное программирование Режим доступа: https://bigenc.ru/technology_and_technique/text/3958439 Дата обращения (01.02.2019)
  24. Справочник Java [Электронный ресурс] Подробнее о технологии Java Режим доступа: http://www.java.com/ru/about/ Дата обращения (01.02.2019)