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

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

Содержание:

ВВЕДЕНИЕ

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

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

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

Исходя, из цели, были поставлены следующие задачи:

  1. Ознакомится с историческими предпосылками создания объектно-ориентированного программирования;
  2. Провести классификацию объектно-ориентированных языков программирования высокого уровня;
  3. Понять сущность методологии объектно-ориентированного программирования;
  4. Ознакомится с основными методами и концепциями объектно-ориентированного программирования;
  5. Изучить синтаксис, и семантика объектно-ориентированных языков программирования;
  6. Проанализировать существующие объектно-ориентированные языки программирования высокого уровня, обозначить сферы их применения;
  7. Разработать и протестировать программное обеспечение с использованием объектно-ориентированного подхода.

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

Информационной базой исследования являются научные публикации отечественных и зарубежных ученых, таких как Павловская, Хорев, Буч, Амааль, Страуструп, Прата, научная информация, имеющая форму непечатных продукции, размещенной во всемирной сети Интернет.

Общий объем работы составляет 36 страниц печатного текста, включает 13 рисунков (схем) и 4 таблицы.

1. ИСТОРИЧЕСКИЕ АСПЕКТЫ ВОЗНИКНОВЕНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

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

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

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

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

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

Чтобы писать все более сложные программы, необходим новый подход к программированию. Теоретические основы объектно-ориентированного программирования были заложены еще в 1970-х годах прошлого столетия, но их практическое внедрение стало возможным только в середине 1980-х годов с появлением соответствующих технических средств. После появления в 1967 году языков третьего поколения ведущие специалисты в области программирования выдвинули идею преобразования постулата фон Неймана: данные и программы неразличимы в памяти машины. Их цель заключалась в максимальном сближении данных и кода программы. Решая поставленную задачу, они столкнулись с задачей, решить которую без декомпозиции оказалось невозможно, а традиционные структурные декомпозиции не сильно упрощали задачу. Усилия многих программистов и системных аналитиков, направленные на формализацию подхода, увенчались успехом [8].

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

Итогом их первого применения стал язык Симула-1 (Simula-1), в котором был введен новый тип - объект. В описании этого типа одновременно указывались данные (поля) и процедуры, их обрабатывающие (методы). Родственные объекты были объединены в классы, описания которых были оформлены в виде программных блоков. В этом случае класс может использоваться как префикс для других классов, которые в этом случае становятся подклассами первого. Впоследствии Симула-1 был обобщен, и в 1967 году появился первый универсальный объектно-ориентированный язык программирования - Симула-67 и использовался для моделирования. На момент его появления в нём были предложены грандиозные идеи: объекты, классы, виртуальные методы. Именно ряд средств, входящих в данный язык стал прототипом современного объектно-ориентированного программирования [2].

Большинство концепций позже были развиты Аланом Кэем и Дэном Ингаллсом в языке Smalltalk. Именно он в 1972 году стал первым широко распространённым объектно-ориентированным языком программирования. И изначально предназначенного для реализации функций машинной графики [3].

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

Поэтому на смену процедурным языкам в начале 1990-х годов. пришло современное объектно-ориентированное программирование(ООП).

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

1.2 Классификация объектно-ориентированных языков программирования высокого уровня

Для поддержки концепции объектно-ориентированного программирования в будущем были разработаны специальные современные объектно-ориентированные языки программирования.

Язык программирования называется объектно-ориентированным, если:

  1. Есть поддержка объектов как абстракций данных, имеющих интерфейсную часть в виде поименованных операций, и защищенную область локальных данных;
  2. Все объекты можно отнести к соответствующим типам (классам);
  3. Классы могут наследовать от суперклассов;
  4. Любые данные хранятся как объекты, размещаемые с автоматическим выделением и освобождением памяти;
  5. Объект существует с системе, пока его можно именовать [2].

Последний принцип используется в чистых объектно-ориентированных языках (Smalltalk, Actor), от гибридных языков программирования, выросших из ранее существовавших процедурных языков (Object Pascal, C++). Эти подходы являются крайностями в семействе объектно-ориентированных языков.

