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

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

Содержание:

Введение

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

Принцип управления сложными системами известен еще со времен Древнего Рима - divide et impera (разделяй и властвуй). При проектировании сложных программных систем необходимо ее разделять на все меньшие и меньшие подсистемы, каждую из которых можно создать и совершенствовать независимо. Такой процесс называется декомпозиция.

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

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

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

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

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

Цель работы изучить Основные понятия объектно-ориентированного программирования

Задачи работы – изучить:

Парадигму ООП

Классы в ООП

Основные понятия ООП

Глава 1. Основные определения ООП

1.1 Парадигма ООП

Технология программирования - это набор правил, приемов и методов, которые помогут программисту представить себе реальные вещи абстрактными, чтобы затем "запечателеть" их в тексте на каком-либо языке программирования. Формализовать, описать и промоделировать процессы и явления реального мира [3]. 

Парадигма - набор правил и принципов для анализа явления или задачи, проектирования программы и непосредственно ее реализации на языке. Парадигма - это "взгляд на мир".

Объектно-ориентированное программирование (как расшифровывается ООП) – это, прежде всего, парадигма программирования.

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

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

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

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

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

Первым объектно-ориентированным языком был Simula (Симуляция реальных систем), который был разработан в 1960 году исследователями из Норвежского вычислительного центра.

В 1970 году Алан Кей и его исследовательская группа в Xerox PARC создали персональный компьютер по имени Dynabook и первый чистый объектно-ориентированный язык программирования (OOPL) – Smalltalk, для программирования Dynabook.

В 1980-х Грэди Буч опубликовал статью под названием «Объектно-ориентированный дизайн», в которой в основном представлен дизайн для языка программирования Ada. В последующих изданиях он расширил свои идеи до полного метода объектно-ориентированного проектирования.

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

Первым объектно-ориентированным языком был Simula (Симуляция реальных систем), который был разработан в 1960 году исследователями из Норвежского вычислительного центра.

В 1970 году Алан Кей и его исследовательская группа в Xerox PARC создали персональный компьютер по имени Dynabook и первый чистый объектно-ориентированный язык программирования (OOPL) – Smalltalk, для программирования Dynabook.

В 1980-х Грэди Буч опубликовал статью под названием «Объектно-ориентированный дизайн», в которой в основном представлен дизайн для языка программирования Ada. В последующих изданиях он расширил свои идеи до полного метода объектно-ориентированного проектирования.

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

Другими значительными нововведениями стали «Методы объектного моделирования» (OMT) Джеймса Рам Боуг и «Объектно-ориентированная программная инженерия» (OOSE) Ивара Якобсона .

Парадигма ОПП лежит в основе многих мейнстримовых языков. ОО-языки: C++, С#, Java, JavaScript, Objective-C, Python, PHP, Perl, Ruby, Scala, Swift и др. То есть топовые языки, ряд языков общего назначения, языки для Android-, веб- и iOS-разработки. Популярные современные языки – мультипарадигмальные, по принципам ООП можно писать и на языках с другими парадигмами.

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

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

Определение Гради Буча гласит: “Объектно-ориентированное программирование – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости”.

Буч отметил также ряд преимуществ ООП.

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

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

• Объектная модель вполне естественна, поскольку в первую очередь ориентирована на человеческое восприятие мира, а не на компьютерную реализацию.

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

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

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

1.2 Классы и методы

Класс – это описание объектов, представителей класса: отличительные признаки, состояния, взаимодействия. Что это, из чего это состоит, что можно с этим делать и как именно? У классов и объектов есть атрибуты, данные (Data) и методы, то есть функции для управления данными.

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

Иерархия: модули классов; базовый класс (класс описывает свойства объектов, содержит множество объектов, подклассов), производный класс (наследует свойства родительского класса и тоже содержит объекты); отдельно взятый объект (данные/Data, описывающие свойства объекта, + методы, то есть функции для работы с объектом, алгоритмы управления, действия, которые выполняет объект).

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

Совокупность тех методов класса, которые доступны и другим классам, называются интерфейсом. Чтобы тренировать объектное мышление, можно проводить аналогии с работой физических объектов и систем (с приборной доской в самолете, с пультом управления, с домофоном или лифтом в многоквартирном доме). Методы могут быть публичными и инкапсулированными, то есть скрытыми. По аналогии: панель управления в машине – на виду (интерфейс класса), а детали под капотом работают скрыто (так называемый «черный ящик»).

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

