Объектно- ориентированное программирование (ООП)

Презентация:



Advertisements
Похожие презентации
OOП Инна Исаева. Подпрограмма – это большая программа, разделённая на меньшие части. В программе одна из подпрограмм является главной. Её задача состоит.
Advertisements

Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Методология объектно- ориентированного программирования.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Алгоритмический подход – главное алгоритм решения задачи ( в основном, используется для вычислительных задач ); Структурное программирование – декомпозиция,
1 © Luxoft Training 2012 Введение в ООП Модуль #2.
В. Дихтяр ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ (для бакалавров) Российский университет дружбы народов Институт гостиничного бизнеса и туризма Раздел 1.Разработка.
Объектно-ориентированное программирование Объектно-ориентированное программирование (ООП) - основная методология программирования. Она является продуктом.
Объектно-ориентированный подход в языке C#. Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное.
В. И. Дихтяр ИНФОРМАТИКА Российский университет дружбы народов Институт гостиничного бизнеса и туризма Раздел 3Моделирование объектов и процессов и его.
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
Java, каф. ОСУ АВТФ1 Методология ООП В формулировке цели выполнения некоторого проекта (например, разработка ИС) участвуют предметы (объекты)
Конструкторы и Деструкторы Конструкторы - функции, явно предназначенные для инициализации объектов Деструкторы - функция обратная конструктору для обеспечения.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Кафедра ОСУ, Java 2007 Слайд 1 Методология ООП В формулировке цели участвуют предметы (объекты) и понятия реального мира, имеющие отношение.
Классы в C#. Две роли классов Класс Класс – это модуль, архитектурная единица построения программной системы. Модульность построения – основное свойство.
Множественное наследование class A {... }; class B {... }; class C : public A, protected B {... }; !!! Спецификатор доступа распространяется только на.
Принципы объектно-ориентированного программирования Объектная модель Наследование Инкапсуляция Полиморфизм.
Информационные технологии Стандартные библиотечные функции манипулирование данными преобразование и шифрование определение пользователями функций.
Delphi. 11 класс.. Познакомиться с понятиями : Инкапсуляция Интерфейс объекта Классы, экземпляр класса Наследование, иерархия полиморфизм.
Транксрипт:

Объектно- ориентированное программирование (ООП)

Что такое ООП? Объектно-ориентированное программирование (ООП) – это основная методология программирования 90-х годов. Она является продуктом 25 летней практики и включает ряд языков: Simula 67, Smalltalk, Lisp, Clu, Actor, Eiffel, Objective C, C++. Это стиль программирования, который фиксирует поведение реального мира таким способом, при котором детали его реализации скрыты.

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

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

Новая парадигма ООП часто называют новой парадигмой программирования. Другие парадигмы: директивная (структурное программирование - Pascal, C), логическая - Prolog, функциональное - Lisp, Effel. Парадигмы в программировании определяют как проводить вычисления, как работа, выпол-няемая компьютером должна быть струк- тарирована и организована.Но- вички в информатике часто могут освоить парадигму лучше, чем опытные профессионалы, так как этот способ решения задач ближе к естественному восприятию.

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

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

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

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

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

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

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

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

Интерфейс и реализация модуля - принцип Парнаса. Говорят, что компонента инкап- солирует поведение объекта, если она умеет выполнять неко-торые действия, но подроб-ности, как именно она это делает, скрыты. Это приводит к двум представ-лениям о прог-раммной системе. Вид со стороны интерфейса - это лицевая сторона. В интерфейсной части описывается, что умеет делать компонента. Вид со стороны реализации - это изнанка, она определяет, как компонента выполняет задание.

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

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

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

Например, для абстрактного типа данных stack пользователь видит только описание допустимых операций – pop, push, top. С другой стороны программисту, реализующему stack, необходимо манипулировать конкретными структурами данных. Конкретные детали инкапсулированы в более абстрактный объект. Каждый экземпляр имеет свою собственную совокупность переменных. Эти значения не должны изменяться клиентами напрямую, а только с помощью методов, ассоциированных с классом.

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

Разновидности Классов Классы в ООП имеют несколько различных форм и используются для различных целей. Следующие категории охватывают большую часть классов. Управление данными Источник данных и посредники в передаче данных Классы для просмотра данных Вспомогательные или упрощающие проектирование классы.

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

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

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

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

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

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

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

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

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

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

Конструктор копирования Объект класса без конструкторов можно инициализировать путем присваивания ему другого объекта этого класса

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

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

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

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

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

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

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

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

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

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

Для описания иерархии мно- жественного наследования можно использовать прямой ацик- лический граф (ПАГ) (Ориентированный граф наследования без петель). Подкласс может унаследовать протокол одного или более родительских классов. При этом помимо спецификаторов public и private-производных классов, используется дополнительная опция virtual.

Виртуальные базовые классы В прямом ациклическом графе наследования класс может появиться более чем один раз. Рассмотрим ПАГ множественного наследования, приве- денный на рис. Элементы данных (экзем- пляры переменных) класса Parent появ- ляются дважды в классе GrandChild. Первый набор наследуется через Child1, второй - через Child2. Такое наследование бывает нежелательно. Виртуальные базо- вые классы обеспечивают механизм для избежания дублирования элементов в классе, таком как CrandChild

Допустим, класс Parent на самом деле называется Vehicle (транспортное средство). В его протоколе содержится зак- рытое поле данных int topSpeed. Класс Child1 на са- мом деле называется Boat (Корабль), а класс Child2 - называется Plane (самолет). Наконец, класс GrandChild на самом деле называется SeaPlane. Для SeaPlane желательно наследовать Boat::topSpeed и Plane::topSpeed. Объект класса SeaPlane имеет различную предельную скорость в зави- симости от того, действует он как корабль или самолет.

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

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

Окно программы

Процесс создания

Работающая программа