Ближе к середине лежит совершенно новый, полностью построенный на принципах объектно-ориентированной идеологии, но все же нарушающий последний принцип, язык Java [3].

Все языки объектно-ориентированного программирования можно разделить на три группы:

  1. Чистые языки - это языки в самой классической форме, поддерживающие объектно-ориентированную методологию. Такие языки содержат небольшую часть языка и важную библиотеку, а также набор инструментов поддержки для времени выполнения.
  2. Гибридные языки - это языки, которые появились как результат внедрения объектно-ориентированных конструкций в популярные императивные языки программирования.
  3. Урезанные языки - появились как результат после удаления из гибридных языков наиболее опасных и ненужных с позиций ООП конструкций [8].

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

Вывод по первой главе

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

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

2. СПЕЦИФИКА МЕТОДОЛОГИИ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ В СОВРЕМЕННЫХ ЯЗЫКАХ ПРОГРАММИРОВАНИЯ

2.1 Сущность методологии объектно-ориентированного программирования

Объектно-ориентированная методология состоит из такиех частей: объектно-ориентированный анализ, объектно-ориентированное проектирование, объектно-ориентированное программирование [1].

Объектно-ориентированный анализ - является методологией для анализа реалий настоящего мира, основанных на понятиях класса и объекта, составляющих словарь предметной области, для понимания и объяснения того, как они (сущности) взаимодействуют друг с другом. Модели объектно-ориентированного анализа впоследствии превращаются в объектно-ориентированный проект [2].

Методология проектирования программного продукта объединяет процесс декомпозиции объектов на основе выбора классов и объектов и методы представления моделей, которые отражают логику (структуру классов и объектов) и физическую (архитектура моделей и процессы) [3].

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

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

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

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

2.2 Основные методы и концепции объектно-ориентированного программирования

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

  1. Метод объектно-ориентированной декомпозиции - заключается в процессе выделении объектов и связей между ними. Метод поддерживается концепциями инкапсуляции, наследования и полиморфизма [2].
  2. Метод абстрактных типов данных – метод, лежащий в основе инкапсуляции. Поддерживается концепцией абстрактных типов данных.
  3. Метод пересылки сообщений - заключается в описании поведения системы в терминах обмена сообщениями между объектами. Поддерживается концепцией сообщения [9].

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

2.3 Синтаксис и семантика объектно-ориентированных языков программирования

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

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

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

Все объектно-ориентированное программирование основано на трех фундаментальных принципах, придающих объектам новые свойства [6].

К этим методам относятся:

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

Инкапсуляция позволяет во многом изолировать класс от остальных частей программы, сделать его «самодостаточным» для решения конкретной задачи. В результате класс всегда несет в себе некоторую функциональность [5]. Например, класс TForm в Delphi содержит (инкапсулирует в себе) все необходимое для создания Windows-окна, класс TTimer обеспечивает работу таймера. Единицей инкапсуляции в объектно-ориентированном программирование является объект.

  1. Наследование - это свойство объектов порождать своих потомков. Объект-потомок автоматически наследует все поля и методы, может дополнять объекты новыми полями, заменять и дополнять методы [9].

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

Принцип наследования приводит к созданию постоянно разрастающегося ветвящегося дерева классов. Каждый потомок дополняет возможности своего родителя новыми и передает их своим потомкам [2].

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

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

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

2.4 Анализ объектно-ориентированных языков программирования высокого уровня, сфера их применения

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

Первый объектно-ориентированный язык программирования Simula 67 был разработан в Норвегии в конце 1960-х годов. Авторы данного языка очень точно предугадали перспективы развития программирования. Данный язык намного опередил свое время. Однако программисты 60-х годов не смогли воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (в основном, с языком Fortran). Не популярности языку Simula 67 способствовало, что он был реализован как интерпретируемый, а не компилируемый язык. Данный факт был абсолютно неприемлемым в 1960-е годы, так как интерпретация была связана со снижением скорости выполнения(эффективности) программ [9].

Но достоинства языка Simula 67 все же были замечены некоторыми программистами. Поэтому в 1970-е годы было разработано множество экспериментальных объектно-ориентированных языков программирования: CLU, Alphard, Concurrent Pascal. Данные языки так и остались экспериментальными, но после их исследования были разработаны существующие объектно-ориентированные языки программирования [2].

