Upload
alexander-gornik
View
1.208
Download
5
Embed Size (px)
DESCRIPTION
Курс лекций для СТАНКИН. 2011 год.
Citation preview
Объектно-ориентированное программирование (ООП)
Разработка бизнес приложений Лекция 6
Разработчик должен знать
• Базовые элементы синтаксиса, процедурное мышление: переменные, if / циклы / функции
• Указатели и работа с памятью (C)• ООП (C++) – объектное мышление• Библиотеки (платформа) и какой-нибудь
язык более высокого уровня (.NET / Java / Пр.)
ЭВОЛЮЦИЯ ПРОГРАММИРОВАНИЯ
Суть эволюции
• Борьба со с возрастающей сложностью• Т.е. человек может оперировать 7 +/- 2
объектами, то использование принципа «разделяй и властвуй» или декомпозиции (инкапсуляции) неизбежно.
• По сути, вся эволюция индустрии разработки заключается в обнаружении повторяющегося кода и его инкапсуляции в какие-то удобные конструкции
Сначала был ассемблер
• Прямое управление ячейками памяти процессора (регистрами)
• Прямой вызов процессорных операций• Очень быстро (быстрее некуда)• Очень сложно, нужно помнить МАССУ
нюансов, плюс процессоро-зависимо• Применение: ОС, драйверы, встроенный
софт, игры (чуть-чуть), BIOS …
Захотелось абстракций
• Элементарные типы данных• Переменные, массивы• Арифметические операторы и логические
операторы• Условный оператор (if), циклы• Все это компилятором (ну или
интерпретатором) преобразуется в ассемблер
Процедуры и функции, стек
Cтека мало
• Стек быстр, но ограничен – вспомним 640 Kb
• Нужно работать с основной памятью– указатели– malloc(), free() – язык C
Структуры, глобальные переменные
• Быстро оказалось что некоторые данные постоянно используются вместе -> структуры– Point (x;y)
• Передавать параметры и получать результаты – недостаточно– Удобно иметь «состояние» системы доступное
из разных функций - глобальные переменные
Процедурное программирование
• Когда программа становится большой, а глобальных переменных – много, держать в голове их состояние становится невозможно, а значит – выполнение функций и отладка непредсказуемы
• Что бы не путаться – разобьем на модули (библиотеки)– область видимости, интерфейс, реализация– т.е. инкапсуляция ряда функций и глобальных
переменных
ООПА дальше?
Класс как эволюция структур
• Было замечено что структуры часто удобно передавать в методы и образуются группы методов работающие с одними и теми же структурами
• Фактически класс – это структура данных объединенная с методами (функциями) ее обработки
• Класс – это пользовательский тип данных, состоящий из полей данных и методов
Объект в теории
• С точки зрения восприятия человеком объектом может быть: – осязаемый и (или) видимый предмет– нечто, воспринимаемое мышлением – нечто, на что направлена мысль или действие.
• Объект может обладать состоянием, поведением, идентичностью
• Очевидно, что с помощью понятия «объект» можно описать все что угодно
Класс как абстракция
• Структура и поведение схожих объектов определяет общий для них класс
• Класс это описание множества объектов:– Структуры данных состояния– Поведения (методов)
• Термины «экземпляр класса» и «объект» взаимозаменяемы.
Стандартные операции
• Операция – это услуга, которую класс (объект) может предоставить своим клиентам.
• На практике типичный клиент совершает над объектами операции пяти видов: – Модификатор - изменяет состояние– Селектор – считывает состояние, но не меняет – Итератор – дает последовательный доступ к частям класса – Конструктор – создание / инициализация объекта – Деструктор – уничтожение объекта (освобождение памяти)
• В различных языках могут быть представлены специальными синтаксическими конструкциями
Инкапсуляция
• Основная идея объекта заключается в том, что он скрывает от взаимодействующих с ним принципы своего устройства, оставляя для клиентов только интерфейс.
• Это и называется инкапсуляция• Инкапсуляция в языках программирования
реализуется с помощью областей видимости:– Основные: public, private, protected
Наследование
• Иногда еще называют генерализацией или расширением, что часто путает
• Наследование выражает отношение классов (объектов) «является» («Is а»)
• Примеры наследования– Квадрат – наследник фигуры или?
Полиморфизм
• Возможность объектов с одинаковой спецификацией иметь различную реализацию
• Один интерфейс, множество реализаций• Язык программирования поддерживает
полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования
• Наиболее частая реализация – виртуальный метод
ООП
• Таким образом, в ООП система моделируется как совокупность классов, их интерфейсов и заданных отношений наследования и композиции между ними.
• Поведение системы – как последовательность создания и взаимодействия и уничтожения объектов (экземпляров классов).
Основные принципы ООП
• Абстракция (классы)• Инкапсуляция (области видимости)• Наследование• Полиморфизм (виртуальные методы)
Наследование vs композиция
• Использование объекта нужного класса в качестве поля другого класса позволяет, так же как и наследование, добиться доступа к данным и методам этого класса инкапсулируя суть взаимодействия– Если они не protected
• Наследование нарушает инкапсуляцию• Наследование дает полиморфизм• Поэтому: используйте наследование только когда
вам нужен полиморфизм и обязательно, когда есть отношение «является»
Качество абстракции
• Зацепление– степень глубины связей между отдельными классами
• Связность– Насколько члены класса приследуют единую и неделимую
цель• Достаточность, полнота, примитивность
– Степень пригодности к использованию в изоляции– Насколько полно выражает все аспекты абстракции– Абстракция должна содержать только примитивные операции
(то что может быть реализовано с помощью них – часто является лишним). Абстракция должна инкапсулировать нетривиальные знания.
ПАРА СЛОВ О UMLКак обсуждать программы в ООП
Диаграммы классов
• + public, - private, # protected• Использование, наследование,
композиция, агрегация
Human
firstNamelastName
Dog
nickname
HeadMammal
weightLeg
Диаграммы последовательности
• Время жизни• Кто кого зовет (можно показывать рез-т)• Циклы, условия, асинхронность – тоже есть
OwnerOwner DogDog HeadHead
1: fass()
2: bite()
3: openMouth()
4: bite()
5: closeMouth()
Другое
• Методы доступа (свойства / getters / setters)• Множественное наследование• Абстрактные члены• Интерфейсы как языковая конструкция• Вложенные классы• Прототипы, метаклассы
(метапрограммирование)
Модуль (полусеместровый)
• Кто уже показал – 45, кто тут – 35, кого нет – 25.
• Кто показывал лягушку на андроиде – 44.• Теперь, что бы получить 45-54, мало
показать что-то, что вы делали раньше. Нужно выполнить какое-нибудь задание.
Ресурсы
• Хороших книг по концепциям ООП я не знаю
• Объектно-ориентированный анализ и проектирование с примерами приложений
• Применение UML 2.0 и шаблонов проектирования. Введение в объектно-ориентированный анализ, проектирование и итеративную разработку
• UML, основы• Wikipedia
Темы для докладов
• AOP• Kanban / Lean (Карпов)• SCRUM: Team / ScrumMaster – подробнее
про процесс (DS, Retro, SprintPlan, Demo…)• Portfolio management, BMG (Alex Ostervald),
Scrum of Scrum• NoSql БД• Реализация ООП в Javascript (прототипы)
Лабы• Открытые данные
– http://www.apps4russia.ru/, http://apps4russia.reformal.ru/, http://data.worldbank.org/
• Готовое:– http://minenergo.gov.ru/activity/statistic/,http
://www.fms.gov.ru/about/ofstat/, http://www.federalspace.ru/main.php?id=10, http://ivan.begtin.name/2011/10/02/gosuslugijson/
• Повышенный балл:– Или наличие БД– Или наличие веб интерфейса– Индивидуальное задание (для тех, у кого уже есть что показать)
• Стажировка (Тестер / Разработчик)– MS: C#, MS MVC, MS SQL Server