#4 принципы ооп.pptx
- Количество слайдов: 30
Принципы ООП, метамодель, классы, управление памятью Степанюк Константин Сергеевич 24 const@gmail. com
Задачи I. Описать класс Fractional. Number Класс представлен двумя полями: целая часть (integer) – целое число со знаком, дробная часть (fractional) – целое беззнаковое число. II. Описать класс Point Класс представлен двумя полями: координатами x и y - целые числа со знаком. 1) описать модификаторы класса 2) описать селекторы класса
Объектная модель – основные принципы q. Главные принципы: – Абстрагирование – Инкапсуляция – Модульность – Иерархия q. Дополнительные принципы: – Типизация – Параллелизм – Сохраняемость
Абстрагирование – определения • Хоар: проявляется в нахождении сходств между определенными объектами, ситуациями и процессами реального мира и принятии решений на основании этих сходств, отвлекаясь на время от имеющихся различий • Шоу: упрощенное описание или изложение системы, при котором одни свойства и детали выделяются, а другие – опускаются. Хорошей является та абстракция, которая подчеркивает детали существенные для рассмотрения и использования, и опускает те, которые на данный момент не существенны. • Берзинс, Грей, Науман: идея квалифицируется как абстракция, только если может быть изложена, понята и проанализирована независимо от механизма, которые будет в последствии использован для ее реализации
Абстрагирование (Буч) • Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от других видов объектов и, каким образом, четко определяет его концептуальные границы с точки зрения наблюдателя • Абстрагирование концентрирует внимание на внешних характеристиках объекта и позволяет отделить наиболее существенные особенности его поведения от менее существенных • Граница между существенными и несущественными с точки зрения разрабатываемой программной системы особенностями поведения объекта называется барьером абстракции • Главная задача проектирования – выделение полного и достаточного набора абстракций
Абстрагирование – виды абстракций • Абстракции сущности – объект представляет собой полезную модель сущности в предметной области • Абстракция поведения - объект состоит из обобщенного множества операций • Абстракция виртуальной машины – объект группирует операции, которые вместе используются более высоким уровнем правления, либо сами используют некоторый набор операций более низкого уровня • Произвольная абстракция – объект включает в себя набор операций, не имеющих друг с другом ничего общего • Правило единственности абстракции (ORR – one responsibility rule) – класс должен обладать единственной ответственностью, реализуя ее полностью, реализуя ее хорошо и реализуя только ее
Выделение абстракций Шлаер и Меллор: • Осязаемые предметы – Автомобили, телеметрические данные, датчики давления • Роли – Мать, учитель, политик • События – Посадка, прерывание, запрос • Взаимодействие – Заем, встреча, пересечение
Выделение абстракций Росс (моделирование БД): • Люди – Человеческие существа, выполняющие некоторые функции • Места – Области, связанные с людьми или предметами • Предметы – Осязаемые материальные объекты или группы объектов • Организации – Формально организованная совокупность людей, ресурсов, оборудования • Концепции – Принципы и идеи предназначенные для организации деятельности и/или общения • События – Нечто, случающееся с чем-то в заданное время или последовательно
Выделение абстракций Коад и Йордан: • Структуры – Отношения «целое-часть» • Другие системы – Внешние системы, с которыми взаимодействует приложение • Устройства – Устройства, с которыми взаимодействует приложение • События – Происшествия, которые должны быть запомнены • Разыгрываемые роли – Роли, которые исполняют пользователи • Места – Здания, офисы и другие места, существенные для работы приложения • Организационные единицы – Группы к которым принадлежат пользователи
Инкапсуляция • Инкапсуляция – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации • Интерфейс отражает внешнее поведение абстракции, специфицируя поведение всех объектов данного класса • Внутренняя реализация описывает представление абстракции и механизмы достижения желаемого поведения объекта Интерфейс абстракции определяет ее ответственность, и должен по возможности оставаться стабильным Внутренняя реализация может быть изменена и не вызывает проблем пока не влияет на семантику интерфейса
Модульность • Модульность – это свойство системы, которая была разложена на внутренне связные, но слабо связные между собой модули. • Правильное разбиение программы на модули является столь же важной задачей, что и выбор правильного набора абстракций • В ООП модули выполняют роль физических контейнеров и области определения для типов. • Модуль является минимальной единицей переиспользования и размещения • Принцип инверсии зависимостей (DIP – dependency inversion principle) – модули высокого уровня не должны зависеть от модулей низкого. И те и другие должны зависеть от абстракций
Иерархия – это упорядочивание абстракций путем расположения их по уровням Виды иерархических отношений: – Иерархии классов (отношение «is a» ) – отношение вида родитель-потомок, общее-частное. Реализуется с помощью наследования типов (генерализации) – Иерархии объектов (отношение «part of» ) – отношение вида целое часть. Реализуется агрегацией и композицией – Отношение между классами и родовыми компонентами (отношение «is like» ). Позволяет порождать целые семейства подобных типов
Типизация • Типизация – это способ защититься от использования объектов одного класса вместо другого, или по крайней мере управлять таким использованием • Статическое связывание – тип адресуемого объекта ровно как и тип результата выражения определен еще на стадии компиляции • Динамическое связывание – тип адресуемого объекта определяется во время исполнения • Виртуальный полиморфизм – союз типизации, наследования и динамического связывания – является важнейшим средством ООП • Параметрический полиморфизм – возможность задания нескольких функций (методов) или шаблонов функций и классов с одинаковыми именами но разными по типам и количеству аргументами • Java и С++ – строго типизированные языки с динамическим связыванием • Примечание: не путать с понятиями динамической и статической типизации
Типизация • Динамическая типизация - приём, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов • Статическая типизация – приём, при котором переменная, параметр подпрограммы, возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменён позже
Взаимоотношения между объектами • Ассоциация (связь) – отношение, позволяющее реализовать взаимодействие клиент-сервер • Агрегация (композиция) – отношение служащие для определения понятия целое-часть и служащее для организации иерархий объектов Ассоциация означает наличие физической связи между объектами (по ссылке или с использованием «глобальной» видимости) и позволяет объекту-клиенту (инициатору взаимодействия) вызвать метод у объекта-сервера (адресата взаимодействия) Агрегация является частным случаем ассоциации (объект-целое имеет физическую связь со своими составляющими напрямую по ссылке либо с использованием объекта-контейнера)
Многоуровневое моделирование • Моделируемая система представляется в виде совокупности взаимодействующих между собой объектов во время исполнения программы в памяти ЭВМ • Объекты описываются в терминах классов на языке программирования и в системах моделирования • Класс (от лат. classis — группа) в классификации — группа предметов или явлений, обладающих общими признаками. • Класс в программировании – множество объектов имеющих общую структуру и поведение. Объекты – суть экземпляры классов
Средства метапрограммирования C++ • Статические переменные-члены и методы являются общими для всех экземпляров класса и таким образом, позволяют реализовывать состояние и поведение класса как такового по аналогии с состоянием и поведением объекта • Средства обобщенного программирования – шаблоны классов (родовые компоненты). Позволяют порождать родственные классы • Инстанцирование объектов – создание объекта на основе класса • Инстанцирование шаблонов – создание класса на основе шаблона класса
Структура класса Класс задается своим типом (именем класса), информацией о суперклассе и реализуемых интерфейсах, а также своими членами: • Полями и методами экземпляра (реализуют свойства объекта) • Статическими полями и методами класса (реализуют собственно свойства и поведение самого класса) • Внутренними абстракциями (вложенные и внутренние классы и интерфейсы, как правило, не используемые извне класса)
Классы и инкапсуляция Существуют следующие уровни доступа к членам класса: • Открытый (public) – члены с данным уровнем доступа видимы всем клиентам класса • Защищенный (protected) – члены этого уровня видимы самому классу, его подклассам и абстракциям (классам и интерфейсам) находящимся с ним в одном пакете (java) • Пакетный (по умолчанию – только java) – члены этого уровня доступны только самому классу и абстракциям, находящимся с ним в одном пакете • Закрытый (private) – члены данного уровня видны только изнутри самого класса (в java в том числе изнутри внутренних классов, в C++ - нет)
Абстрактные классы, интерфейсы и утилиты • Абстрактный класс – класс, содержащий объявленные но не определенные методы. Экземпляры абстрактного класса не могут быть созданы. Возможно объявить лишь ссылки (или указатели) имеющими своим типом абстрактный класс • Интерфейс – вырожденный абстрактный класс, содержащий только объявления методов и статические константны. • Класс-утилита – класс, в котором определены только статические члены. Как правило такие классы используются для объединения родственных алгоритмов
Управление памятью Типы памяти в С++: • статическая (глобальные переменные, переменные пространств имен, статические члены классов и статические переменные функций); выделением статической памяти занимается компоновщик • автоматическая (аргументы функций и локальные переменные, которые автоматически создаются и уничтожаются); автоматической памятью управляет компилятор • свободная (динамическая) – куча. Свободной памятью управляет программист в коде программы с помощью new, delete, malloc, free
Различие C и C++ в управлении памятью язык C: static int i; // статическая память f( int a) { //автоматическая память int j = 0; //автоматическая память static int k = 1; // статическая память } //динамическая память – неудобно и не типизированно int *p = (int*) malloc (sizeof(int)); free (p); язык C++ (динамическая память): string *str. Arr 1 = static_cast
Выделение памяти под массивы new[] выделяет чуть больше памяти чем нужно для размещения всех элементов массива – дополнительно хранится информация о размере массива int a[] = new int[10]; delete a; //Неправильно! Удалится только a[0] delete[] a; //Правильно! безопасно вызывать delete на нулевом указателе int *p = 0; delete p; //Ok! delete[] p; //Ok! • • при создании массива вызываются конструкторы по умолчанию для всех элементов массива. при удалении массива вызываются деструкторы для всех элементов массива
Что происходит на самом деле void* operator new (size_t) throw(bad_alloc); void* operator new[] (size_t) throw (bad_alloc); void operator delete (void* ) throw(); void operaror delete[] (void* ) throw(); • что происходит при вызове My. Class *p = new My. Class() 1. 2. вызывается operator new (sizeof(My. Class)) вызывается конструктор My. Class() • при вызове delete (p) 1. 2. • вызывается деструктор ~My. Class() вызывается operator delete (p) вызываемые операторы operator new и operator delete можно перегрузить в классе
Создание и уничтожение объектов 1) именованный автоматический объект Class. A func(Class. A a) { Class. A another = a; Class. A a 2(5); return another; } //вызывается конструктор копии для аргумента //конструктор копии Class. A(const Class. A&) //конструктор Class. A(int) //уничтожаются a, a 2 и another 2) объект в свободной памяти (new, delete) Class. A *p = new Class. A(); //конструктор по умолчанию Class. A() Class. A *p 2 = new Class. A(5); //конструктор Class. A(int) … delete p; //деструктор ~Class. A() delete p 2; //деструктор ~Class. A()
Создание и уничтожение объектов 3) нестатический член-объект – композиция class A {…}; class C { A a; … }; void f () { C c; C *pc = new C(); delete pc; return; } //вызывается A(), потом C() // вызывается A() и C() //вызываются ~C(), потом ~A() // вызываются ~C(), потом ~A()
Создание и уничтожение объектов 4) элемент массива, который создается и удаляется совместно с массивом 5) локальный статический объект в функции создается при первом прохождении потока исполнения void f() { static A a; … return; } int main(int argc, char **argv) { f(); //вызывается A() внутри f(); //A() больше не вызывается }
Создание и уничтожение объектов 6) Глобальные объекты, члены пространств имен, статические члены классов A a(5); namespace Z { A another; } class C { static A m_a; }; A C: : m_a(10); int main(int argc, char **argv) { //Уже созданы объекты a, Z: : another, С: : m_a } // уничтожаются a, Z: : another, C: : m_a 7) временные объекты создаются как часть вычисления выражения и удаляются по завершении выражения string s = “Hello ”+” another ” + “world!”; //(string(“Hello”)+string(“another”))+string(“world!”)
Автоматически генерируемые функции-члены • Существует четыре функции-члена класса, для которых компилятор генерирует код автоматически, если программист не указал их явно: q Конструктор по умолчанию A ( ) q Конструктор копии A ( const A& ) q Оператор присваивания A& operator = ( const A& ) q Деструктор ~A ( ) • Реализации данных функций подразумевают прямое побитовое копирование объектов (для конструктора копии и ператора присваивания) а также вызов конструкторов по умолчанию и деструкторов для полей-членов объекта, т. е. при использовании полей-членов являющихся указателями, генерированный код будет копировать либо уничтожать именно указатели, но не объекты, на которые они ссылаются!
Упражнения class Integer. List { private: int* int. List; // массив целых чисел }; Реализовать: 1) Селекторы и модификаторы 2) Конструктор по умолчанию Integer. List () 3) Конструктор копии Integer. List (const Integer. List&) 4) Оператор присваивания Integer. List& operator= (const Integer. List&) 5) Деструктор ~ Integer. List()