В 1972 году командой Xerox Palo Alto Research Center Learning Research Group был разработан язык Smalltalk как программная часть Dynabook - фантастического проекта Алана Кея. В основу нового языка были положены идеи Simula. Smalltalk являлся одновременно и языком программирования, и средой разработки программ.

Smalltalk - это чисто объектно-ориентированный язык, в котором абсолютно все рассматривается как объекты. Даже целые числа - это классы. Smalltalk оказал существенное влияние на последующие поколения языков программирования. Так же Smalltalk стал основой для современного графического интерфейса пользователя, на которых базируются интерфейсы Windows, Macintosh, и Motif [4].

Известны пять выпусков языка Smalltalk, которые обозначаемы по году их появления: Smalltalk-72, -74. -76, -78, -80. Реализации 1972 и 1974 годов заложили данного основу языка. Была заложена идея передачи сообщений и полиморфизм, несмотря на то, что механизм наследования еще не появился. В последующих версиях за основу были взяты классы.

Smalltalk-80 был перенесен на многие компьютерные платформы. В основу языка положены две простые идеи: все является объектами и объекты взаимодействуют, обмениваясь сообщениями [9].

В таблице 1 приведены характеристики языка Smalltalk с точки зрения основных элементов объектного подхода.

Таблица 1

Характеристика языка программирования Smalltalk [9]

Абстракции

Переменные экземпляра

Да

Методы экземпляра

Да

Переменные класса

Да

Методы класса

Да

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

Переменных

Закрытые

Методов

Открытые

Модульность

Разновидности модулей

Нет

Иерархии

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

Одиночное

Шаблоны

Нет

Метаклассы

Да

Типизация

Сильная типизация

Нет

Полиморфизм

Да (одиночный)

Параллельность

Многозадачность

Непрямая (посредством классов)

Сохраняемость

Долгоживущие объекты

Нет

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

В 1983 году для Министерства Обороны США был создан язык Ada. Язык позволяет выявить очень много ошибок на этапе компиляции. Кроме того, поддерживаются многие аспекты программирования, которые часто отдаются на откуп операционной системе (параллелизм, обработка исключений). В 1995 году был принят стандарт языка Ada 95, который развил предыдущую версию и добавил в нее объектно-ориентированность и исправляя некоторые неточности. Оба этих языка не стали популярными и не получили распространения вне военных и прочих крупномасштабных проектов (авиация, железнодорожные перевозки). Основной причиной стало достаточно громоздкий синтаксис и сложность освоения языка [9].

Непосредственными предшественниками Ada являются Pascal и его производные, включая Euclid, Lis, Mesa, Modula и Sue. Были использованы некоторые концепции ALGOL-68, Simula, CLU и Alphard. В таблице 2 приведены основные характеристики языка Ada с точки зрения объектного подхода [4].

Таблица 2

Характеристика языка программирования Ada [9]

Абстракции

Переменные экземпляра

Да

Методы экземпляра

Да

Переменные класса

Нет

Методы класса

Нет

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

Переменных

Открытые, закрытые

Методов

Открытые, закрытые

Модульность

Разновидности модулей

Пакет

Иерархии

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

Нет (входит в Ada9x)

Шаблоны

Да

Метаклассы

Нет

Типизация

Сильная типизация

Да

Полиморфизм

Нет (входит в Ada9x)

Параллельность

Многозадачность

Да

Сохраняемость

Долгоживущие объекты

Нет

С 1995 года появился новый объектно-ориентированный язык программирования Java. Данный язык ориентированный на сети компьютеров [4]. Синтаксис этого языка похож на синтаксис языка C++, однако эти языки имеют мало общего. Java интерпретируемый язык. Для данного языка определены внутреннее представление (bytecode) и интерпретатор этого представления, которые реализованы на множестве платформ. Интерпретатор упрощает отладку программ, написанных на языке Java. А так же обеспечивает их адаптируемость к новым окружениям и переносимость на новые платформы. Он позволяет исключить влияние программ, написанных на языке Java, на другие программы и файлы, имеющиеся на новой платформе, и тем самым обеспечить безопасность при выполнении этих программ. Эти свойства языка Java позволяют использовать его как основной язык программирования для программ, распространяемых по сетям (в частности, по сети Internet) [9].