// Ключевое слово public (публичный) означает, что метод или атрибут доступен извне класса;

// ключевое слово protected (защищённый) – что метод или атрибут доступен только внутри

// класса и его «потомков»

class Point

{
public:
// Метод создания («конструктор»), имеющий параметры абсцисса и ордината
Point(double rX, double rY);

// Метод чтения абсциссы

double Get_X();

// Метод чтения ординаты

double Get_Y();

// Метод изменения абсциссы

void Set_X(double rX);

// Метод изменения ординаты

void Set_Y(double rY);

protected:
// Вещественная переменная, представляющая атрибут абсцисса

double m_rX;

// Вещественная переменная, представляющая атрибут ордината

double m_rY;

};
// Префикс m_ принято употреблять для именования атрибутов, иначе называемых
// «членами» (англ. member) класса, чтобы было проще отличать их от других переменных в

// коде реализации методов

class ColorPoint : public Point

{
public:
// Конструктор, имеющий параметры абсцисса, ордината, цвет

ColorPoint(double rX, double rY, long rgbColour);

// Метод чтения цвета

long GetColor();

// Метод изменения цвета

void SetColor(long rgbColor);

protected:
// Целая переменная, представляющая цвет точки – дополнительный атрибут

long m_rgbColor;

};
Объявление класса задаёт тип данных, который может быть использован при определении других классов. Напр., класс “круг” (class Circle) может иметь атрибут “центр” типа “точка” (Point m_center):

class Circle

{
public:
// Метод создания, имеющий параметры центр и радиус

Circle(Point ptCenter, double rRadius); // Далее объявления некоторых методов для работы с кругом// …protected:

Point m_center; // Вещественная переменная, представляющая радиус

double m_rRadius; };

Члены класса

Членами класса могут быть функции. • Функции-члены - это, функции которые манипулируют данными-членами класса.

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

• Функции-члены могут быть определены внутри или вне (С++) объявления класса. Функции-члены, определенные вне класса, могут быть сделаны inline. Функция, описанная внутри класса, является по определению встраиваемой. Синтаксис для реализации метода вне объявления класса: тип_возвращаемого_значения ИмяКласса::ИмяМетода(Список Аргументов) { Реализация_Метода };

• Функции-члены могут обращаться к полям или функциям-членам, объявленным после них.

• Функции-члены имеют неявно объявленную переменную this.

• Функции-члены могут быть static. Такие функции могут непосредственно обращаться и изменять статические поля класса. Статические Функции-члены класса не могут быть объявлены const или virtual. К таким функциям можно обращаться через имя класса, а не через имя конкретного экземпляра объекта.

• Функции-члены могут быть объявлены как const, что не позволяет им изменять значение и возвращать неконстантную ссылку или указатель на любое поле класса. Такие Функции-члены не могут быть статическими. Данные члены и управление доступом к элементам классов

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

• Данные-члены могут находиться в закрытой (private), защищенной (protected) или открытой (public) части класса.

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

Статические поля могут быть инициализированы; если нет, то инициализируется значением ноль.

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

Описание класса

Описание класса начинается с ключевого слова class. Список членов класса определяет собственные элементы класса. При описании членов классов возможно указание атрибутов управления доступом (модификаторов доступа) к элементам классов. Такими атрибутами являются:

• public: члены класса видны извне класса • protected: члены класса видны в производном классе

• private: соответствующие элементы могут использоваться только внутри класса По умолчанию элементы класса имеют тип private.

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

1.3 Параметризованные функции

Исключения и их обработка.

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

Язык C++ определяет стандарт обслуживания исключений в рамках ООП. C++Builder предусматривает специальные механизмы для обработки исключений (ошибок), которые могут возникнуть при использовании Библиотеки Визуальных Компонент.

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

Переброс исключений (exception throwing) позволяет собрать в точке переброса информацию, которая может оказаться полезной для диагностики причин, приведших к нарушению нормального хода выполнения программы. Обслуживаются только так называемые синхронные исключения, которые возникают внутри программы. Такие внешние события, как нажатие клавиш Ctrl+C, не считаются исключениями.

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

