Сущность и история развития объектноориентированного программирования
Скачать 340.91 Kb.
|
Министерство образования и науки Российской Федерации КУРСОВАЯ РАБОТА на тему: «Сущность и история развития объектно-ориентированного программирования» Работа защищена с оценкой: _________________________ “___”______________2011 г Выполнил: _______________ Студент гр _______________ “____”_____________2011 г. Проверил: _______________ Преподаватель ___________ “____”_____________2011 г Челябинск 2011 Оглавление Введение 1. Теоретическая часть 1.1 Сущность и история развития объектно-ориентированного программирования 1.. Главные понятия и разновидности 1.3 Основные принципы в объектно-ориентированном программировании 1.3.1 Инкапсуляция 1.3.2 Наследование как важнейшее свойство объекта 1.3.3 Экземпляры объектных типов 1.3.4 Поля объектов 1.3.5 Методы 1.3.6 Полиморфизм 1.4 Объектно-ориентированные языки 2. Аналитическая часть 2.1 Критика ООП 2.2 Аспекты критики 2.3 Производительность объектных программ 3. Практическая часть 3.1 Описание предметной области 3.2 Проектирование класса 3.3 Проектирование методов класса Заключение ВведениеОбъектно-ориентированное программирование - это подход к разработке программного обеспечения, основанный на объектах, а не на процедурах. Этот подход позволяет максимизировать принципы модульности и "сокрытия информации". Объектно-ориентированное программирование базируется на связывании или инкапсуляции структур данных и процедуры, которая работает с данными в структуре, с модулем. Актуальность выбранной темы обусловлена тем, что объектно-ориентированный принцип разработки дает много преимуществ и используется многими разработчиками. Например, каждый объект инкапсулирует его структуру данных с процедурой, используемой для работы с экземплярами структуры данных. Это позволяет устранить в коде программы внутренние зависимости, которые могут быстро привести к тому, что этот код будет трудно обслуживать. Объекты могут также наследовать из по рождающего объекта структуры данных и другие характеристики, что позволяет сэкономить усилия и обеспечить прозрачное использование для многих целей больших фрагментов кода. Целью курсовой работы является: изучение основных принципов объектно-ориентированного программирования и написание программного продукта на основании полученных знаний. В соответствии с поставленной целью при выполнении работы возникают следующие задачи: 1. Изучение теоретических основ объектно-ориентированного программирования, принцип объект программирование приложение 2. Рассмотрение принципов объектно-ориентированного программирования, 3. Применение на практике принципов объектно-ориентированного программирования, 4. Создание приложения на языке С++: класс «Учет успеваемости студентов», 5. Отладка разработанного класса. Объектом работы является объектно-ориентированное программирование. Предметом работы является применение принципов объектно-ориентированного программирования на практике. При написании работы автор опирался на труды отечественных и зарубежных ученых Ахо А., Ульман Дж., Братчиков И.Л., Гулидов А.И., Наберухин Ю.И., Дейкстра Э., Ершов А.П., Кнут Д., Майерс Г., Мендельсон Э., Рудаков А. В., Тыугу, Э.Х., Хьюз Дж., Мичтом Дж. Достаточно полезной книгой при изучении объектно-ориентированного программирования оказалась книга Ахо А.. В этой книге были изложены различные структуры данных, рассмотрены принципы работы с различными структурами. Предполагаемая практическая значимость курсовой работы заключается в том, что ее можно будет использовать в качестве источника получения теоретического материала по теме «основы и принципы объектно-ориентированного программирования», а также как руководство по проектированию класса с использованием принципов объектно-ориентированного программирования. 1.Теоретическая часть1.1 Сущность и история развития объектно-ориентированного программированияОбъе́ктно-ориенти́рованное или объектное программирование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием, — прототипов). ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны. Для дальнейшего развития объектно-ориентированного программирования часто большое значение имеют понятия события (так называемое событийно-ориентированное программирование) и компонента (компонентное программирование, КОП). Формирование КОП от ООП произошло, как случилось формирование модульного от процедурного программирования: процедуры сформировались в модули — независимые части кода до уровня сборки программы, так объекты сформировались в компоненты — независимые части кода до уровня выполнения программы. Взаимодействие объектов происходит посредством сообщений. Результатом дальнейшего развития ООП, по-видимому, будет агентно-ориентированое программирование, где агенты — независимые части кода на уровне выполнения. Взаимодействие агентов происходит посредством изменения среды, в которой они находятся. Языковые конструкции, конструктивно не относящиеся непосредственно к объектам, но сопутствующие им для их безопасной (исключительные ситуации, проверки) и эффективной работы, инкапсулируются от них в аспекты (в аспектно-ориентированном программировании). Субъектно-ориентированное программирование расширяет понятие объект посредством обеспечения более унифицированного и независимого взаимодействия объектов. Может являться переходной стадией между ООП и агентным программирование в части самостоятельного их взаимодействия. Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования. В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. В области системного программирования до сих пор применяется парадигма процедурного программирования, и общепринятым языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, одной из наиболее распространенных библиотек мультиплатформенного программирования является объектно-ориентированная библиотека Qt, написанная на языке C++. 1.2 Главные понятия и разновидностиСтруктура данных «класс», представляющая собой объектный тип данных, внешне похожа на типы данных процедурно-ориентированных языков, такие как структура в языке Си или запись в Паскале или QuickBasic. При этом элементы такой структуры (члены класса) могут сами быть не только данными, но и методами (то есть процедурами или функциями). Такое объединение называется инкапсуляцией. Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования. Но даже наличие инкапсуляции и наследования не делает язык программирования в полной мере объектным с точки зрения ООП. Основные преимущества ООП проявляются только в том случае, когда в языке программирования реализован полиморфизм. Язык Self, соблюдая многие исходные положения объектно-ориентированного программирования, ввёл альтернативное классам понятие прототипа, положив начало прототипному программированию, считающемуся подвидом объектного. В таблице 1.1 представлены основные понятия Таблица 1.1. Основные понятия в ООП
1.3 Основные принципы в объектно-ориентированном программированииПонятию “объект” сопоставляют ряд дополняющих друг друга определений. Ниже приведены некоторые из них. Объект - это осязаемая реальность, характеризующаяся четко определяемым поведением. Объект - особый опознаваемый предмет, блок или сущность (реальная или абстрактная), имеющая важное функциональное назначение в данной предметной области. Объект может быть охарактеризован структурой, его состоянием, поведением и индивидуальностью. Состояние объекта определяется перечнем всех возможных (обычно статических) свойств и текущими значениями (обычно динамическими) каждого из этих свойств. Свойства объекта характеризуются значениями его параметров. Поведение объекта описывает, как объект воздействует на другие объекты или как он подвергается воздействию со стороны других объектов с точки зрения изменения его собственного состояния и состояния других объектов. Говорят также, что поведение объекта определяется его действиями. Определенное воздействие одного объекта на другой с целью вызвать соответствующую реакцию называют операцией. В объектно-ориентированных языках программирования операции называют методами. Можно выделить пять типов операций: - конструктор, создание и инициализация объекта; - деструктор, разрушающий объект; - модификатор, изменяющий состояние объекта; - селектор для доступа к переменным объекта без их изменения; - итератор для доступа к содержанию объекта по частям в определенной последовательности. Известна и другая классификация методов объекта, когда выделяют функции управления, реализации, доступа и вспомогательные функции. Под индивидуальностью объекта понимают свойство объекта, позволяющее отличать этот объект от всех других объектов. Объекты могут находиться в определенных отношениях друг к другу. Эти отношения могут быть иерархическими. Основные иерархические отношения - это отношения использования и включения. Отношение использования реализуется посылкой сообщений от объекта A к объекту B. При этом объект A может выступать в роли: - активного или воздействующего объекта, когда он воздействует на другие объекты, но сам воздействию не подвергается; - пассивного или исполняющего, когда объект подвергается воздействию, но сам на другие объекты не воздействует; - посредника, если объект и воздействует и сам подвергается воздействию. Отношение включения имеет место, когда составной объект содержит другие объекты. 1.3.1 ИнкапсуляцияОбъекты моделируют характеристики и поведение элементов мира, в котором мы живем. Они являются окончательной абстракцией данных. Объекты содержат вместе все свои характеристики и особенности поведения. Отношения частей к целому и взаимоотношения между частями становятся понятнее тогда, когда все содержится вместе в одной упаковке. Это и называется инкапсуляцией. 1.3.2 Наследование как важнейшее свойство объектаНе менее важным является и тот факт, что объекты могут наследовать характеристики и поведение того, что мы называем порождающие, родительские объекты (или предки). Здесь происходит качественный скачок: наследование, возможно, является сегодня единственным самым крупным различием между обычным программированием на Паскале и объектно-ориентированным программированием в Borland Pascal. В терминах Паскаля, объект во многом схож с записью, которая является оболочкой для объединения нескольких связанных элементов под одним именем. Процесс, с помощью которого один тип наследует характеристики другого типа, называется наследованием. Наследник называется порожденным (дочерним) типом, а тип, которому наследует дочерний тип, называется порождающим (родительским) типом. Ранее известные типы записей Паскаля не могут наследовать. Однако Borland Pascal расширяет язык Паскаля для поддержки наследования. Одним из этих расширений является новая категория структуры данных, связанная с записями, но значительно более мощная. Типы данных в этой новой категории определяются с помощью нового зарезервированного слова object. Тип объекта может быть определен как полный, самостоятельный тип в манере описания записей Паскаля, но он может определяться и как потомок существующего типа объекта путем помещения, порождающего (родительского) типа в скобки после зарезервированного слова object. Большая часть конструирования объектно-ориентированных прикладных программ состоит в построении иерархии объектов, являющейся отражением генеалогического дерева объектов в приложениях. Как показали данные определения, объекты тесно связаны с записями. Новое зарезервированное слово object является наиболее очевидным различием, но как мы увидим позднее, имеется большое число других различий, некоторые из которых довольно тонкие. 1.3.3 Экземпляры объектных типов Экземпляры объектных типов описываются в точности так же, как в Паскале описывается любая переменная, либо статическая, либо указатель, ссылающийся на размещенную в динамической памяти переменную. 1.3.4 Поля объектовМы можем обратиться к полю объекта в точности так же, как к полю обычной записи, либо с помощью оператора with, либо путем уточнения имени с помощью точки. 1.3.5 МетодыДаже если мы можем обратиться к полям объекта непосредственно, это будет не совсем хорошей идеей. Принципы объектно-ориентированного программирования требуют, чтобы поля объектов были исключены из исходного кода, насколько это возможно. Это ограничение поначалу может показаться спорным и жестким, но оно является только частью огромной картины объектно-ориентированное программирования. Ответ заключается в том, что при всякой возможности для доступа к полям данных должны использоваться методы объекта. Метод является процедурой или функцией, описанной внутри объекта и жестко ограниченной этим объектом. Методы являются одними из наиболее примечательных атрибутов объектно-ориентированного программирования и требуют некоторой практики перед использованием. Метод - это процедура или функция, объединенная с данным типом столь тесно, что метод является как бы окруженным невидимым оператором with, что делает экземпляр данного типа доступными изнутри для метода. Определение типа включает заголовок метода. Полное определение метода квалифицируется в имени типа. Тип объекта и метод объекта являются двумя лицами этой новой разновидности структуры, именуемой методом. Одним из важнейших принципов объектно-ориентированного программирования является то, что программист во время разработки программы должен думать о коде и о данных совместно. Ни код, ни данные не существуют в вакууме. Данные управляют потоком кода, а код манипулирует образами и значениями данных. Если наш код и данные являются разделенными элементами, то всегда существует опасность вызова правильной процедуры с неверными данными или ошибочной процедуры с правильными данными. Забота о совпадении этих элементов возлагается на программиста, и хотя строгая типизация Паскаля здесь помогает, самое лучшее, что он может сделать - это указать на несоответствие. Объект осуществляет синхронизацию кода и данных путем совместного построения их описаний. Реально, чтобы получить значение одного из полей объекта, мы вызываем относящийся к этому объекту метод, который возвращает значение нужного поля. Чтобы присвоить полю значение, мы вызываем метод, который назначает данному полю новое значение. Однако, Borland Pascal не вынуждает нас делать это. Как всякое структурное программирование, объектно-ориентированное программирование является дисциплиной, которую мы должны навязать себе, используя предоставляемые языком средства. Borland Pascal позволяет нам обращаться к полям объекта непосредственно извне объекта, однако он поощряет нас использовать преимущества объектно-ориентированного программирования и создавать методы для манипулирования полями объекта внутри самого объекта. Итак, подведем некоторый итог. Что такое объект? Объект состоит из структуры данных и связанных с ней процедур (которые называются методами), которые работают с данными, записанными в экземплярах структуры данных. Объект может наследовать характеристики порождающего объекта. Это означает, что структура данных нового объекта включает структуру данных порождающего объекта, а также новые данные. Кроме того, новый объект может вызывать все процедуры порождающего объекта, а также те процедуры методов, которые в нем описываются. Объект, не имеющий наследования, называется базовым объектом. Объект, наследующий характеристики других объектов, называется порожденным или производным объектом. 1.3.6 ПолиморфизмПолиморфизм означает, что один и тот же метод выполняется по-разному для различных объектов. Например, метод класса Музыкальный инструмент - PlayMusicForAnOrchestra (играй музыку для оркестра) - может быть определен как общий метод, который может использоваться с любой категорией музыкальных инструментов. Этот метод написан таким образом, что не важно, какой именно инструмент получает задание играть, однако для классов, описывающих конкретные инструменты, данный метод должен быть переопределен (override), что даст возможность определить конкретные действия, учитывающие особенности данного инструмента. 1.4 Объектно-ориентированные языкиМногие современные языки специально созданы для облегчения объектно-ориентированного программирования. Однако следует отметить, что можно применять техники ООП и для не-объектно-ориентированного языка и наоборот, применение объектно-ориентированного языка вовсе не означает, что код автоматически становится объектно-ориентированным. Современный объектно-ориентированный язык предлагает, как правило, следующий обязательный набор синтаксических средств: Объявление классов с полями (данными — членами класса) и методами (функциями — членами класса). Механизм расширения класса (наследования) — порождение нового класса от существующего с автоматическим включением всех особенностей реализации класса-предка в состав класса-потомка. Большинство ООП-языков поддерживают только единичное наследование. Средства защиты внутренней структуры классов от несанкционированного использования извне. Обычно это модификаторы доступа к полям и методам, типа public, private, обычно также protected, иногда некоторые другие. Полиморфные переменные и параметры функций (методов), позволяющие присваивать одной и той же переменной экземпляры различных классов. Полиморфное поведение экземпляров классов за счёт использования виртуальных методов. В некоторых ООП-языках все методы классов являются виртуальными. Видимо, минимальным традиционным объектно-ориентированным языком можно считать язык Оберон, который не содержит никаких других объектных средств, кроме вышеперечисленных (в исходном Обероне даже нет отдельного ключевого слова для объявления класса, а также отсутствуют явно описываемые методы, их заменяют поля процедурного типа). Но большинство языков добавляют к указанному минимальному набору те или иные дополнительные средства. В их числе: - Конструкторы, деструкторы, финализаторы. - Свойства (аксессоры). - Индексаторы. - Интерфейсы (например, в Java используются также как альтернатива множественному наследованию — любой класс может реализовать сколько угодно интерфейсов). - Переопределение операторов для классов. Часть языков (иногда называемых «чисто объектными») целиком построена вокруг объектных средств — в них любые данные (возможно, за небольшим числом исключений в виде встроенных скалярных типов данных) являются объектами, любой код — методом какого-либо класса, и невозможно написать программу, в которой не использовались бы объекты. Примеры подобных языков — C#, Smalltalk, Java, Ruby. Другие языки (иногда используется термин «гибридные») включают ООП-подсистему в исходно процедурный язык. В них существует возможность программировать, не обращаясь к объектным средствам. Классические примеры — C++ и Delphi. 2. Аналитическая часть2.1 Критика ООПНесмотря на отдельные критические замечания в адрес ООП, в настоящее время именно эта парадигма используется в подавляющем большинстве промышленных проектов. Однако, нельзя считать, что ООП является наилучшей из методик программирования во всех случаях. Обычно сравнивают объектное и процедурное программирование: Процедурное программирование лучше подходит для случаев, когда важны быстродействие и используемые программой ресурсы, но требует большего времени для разработки. Объектное — когда важна управляемость проекта и его модифицируемость, а также скорость разработки. Критические высказывания в адрес ООП: 1. Исследование Thomas E. Potok, Mladen Vouk и Andy Rindos показало отсутствие значимой разницы в продуктивности разработки программного обеспечения между ООП и процедурным подходом. 2. Кристофер Дэйт указывает на невозможность сравнения ООП и других технологий во многом из-за отсутствия строгого и общепризнанного определения ООП. 3. Александр Степанов, в одном из своих интервью, указывал на то, что ООП «методологически неправильно» и что «… ООП практически такая же мистификация как и искусственный интеллект…». 4. Фредерик Брукс (Frederick P. Brooks, Jr.) в своей статье «No Silver Bullet. Essence and Accidents of Software Engineering» (Computer Magazine; April 1987) указывает на то, что наиболее сложной частью создания программного обеспечения является « … спецификация, дизайн и тестирование концептуальных конструкций, а отнюдь не работа по выражению этих концептуальных конструкций…». ООП (наряду с такими технологиями как искусственный интеллект, верификация программ, автоматическое программирование, графическое программирование, экспертные системы и др.), по его мнению, не является «серебряной пулей», которая могла бы на порядок величины (то есть примерно в 10 раз, как говорится в статье) снизить сложность разработки программных систем. Согласно Бруксу, «…ООП позволяет сократить только привнесённую сложность в выражение дизайна. Дизайн остаётся сложным по своей природе…». 5. Эдсгер Дейкстра указывал: «… то о чём общество в большинстве случаев просит — это змеиное масло. Естественно, „змеиное масло“ имеет очень впечатляющие имена, иначе будет очень трудно что-то продать: „Структурный анализ и Дизайн“, „Программная инженерия“, „Модели зрелости“, „Управляющие информационные системы“ (Management Information Systems), „Интегрированные среды поддержки проектов“, „Объектная ориентированность“, „Реинжиниринг бизнес-процессов“…». 6. Никлаус Вирт считает, что ООП — не более чем тривиальная надстройка над структурным программированием, и преувеличение её значимости, выражающееся, в том числе, во включении в языки программирования всё новых модных «объектно-ориентированных» средств, вредит качеству разрабатываемого программного обеспечения. 7. Патрик Киллелиа в своей книге «Тюнинг веб-сервера» писал: «… ООП предоставляет вам множество способов замедлить работу ваших программ …» 8 Известная обзорная статья проблем современного ООП-программирования перечисляет некоторые типичные проблемы ООП — Почему объектно-ориентированное программирование провалилось. 2.2 Аспекты критикиЕсли попытаться классифицировать критические высказывания в адрес ООП, можно выделить несколько аспектов критики данного подхода к программированию. 1. Критика рекламы ООП. Критикуется явно высказываемое или подразумеваемое в работах некоторых пропагандистов ООП, а также в рекламных материалах «объектно-ориентированных» средств разработки представление об объектном программировании как о некоем всемогущем подходе, который магическим образом устраняет сложность программирования. Как замечали многие, в том числе упомянутые выше Брукс и Дейкстра, «серебряной пули не существует» — независимо от того, какой парадигмы программирования придерживается разработчик, создание нетривиальной сложной программной системы всегда сопряжено со значительными затратами интеллектуальных ресурсов и времени. Из наиболее квалифицированных специалистов в области ООП никто, как правило, не отрицает справедливость критики этого типа. 2. Оспаривание эффективности разработки методами ООП. Критики оспаривают тезис о том, что разработка объектно-ориентированных программ требует меньше ресурсов или приводит к созданию более качественного ПО. Проводится сравнение затрат на разработку разными методами, на основании которого делается вывод об отсутствии у ООП преимуществ в данном направлении. Учитывая крайнюю сложность объективного сравнения различных разработок, подобные сопоставления, как минимум, спорны. 3. Производительность объектно-ориентированных программ. Указывается на то, что целый ряд «врождённых особенностей» ООП-технологии делает построенные на её основе программы технически менее эффективными, по сравнению с аналогичными необъектными программами. Не отрицая действительно имеющихся дополнительных накладных расходов на организацию работы ООП-программ (см. раздел «Производительность» выше), нужно, однако, отметить, что значение снижения производительности часто преувеличивается критиками. В современных условиях, когда технические возможности компьютеров чрезвычайно велики и постоянно растут, для большинства прикладных программ техническая эффективность оказывается менее существенна, чем функциональность, скорость разработки и сопровождаемость. Лишь для некоторого, очень ограниченного класса программ (ПО встроенных систем, драйверы устройств, низкоуровневая часть системного ПО, научное ПО) производительность остаётся критическим фактором. 4. Критика отдельных технологических решений в ООП-языках и библиотеках. Эта критика многочисленна, но затрагивает она не ООП как таковое, а приемлемость и применимость в конкретных случаях тех или иных реализаций её механизмов. Одним из излюбленных объектов критики является язык C++, входящий в число наиболее распространённых промышленных ООП-языков. 2.3 Производительность объектных программГради Буч указывает на следующие причины, приводящие к снижению производительности программ из-за использования объектно-ориентированных средств: 1. Динамическое связывание методов. Обеспечение полиморфного поведения объектов приводит к необходимости связывать методы, вызываемые программой (то есть определять, какой конкретно метод будет вызываться) не на этапе компиляции, а в процессе исполнения программы, на что тратится дополнительное время. При этом реально динамическое связывание требуется не более чем для 20 % вызовов, но некоторые ООП-языки используют его постоянно. 2. Значительная глубина абстракции. ООП-разработка часто приводит к созданию «многослойных» приложений, где выполнение объектом требуемого действия сводится к множеству обращений к объектам более низкого уровня. В таком приложении происходит очень много вызовов методов и возвратов из методов, что, естественно, сказывается на производительности. 3. Наследование «размывает» код. Код, относящийся к «оконечным» классам иерархии наследования (которые обычно и используются программой непосредственно) — находится не только в самих этих классах, но и в их классах-предках. Относящиеся к одному классу методы фактически описываются в разных классах. Это приводит к двум неприятным моментам: Снижается скорость трансляции, так как компоновщику приходится подгружать описания всех классов иерархии. Снижается производительность программы в системе со страничной памятью — поскольку методы одного класса физически находятся в разных местах кода, далеко друг от друга, при работе фрагментов программы, активно обращающихся к унаследованным методам, система вынуждена производить частые переключения страниц. 1. Инкапсуляция снижает скорость доступа к данным. Запрет на прямой доступ к полям класса извне приводит к необходимости создания и использования методов доступа. И написание, и компиляция, и исполнение методов доступа сопряжено с дополнительными расходами. 2. Динамическое создание и уничтожение объектов. Динамически создаваемые объекты, как правило, размещаются в куче, что менее эффективно, чем размещение их на стеке и, тем более, статическое выделение памяти под них на этапе компиляции. Несмотря на отмеченные недостатки, Буч утверждает, что выгоды от использования ООП более весомы. Кроме того, повышение производительности за счёт лучшей организации ООП-кода, по его словам, в некоторых случаях компенсирует дополнительные накладные расходы на организацию функционирования программы. Можно также заметить, что многие эффекты снижения производительности могут сглаживаться или даже полностью устраняться за счёт качественной оптимизации кода компилятором. Например, упомянутое выше снижение скорости доступа к полям класса из-за использования методов доступа устраняется, если компилятор вместо вызова метода доступа использует инлайн-подстановку (современные компиляторы делают это вполне уверенно). 3. Практическая часть3.1 Описание предметной областиПерейдем к разработке класса «Учет успеваемости студентов». Для этого первоначально опишем предметную область. 1. Каждый студент имеет фамилию и имя, личные данные и средний балл. 2. Пусть в нашей группе учится 20 студентов. 3. Каждый из студентов может сменить фамилию, личные данные, а также средний балл тоже может измениться. 4. Необходимо иметь возможность находить студентов с самым большим средним баллом, самым меньшим среднем баллом и баллом определенной величины. 3.2 Проектирование классаДля представления предметной области необходим класс student. Опишем его подробно. class student{ int id, char* soname, char* name, char* phone, float bal, } Подробно опишем каждое из полей класса student. id – идентификатор студента. У каждого студента свой личный идентификатор. Данное поле меняться не должно. Поэтому достаточно функции, которая будет только устанавливать идентификатор судента. soname – фамилия студента. Данное поле может меняться, следовательно, необходимо создать специальные функции, которое будут изменять содержимое этого поля. name – имя студента. Данное поле меняться не должно. Поэтому достаточно функции, которая будет устанавливать имя студента. phone – номер телефона студента. В любой момент времени предполагается, что студент будет иметь ровно 1 номер телефона. Данное поле может меняться, следовательно, необходимо создать специальные функции, которое будут изменять содержимое этого поля. bal – средний балл студента. Данное поле может меняться, следовательно, необходимо создать специальные функции, которое будут изменять содержимое этого поля. Все поля: soname, name, phone, bal являются внутренними переменными класса – private. Эти переменные доступны только внутри самого класса. К этим переменным нельзя обратиться. 3.3 Проектирование методов классаДополним разработанный класс всеми необходимыми методами для работы с внутренними переменными класса. Спроектируем конструктор класса. В объектно-ориентированном программировании конструктор класса специальный блок инструкций, вызываемый при создании объекта. Конструктор схож с методом, но отличается от метода тем, что не имеет явным образом определённого типа возвращаемых данных, не наследуется, и обычно имеет различные правила для рассматриваемых модификаторов. Конструкторы часто выделяются наличием одинакового имени с именем класса, в котором объявляется. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в «правильном» состоянии. Неизменяемые объекты тоже должны быть проинициализированы конструктором. Имя класса всегда совпадает с конструктором. Конструктор ничего не возвращает. В нашем случае конструктор только инициализирует внутренние переменные класса. student (int id, char* s, char* n, char* p, float b = 0) { this->id = id; this-> soname = s; this-> name = n; this-> phone = p; this-> bal = b; } Добавим в класс все необходимые методы. Это методы, которые устанавливают значение внутренним переменных и извлекают их из класса. /*функция возвращает фамилию студента*/ char* getSoname (){ return this-> soname; } /*функция возвращает имя студента*/ char* getName (){ return this-> name; } /*функция возвращает телефон студента*/ char* getPhone (){ return this-> phone; } /*функция возвращает идентификатор студента*/ int getId (){ return this-> id; } /*функция возвращает средний балл студента*/ float getBal (){ return this-> bal; } /*функция устанавливает фамилию студента*/ void setSoname (char* s){ this-> soname = s; } /*функция устанавливает имя студента*/ void setName (char* n){ this-> name = n; } /*функция устанавливает идентификатор студента*/ void setId (int id){ this-> id = id; } /*функция устанавливает средний балл студента*/ void setBal (float b){ this-> bal = b; } ЗаключениеПри выполнении курсовой работы были решены следующие задачи: 1. Изучены теоретические основы объектно-ориентированного программирования, 2. Рассмотрена история развития объектно-ориентированного программирования, 3. Проанализированы принципы объектно-ориентированного программирования, 4. Проанализированы различные цитаты об объектно-ориентированном программировании; 5. Применены на практике принципы объектно-ориентированного программирования, 6. Создано приложения на языке С++: класс «Учет успеваемости студентов», 7. Разработанный класс отлажен. Объектно-ориентированное программирование является в настоящее время основой всей индустрии прикладного программирования благодаря выигрышу в конкурентной борьбе с альтернативными технологиями программирования. В промышленном программировании только в системном программировании позиции объектно-ориентированного программирования еще не очень сильны. Поэтому, с одной стороны, теоретические рассуждения о непригодности объектно-ориентированного программирования не соответствуют наблюдаемой на практике ситуации. С другой стороны, нельзя считать, что объектно-ориентированное программирование во всех случаях является наилучшей из методик программирования. Процедурное программирование лучше подходит для случаев, когда важны быстродействие и потребляемые ресурсы, объектное - когда важна управляемость проекта и его модифицируемость, а также безопасность программ. Процедурное программирование обычно лучше подходит для небольших проектов, объектное - для больших. С точки зрения автора, использование объектно-ориентированного программирования является хорошим решением при разработке крупных программных проектов. Чем проект объемнее и сложнее, тем больше выгоды вы получите при использовании объектно-ориентированной технологии программирования. Одним из наибольших преимуществ объектно-ориентированного программирования является возможность многократного использования программного кода. Если вы, к примеру, создали класс, то можете порождать от него новые классы и изменять их свойства и функциональное назначение. Список литературы 1. Ахо А., Ульман Дж. «Теория синтаксического анализа, перевода и компиляции» в 2 тт., том 1., М., Мир, 1978. 2. Бадд Т. Объектно-ориентированное программирование в действии = An Introduction to Object-Oriented Programming. — СПб.: «Питер», 2007. — 464 с. 3. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ / Пер. И.Романовский, Ф.Андреев. — 2-е изд. — М., СПб.: «Бином», «Невский диалект», 2008. — 344 с. 4. Дейкстра Э. Заметки по структурному программированию.- М.:Дрофа, 2006, - 455 с. 5. Ершов А.П. Введение в теоретическое программирование.- М.:РОСТО, 2008, - 288 с. 6. Захарова И.Г. Информационные технологии в образовании: Учеб. пособие для студ. высш. пед. учеб. заведений. – М.: Издательский центр «Академия», 2003. – 192 с. 7. Кнут Д. Искусство программирования для ЭВМ, т.1. М.: 2006, 735 с. 8. Коган Д.И., Бабкина Т.С. «Основы теории конечных автоматов и регулярных языков. Учебное пособие» Издательство ННГУ, 2002. - 97 с. 9. Майерс Г. Надежность программного обеспечения.- М.:Дрофа, 2008, - 360 с. 10. Мендельсон Э. Введение в математическую логику, М.:Инси, 2001, - 320 с. 11. Рудаков А. В. Технология разработки программных продуктов. М.:Издательский центр "Академия", 2006. – 306 с. 12. Свешникова Е.Ю. Анализ режимов детерминированного хаоса в переходных процессах электроэнергетических систем. М.:Издательство «Агат», 2008. - 181 с. 13. Тыугу, Э.Х. Концептуальное программирование. - М.: Наука, 2001, - 256 с. 14. Хопкрофт Дж., Мотвани Р., Ульман Дж. «Введение в теорию автоматов, языков и вычислений» - М.: Издательство ВИЛЬЯМС, 2002. - 527с. 15. Хьюз Дж., Мичтом Дж. Структурный подход к программированию. -М.:Мир, 2000, - 278 с. |