Одним из современных и популярных объектно-ориентированных языков является C++. Язык программирования C++ был разработан Бьерном Страуструпом, сотрудником AT&T Bell Laboratories. Непосредственным предшественником C++ является С with Classes, созданный тем же автором в 1980 году. Язык С with Classes был создан под сильным влиянием С и Simula. Язык C++ - это в значительной степени надстройка над языком С. В определенном смысле можно назвать язык C++ улучшенным языком С, тем С, который обеспечивает контроль типов, перегрузку функций и ряд других удобств. Но главное в том, что язык C++ добавляет к языку С объектную ориентированность [7].

Известны несколько версий языка C++. В версии 1.0 реализованы основные механизмы объектно-ориентированного программирования. Это проверка типов и перегрузка функций, одиночное наследование и полиморфизм, [8]. В версии 2.0 созданной в 1989 году отражены многие дополнительные свойства, возникшие на базе опыта применения языка многочисленными пользователями. В версии 3.0, которая вышла в 1990 году появились обработка исключений и шаблоны.

Язык C++ продолжает совершенствоваться и в настоящее время. В 1998 году вышла новая версия стандарта, содержащая в себе некоторые довольно существенные изменения. Язык стал основой для разработки современных больших и сложных проектов [8]. Характеристики C++ приведены в таблице 3.

Таблица 3

Характеристика языка программирования C++[2]

Абстракции

Переменные экземпляра

Да

Методы экземпляра

Да

Переменные класса

Да

Методы класса

Да

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

Переменных

Открытые, защищенные, закрытые

Методов

Открытые, защищенные, закрытые

Модульность

Разновидности модулей

файл

Иерархии

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

Множественное

Шаблоны

Да

Метаклассы

Нет

Типизация

Сильная типизация

Да

Полиморфизм

Да (одиночный)

Параллельность

Многозадачность

Непрямая (посредством классов)

Сохраняемость

Долгоживущие объекты

Нет

Object Pascal создавался сотрудниками компании Apple Computer (некоторые из которых были участниками проекта Smalltalk) совместно с Никлаусом Виртом (Niklaus Wirth), создателем языка Pascal [9]. Object Pascal известен с 1986 года и является первым объектно-ориентированным языком программирования, который был включен в Macintosh Programmer's Workshop (MPW), среду разработки для компьютеров Macintosh фирмы Apple. В этом языке нет методов класса, переменных класса, множественного наследования и метаклассов. Эти механизмы исключены специально, чтобы сделать язык простым для изучения начинающими программистами. В таблице 4 приведены общие характеристики Object Pascal [4].

Таблица 2

Характеристика языка программирования. Object Pascal [9]

Абстракции

Переменные экземпляра

Да

Методы экземпляра

Да

Переменные класса

Нет

Методы класса

Нет

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

Переменных

Открытые

Методов

Открытые

Модульность

Разновидности модулей

Модуль (unit)

Иерархии

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

Одиночное

Шаблоны

Нет

Метаклассы

Нет

Типизация

Сильная типизация

Да

Полиморфизм

Да (одиночный)

Параллельность

Многозадачность

Нет

Сохраняемость

Долгоживущие объекты

Нет

Этот язык в свое время стал очень популярен благодаря системе Delphi фирмы Borland.

Вывод по второй главе

Методология объектно-ориентироанного программировнаия строится на трех основных принципа: инкапсуляция, наследование, полиморфизм.Все современные языки программирования высокго уровня строятся на этих принципах. К современым языкам программирования можно отнести Ada9x, Java, C++, Delphi.

3. РАЗРАБОТКА ПРОГРАММНОЙ ПЛАТФОРМЫ С ИСПОЛЬЗОВАНИЕМ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПОДХОДА

3.1 Постановка задачи и обоснование выбора среды разработки

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

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