1. Программа ищет подходящий обработчик исключения.

2. Если обработчик найден, стек очищается и управление передается обработчику исключения.

3. Если обработчик не найден, вызывается функция terminate для завершения приложения. Блок кода, который обрабатывает возникшее исключение, начинается ключевым словом catch и заключается в фигурные скобки. По меньшей мере один кодовый блок обработчика исключения должен следовать непосредственно за блоком try.

Для каждого исключения, которое может сгенерировать программа, должен быть предусмотрен свой обработчик. Обработчики исключений просматриваются по порядку и выбирается обработчик исключения, тип которого соответствует типу аргумента в операторе catch.

При отсутствии в теле обработчика операторов goto, выполнение программы будет возобновлено, начиная с точки, следующей за последним обработчиком исключений данного блока try.

Если необходимо обработать возможное исключение фрагмент программы заключается в блок try. Блок try имеет вид try { // текст программы } В случае возникновения исключения управления передается обработчикам исключений catch или __finally. Операторы внутри catch выполняются только в случае возникновения исключения, т.е., если исключения не случилось – его операторы не выполняются вообще.

В C++Builder обработчик исключений catch лучше применять в виде catch(const Exception *E) { ShowMessage(AnsiString(E->ClassName())+ E->Message); } или catch(…) { ShowMessage(“Что-то случилось”); } Операторы внутри __finally выполняются всегда, в т.ч. и при возникновении исключения. __finally { // выполнится всегда }

2. Принципы ООП

Главные принципы в ООП – абстрагирование, инкапсуляция, наследование и полиморфизм.

Объектно-ориентированный анализ выполняется на основе определенного набора принципов:

2.1 Абстракция

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

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

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

В C ++ используем классы для определения наших собственных абстрактных типов данных (ADT). Вы можете использовать объект cout класса ostream для потоковой передачи данных на стандартный вывод следующим образом:

#include <iostream>

using namespace std;

int main() {

cout << "Hello C++" <<endl;

return 0;

}

Здесь не нужно понимать, как cout отображает текст на экране пользователя. Вам нужно знать только открытый интерфейс, а базовая реализация «cout» может быть изменена.

Доступ к ярлыкам для выполнения абстракции

В C ++ используем метки доступа для определения абстрактного интерфейса для класса. Класс может содержать ноль или более ярлыков доступа -

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

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

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

Преимущества абстракции данных

Абстракция данных обеспечивает два важных преимущества -

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

Реализация класса может развиваться со временем в ответ на изменение требований или отчетов об ошибках без изменения кода пользователя.

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

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

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

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

Объявление класса на С++:

class Point

{
public:
Point(double rX, double rY);

double Get_X();

double Get_Y();

// Метод поворота с параметром «угол»

void Rotate(double rAngle);

protected:
double m_rX;

double m_rY;

};

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

2.3 Модульность

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

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

предоставляющий удобный интерфейс, максимально скрывающий (инкапсулирующий) детали реализации;

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

Модульность является базовым принципом в программировании (не является особенностью ООП).

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

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

Рассмотрим модульность с разных точек зрения. Метод проектирования, который можно называть "модульным", должен удовлетворять пяти основным требованиям:

[x]. Декомпозиции (decomposability).

[x]. Композиции (composability).

[x]. Понятности (understandability).

[x]. Непрерывности (continuity).

[x]. Защищенности (protection).

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

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

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

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

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

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

2.4 Сохраняемость и Параллелизм

Сохраняемость - возможность объекта сохранять информацию о своем состоянии, а затем при необходимости восстанавливать его.

Параллелизм - организация жизни и взаимодействия объектов.

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

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

Уровень потоков. Задачи разбиваются на части, которые могут выполняться параллельно (потоки). Данный уровень достигается на параллельных ВС.

Уровень команд. Несколько команд выполняются параллельно, в процессоре размещаются сразу несколько конвейеров. Характерен для суперскалярных процессоров.

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

Понятие уровня параллелизма тесно связано с понятием гранулярности. Гранулярность — мера отношения объема вычислений, выполненных в параллельной задаче, к объему коммуникаций (для обмена сообщениями). Степень гранулярности варьируется от мелкозернистой до крупнозернистой. Закон Амдала ориентирован на крупнозернистый
параллелизм.

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

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

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

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

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

Если класс В обладает всеми свойствами класса А и еще имеет дополнительные свойства, то класс А называется базовым (предком, родительским классом), а класс В – подклассом (наследником, производным классом) класса А. Процесс построения иерархии классов очень напоминает процесс построения генеалогических деревьев в реальном мире.

Наследование свойств только одного базового класса называется одиночным (простым) наследованием, а параллельное наследование свойств сразу нескольких базовых классов называется множественным (кратным) наследованием. В С++ возможны оба варианта наследования классов, а в Java и C# – только одиночное наследование, для реализации множественного наследования там применяется другой механизм.

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

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

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

Объектно-ориентированное программирование предложило дополнительный вид отношений между модулями — наследование. Очень подробно этот механизм рассматривается Б. Мейером — он выделяет 12 видов наследования [5], однако, на практике чаще всего применяют наследование, реализующее отношения «является» (is-a, открытое наследование) … [6]. Мак-Колм рассматривает наследование как базовый шаблон проектирования, при этом имеет ввиду is-a-наследование [7].

Принцип подстановки (LSP) изначально сформулирован Барбарой Лисков и регламентирует правильное использование механизма наследования. Выделяются некоторый базовый тип и его подтип (класс-наследник). Согласно LSP, программы должны быть написаны таким образом, чтобы в любом месте вместо базового типа мог быть подставлен подтип. Это означает, что классы наследники должны реализовывать интерфейс согласованно с интерфейсом базового класса. [2]

При выборе отношений между своими классами можно руководствоваться следующим базовым правилом:

если один класс реализует свои функции за счет использования функций другого — применяйте отношение включения;

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

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

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

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

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

К примеру, в операции "a + b" в зависимости от типов a и b знак операции «+» может обозначать операцию сложения целых, сложения вещественных, объединения множеств или сцепления строк (при желании можно считать, что их имя — знак "+").

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

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

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

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

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

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

Заключение

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

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

использование более естественных с точки зрения обычной повседневной практики понятий, простота введения новых понятий;

упрощение разработки многократно используемых компонент приложений;

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

возможность создания библиотеки классов; в частности, библиотека визуальных компонент Delphi и является примером такой библиотеки [8];

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

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

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

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

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

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

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

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

Список литературы

  1. Вайсфельд, М. Объектно-ориентированное мышление / М. Вайсфельд. - М.: Питер, 2017. - 338 c.
  2. Васильев, А. Н. Java. Объектно-ориентированное программирование / А.Н. Васильев. - М.: Питер, 2016. - 400 c.
  3. Васильев, Алексей C#. Объектно-ориентированное программирование / Алексей Васильев. - М.: Питер, 2016. - 320 c.
  4. Иванова, Г. С. Объектно-ориентированное программирование / Г.С. Иванова, Т.Н. Ничушкина, Е.К. Пугачев. - М.: МГТУ им. Н. Э. Баумана, 2015. - 368 c.
  5. Кьоу, Дж. Объектно-ориентированное программирование / Дж. Кьоу, М. Джеанини. - М.: Питер, 2015. - 240 c.
  6. Лафоре, Р. Объектно-ориентированное программирование в C / Р. Лафоре. - М.: СПб: Питер; Издание 4-е, 2016. - 928 c.
  7. Лафоре, Р. Объектно-ориентированное программирование в С++ / Р. Лафоре. - М.: Питер, 2015. - 928 c.
  8. Лесневский, А. С. Объектно-ориентированное программирование для начинающих (+ CD-ROM) / А.С. Лесневский. - М.: Бином. Лаборатория знаний, 2016. - 232 c.
  9. Павловская, Татьяна C/C++. Процедурное и объектно-ориентированное программирование. Учебник / Татьяна Павловская. - М.: Питер, 2015. - 496 c.
  10. Санников, Е. В. Курс практического программирования в Delphi. Объектно-ориентированное программирование / Е.В. Санников. - Москва: Наука, 2017. - 188 c.
  11. Шакин, В.Н. Объектно-ориентированное программирование на Visual Basic в среде Visual Studio .Net / В.Н. Шакин, А / В.Н. Шакин, Г.К. Сосновиков, З. - Москва: РГГУ, 2015. - 118 c.