Трудностями в реализации задачи стало преобразование полученной информации с датчиков в цифровой вид, организация передачи информации с датчиков программе, и проверка того, что собранная информация является реальной и достоверной. Задача преобразования информации была решена с помощью подключения датчиков к аналого-цифровому преобразователю (АЦП). Задача передачи информации решена с помощью подключения к АЦП компьютера с разработанной программой.

Среда разработки QT выбрана из-за того, что, она кроссплатформенна, а также имеет удобные инструменты для построения интерфейсов. В MS Visual Studio и другая любая другая среда разработки для С++ не подходит для решения поставленной задачи, так как не кроссплатформенна, а также не имеет удобных инструментов для построения интерфейсов и имеет другое назначение разработки [2].

А языком разработки выбран С++, так выбран потому что для него существует много библиотек для работы с USB и АЦП, и он эффективнее работает с близкой к реал-тайм обработкой данных. Быстрее даже чем Java.

3.2 Разработка проекта программной платформы и ее основных классов

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

Рисунок 1- Библиотеки, использованные для разработки программы

В программе для интерполяции данных использована сторонняя библиотека Spline.

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

Объектно-ориентированный подход предполагает использования для решения задачи наследования классов. В программе используется язык С++, который как объектно-ориентированный язык, поддерживает наследование. В отличие от Java и C#, в С++ не предусмотрен обобщенный класс Object, который наследуется всеми другими классами [5]. Qt предоставляет Q_Object в качестве естественного базового класса для объектов всех типов. В данной работе все Qt классы наследуются от Q_Object.

Q_Object – это базовый класс для всех объектов Qt. Его наследует любой класс использующий сигналы и слоты. Он обеспечивает возможность соединения объектов друг с другом. А также предоставляет к этому полезную функциональность. Во введение этого базового класса находиться: прослеживание за потомками и родителями и возвращение указателей на них (наследственная информация). Q_Object поддерживают информацию о дереве дочерних объектов. Когда создается Q_Object в качестве родителя другого объекта, то объект автоматически добавляет себя в список дочерних объектов children(). Родитель принимает в собственность свои дочерние объекты. То есть дочерние объекты будут автоматически удалены в деструкторе объекта-родителя. Есть поиск дочерних объект по имени и типу используя findChild() или findChildren()[5].

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

QObject могут получать события от других объектов через event() и фильтр событий. Для получения более подробной информации смотреть installEventFilter() и eventFilter(). Для удобства можно переопределить childEvent() позволяющую перехватывать события от дочерних объектов. События ставятся в потоки, в которых объект был создан. Все виджеты Qt наследуют QObject. Функция isWidgetType() позволяет узнать, дейтвительлно ли объект является виджетом. Это работает намного быстрее, чем qobject_cast<QWidget>(obj) или obj->inherits(«QWidget») [6].

Некоторые функции QObject, такие как children(), возвращают QObjectList. QObjectList - переименование типа для QList<QObject *>.

Для разработки данной программы использованы стандартные классы, которые создаются самой средой разработки QT. Также для удобной работы с информацией о типе используемого в данный момент двигателя было принято решение реализовать шаблон проектирования - одиночка (singletone) (Рисунок 2) [1]. Каждый класс содержит файлы с расширением *.h (header) – это объявление класса, а *.cpp – это реализация класса. Не все папки в программе являются классами.

Рисунок 2 – Классы, использованные в программе

Шаблон singletone (одиночка) - порождающий шаблон проектирования, гарантирующий, что в одно процессном приложении будет единственный экземпляр некоторого класса, и предоставляющий глобальную точку доступа к этому экземпляру [2].

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

Глобальный «одинокий» объект - именно объект, а не набор процедур, не привязанных ни к какому объекту - бывает нужен если:

  1. Используется существующая объектно-ориентированная библиотека;
  2. Есть шансы, что один объект когда-нибудь превратится в несколько;
  3. Интерфейс объекта слишком сложен и не стоит засорять основное пространство имён большим количеством функций;
  4. В зависимости от каких-нибудь условий и настроек, создаётся один из нескольких объектов [2].

Шаблон singletone имеет ряд недостатков.

  1. Синглтон нарушает SRP (Single Responsibility Principle) – принцип единой обязанности. Класс синглтона, кроме выполнения своих непосредственные обязанностей, занимается контролированием количества своих экземпляров.
  2. Зависимость обычного класса от синглтона не видна в публичном контракте класса. Потому что обычно экземпляр синглтона не передается в параметрах метода, а получается напрямую, через getInstance(). Так что для выявления зависимости класса от синглтона необходимо посмотреть тело каждого метода. Просто просмотреть публичный контракт объекта для этого недостаточно. Как следствие: сложность рефакторинга при последующей замене синглтона на объект, содержащий несколько экземпляров.
  3. Глобальное состояние. При получение доступа к экземпляру класса, не известно текущее состояние этого класса, кто и когда его менял. А это состояние может быть вовсе не таким, как ожидается. Другими словами, корректность работы с синглтоном зависит от порядка обращений к нему, что вызывает неявную зависимость подсистем друг от друга и, как следствие, серьезно усложняет разработку [9].
  4. Наличие синглтона понижает тестируемость приложения в целом и в частности классов, которые используют синглтон. Во-первых, вместо синглтона нельзя поставить Mock-объект, а во-вторых, если синглтон имеет интерфейс для изменения своего состояния, то тесты начинают зависеть друг от друга.

Папка DieselType (одиночка) - класс в данной программе, который написан вручную с использованием шаблона singletone и описывает тип дизеля. Шаблон гарантирует, что в программе при разных обстоятельствах создастся только один экземпляр класса дизеля. То есть будет только один тип дизеля, использоваться для расчетов. Класс DieselType описывается в файлах dieseltype.h (ввод данных) и dieseltype.cpp (вывод данных) (Рисунок 2).

Папка Dataio содержит файлы dataio.h и dataio.cpp. В них имеются функции реализации ввода, считывания и вывода данных.

Папка MainWindow - класс стандартной формы в Qt, который описывает и реализует главное окно с кнопками. Данная папка содержит в себе файлы mainwindow.cpp, mainwindow.h, mainwindow.ui.

Папка Settings - класс стандартной формы стандартной формы Qt, который описывает и реализует кнопку настройки датчика. Данная папка содержит в себе файлы settingsclass.h и settingsclass.cpp.

Папки WidgetArchive, WidgetDieselType, WidgetMetering, WidgetSelectDiesel, WidgetSettings, WidgetTest, WidgetVMTSetup – дочерние классы виджетов - более подробное описание кнопок, которые описаны общем head.

Папка QCustomPlot – библиотека в Qt для построения и визуализации графиков. Отрисовка графиков происходит после вызова метода replot() (вручную, или при срабатывании события). Для отрисовки данный виджет требует 2 массива данных, содержащих значение аргумента (x) и значение функции в этой точке (y). Используется в данной программе для реализации рисования графиков [1].

3.3 Разработка интерфейса программной платформы

Программа запускается исполнительным файлом. Проект главного окна программы представлено на рисунке 3.

Рисунок 3- Проект главного окна программы

Так же для корректной работы программы в любой версии операционной системы Windows и не зависимо от наличия среды разработки QT, кроме exe файла нужны все папки на рисунке 4 и библиотеки, обведенные рамочкой (рисунок 4).

Рисунок 4 – Используемые библиотеки

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

Библиотеки, которые в название имеют Qt*.dll являються стандартними для QT, но не для Windows. То есть если на операционной системы Windows не стоит среда разработки QT и нет этих файлов, то при открытие ехе файла, система выдаст ошибку [1].

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

Открывшееся при запуске окно программы для удобства и простоты использования разделено на три блока: тип дизеля, подготовка измерений, индицирование (Рисунок 3).

Блок тип дизеля. В данном блоке есть 2 кнопки: Задание и Выбор (Рисунок 3). При открытие кнопки задание, появляется окно, которое изображено на рисунке 5.

Рисунок 5 - Окно тип дизеля

В данном окне задаются характеристики дизеля. При этом в строке количество цилиндров стоит ограничение от 1-30, и есть возможность выбора тактности 2 или 4. При нажатии кнопки Принять, появляется окно, которое изображено на рисунке 6, где выставляется порядок работы цилиндра.

Рисунок 6 - Окно задание порядка работы цилиндра

При нажатии второй кнопки Принять, информация о типе дизеля записывается в память программы, и открывается кнопкой Выбор на главном окне. Нажав кнопку Выбор можно выбрать тип сохраненного дизеля (Рисунок 7).

Рисунок 7 - Окно выбор дизеля

Блок подготовка измерений. В данном блоке есть 2 кнопки: Установка ВМТ и Тест датчиков (Рисунок 3). При нажатии кнопки Установка ВМТ открывается окно, изображенное на рисунке 8.

Рисунок 8 - Окно установка ВМТ

При нажатии кнопки Тест датчиков открывается окно, изображенное на рисунке 9. Но при этом надо, чтобы в настройках стояло какой канал мы проверяем в этом режиме.

Рисунок 9 – Окно тест датчика

Блок индицирование. В данном блоке есть 2 кнопки: Измерение и Архив (Рисунок 3).

При нажатии кнопки Измерение открывается окно, изображенное на рисунке 10.

Рисунок 10 – Окно измерение

При нажатии кнопки Архив открывается окно, изображенное на рисунке 11.

Рисунок 11 – Окно архив

В программе также есть валидация вводимых данных - комплекс мер по пресечению ввода неправильной информации в форме

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

Например, если не заполнены все данные или введено недопустимое значение, то программа выдаст ошибку (Рисунок 12).

Рисунок 12 – Валидация вводимых данных в программе

При закрытии программы или окна с не сохраненными данными, в программе вызывается диалоговое окно с вопросом стоит ли закрывать программу (Рисунок 13).

Рисунок 13 – Вызов диалогового окна

По графикам, изображенным на рисунке 9 и 11 видно, что программа работает, что выполняется сбор данных с датчика, нормализация, хранение (кнопка Архив), анализ данных, и функция отрисовки графиков в программе. То есть цель дипломной работы достигнута.

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

Вывод по третий главе

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

ЗАКЛЮЧЕНИЕ

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

Были достигнуты следующие задачи:

  1. Изучены исторические предпосылки создания объектно-ориентированного программирования
  2. Проведена классификация объектно-ориентированных языков программирования высокого уровня
  3. Расскрыта сущность методологии объектно-ориентированного программирования
  4. Изучены основные методами и концепциями объектно-ориентированного программирования
  5. Изучен синтаксис и семантика объектно-ориентированных языков программирования
  6. Проанализировано существующие объектно-ориентированные языки программирования высокого уровня, обозначить сферы их применения
  7. Разработана с использованием объектно-ориентированного подхода и протестирована програмная платформа.

БИБЛИОГРАФИЯ

  1. Амерааль, Л. STL для программистов на С++. / Л. Амерааль; пер. с англ.- СПб.: ДМК Пресс, 2016.- 240 с.
  2. Г.Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. - М.: Бином, 2015. - 560 с.
  3. Дейл, Н. Программирование С++. / Н. Дейл, Ч. Уимз, М. Хедингтон; пер. с англ.- СПб.: ДМК Пресс, 2017.- 672 с.
  4. Дубина Г.Д. Разработка и применение пакетов прикладных программ в экономике: Учебное пособие. – Томск: Изд. ТПУ, 2016. - 144 с.
  5. Лафоре, Р. Объектно-ориентированное программирование в С++. / Р. Лафоре.- СПб: Питер, 2017.- 928 с.
  6. Павловская, Т.А. С++. Объектно-ориентированное программирование. Практикум: учебное пособие. / Т.А. Павловская, Ю.А. Щупак.- М.; СПб.; Н.Новгород: Питер, 2016.- 264 с.
  7. Прата, С. Язык программирования Си. Лекции и упражнения. / С. Прата; пер. с англ.- 5-е изд.- М.: Вильямс, 2017. - 1181 с.
  8. Страуструп, Б. Язык программирования С++. / Б. Страуструп; пер. с англ.- М.: Бином-Пресс, 2014.- 1098 с.
  9. Хорев, П.Б. Технологии объектно-ориентированного программирования. / П.Б. Хорев.- М.: «Академия», 2018.- 448 с.