2. Разработчик должен знать
• Базовые элементы синтаксиса,
процедурное мышление: переменные, if /
циклы / функции
• Указатели и работа с памятью (C)
• ООП (C++) – объектное мышление
• Библиотеки (платформа) и какой-нибудь
язык более высокого уровня (.NET / Java /
Пр.)
4. Суть эволюции
• Борьба со с возрастающей сложностью
• Т.е. человек может оперировать 7 +/- 2
объектами, то использование принципа
«разделяй и властвуй» или декомпозиции
(инкапсуляции) неизбежно.
• По сути, вся эволюция индустрии
разработки заключается в обнаружении
повторяющегося кода и его инкапсуляции в
какие-то удобные конструкции
5. Сначала был ассемблер
• Прямое управление ячейками памяти
процессора (регистрами)
• Прямой вызов процессорных операций
• Очень быстро (быстрее некуда)
• Очень сложно, нужно помнить МАССУ
нюансов, плюс процессоро-зависимо
• Применение: ОС, драйверы, встроенный
софт, игры (чуть-чуть), BIOS …
6. Захотелось абстракций
• Элементарные типы данных
• Переменные, массивы
• Арифметические операторы и логические
операторы
• Условный оператор (if), циклы
• Все это компилятором (ну или
интерпретатором) преобразуется в
ассемблер
8. Cтека мало
• Стек быстр, но ограничен
– вспомним 640 Kb
• Нужно работать с основной памятью
– указатели
– malloc(), free()
– язык C
9. Структуры, глобальные переменные
• Быстро оказалось что некоторые данные
постоянно используются вместе ->
структуры
– Point (x;y)
• Передавать параметры и получать
результаты – недостаточно
– Удобно иметь «состояние» системы доступное
из разных функций - глобальные переменные
10. Процедурное программирование
• Когда программа становится большой, а
глобальных переменных – много, держать в
голове их состояние становится невозможно, а
значит – выполнение функций и отладка
непредсказуемы
• Что бы не путаться – разобьем на модули
(библиотеки)
– область видимости, интерфейс, реализация
– т.е. инкапсуляция ряда функций и глобальных
переменных
12. Класс как эволюция структур
• Было замечено что структуры часто удобно
передавать в методы и образуются группы
методов работающие с одними и теми же
структурами
• Фактически класс – это структура данных
объединенная с методами (функциями) ее
обработки
• Класс – это пользовательский тип данных,
состоящий из полей данных и методов
13. Объект в теории
• С точки зрения восприятия человеком
объектом может быть:
– осязаемый и (или) видимый предмет
– нечто, воспринимаемое мышлением
– нечто, на что направлена мысль или действие.
• Объект может обладать состоянием,
поведением, идентичностью
• Очевидно, что с помощью понятия
«объект» можно описать все что угодно
14. Класс как абстракция
• Структура и поведение схожих объектов
определяет общий для них класс
• Класс это описание множества объектов:
– Структуры данных состояния
– Поведения (методов)
• Термины «экземпляр класса» и «объект»
взаимозаменяемы.
15. Стандартные операции
• Операция – это услуга, которую класс (объект) может
предоставить своим клиентам.
• На практике типичный клиент совершает над объектами
операции пяти видов:
– Модификатор - изменяет состояние
– Селектор – считывает состояние, но не меняет
– Итератор – дает последовательный доступ к частям класса
– Конструктор – создание / инициализация объекта
– Деструктор – уничтожение объекта (освобождение памяти)
• В различных языках могут быть представлены
специальными синтаксическими конструкциями
16. Инкапсуляция
• Основная идея объекта заключается в том,
что он скрывает от взаимодействующих с
ним принципы своего устройства, оставляя
для клиентов только интерфейс.
• Это и называется инкапсуляция
• Инкапсуляция в языках программирования
реализуется с помощью областей
видимости:
– Основные: public, private, protected
17. Наследование
• Иногда еще называют генерализацией или
расширением, что часто путает
• Наследование выражает отношение
классов (объектов) «является» («Is а»)
• Примеры наследования
– Квадрат – наследник фигуры или?
18. Полиморфизм
• Возможность объектов с одинаковой
спецификацией иметь различную реализацию
• Один интерфейс, множество реализаций
• Язык программирования поддерживает
полиморфизм, если классы с одинаковой
спецификацией могут иметь различную
реализацию — например, реализация класса
может быть изменена в
процессе наследования
• Наиболее частая реализация – виртуальный
метод
19. ООП
• Таким образом, в ООП система
моделируется как совокупность классов, их
интерфейсов и заданных отношений
наследования и композиции между ними.
• Поведение системы – как
последовательность создания и
взаимодействия и уничтожения объектов
(экземпляров классов).
21. Наследование vs композиция
• Использование объекта нужного класса в качестве
поля другого класса позволяет, так же как и
наследование, добиться доступа к данным и
методам этого класса инкапсулируя суть
взаимодействия
– Если они не protected
• Наследование нарушает инкапсуляцию
• Наследование дает полиморфизм
• Поэтому: используйте наследование только когда
вам нужен полиморфизм и обязательно, когда
есть отношение «является»
22. Качество абстракции
• Зацепление
– степень глубины связей между отдельными классами
• Связность
– Насколько члены класса приследуют единую и
неделимую цель
• Достаточность, полнота, примитивность
– Степень пригодности к использованию в изоляции
– Насколько полно выражает все аспекты абстракции
– Абстракция должна содержать только примитивные
операции (то что может быть реализовано с помощью
них – часто является лишним). Абстракция должна
инкапсулировать нетривиальные знания.
25. Диаграммы последовательности
Owner Dog Head
1: fass()
2: bite()
3: openMouth()
4: bite()
5: closeMouth()
• Время жизни
• Кто кого зовет (можно показывать рез-т)
• Циклы, условия, асинхронность – тоже есть
26. Другое
• Методы доступа (свойства / getters / setters)
• Множественное наследование
• Абстрактные члены
• Интерфейсы как языковая конструкция
• Вложенные классы
• Прототипы, метаклассы
(метапрограммирование)
27. Модуль (полусеместровый)
• Кто уже показал – 45, кто тут – 35, кого нет –
25.
• Кто показывал лягушку на андроиде – 44.
• Теперь, что бы получить 45-54, мало
показать что-то, что вы делали раньше.
Нужно выполнить какое-нибудь задание.
28. Ресурсы
• Хороших книг по концепциям ООП я не знаю
• Объектно-ориентированный анализ и
проектирование с примерами приложений
• Применение UML 2.0 и шаблонов
проектирования. Введение в объектно-
ориентированный анализ, проектирование и
итеративную разработку
• UML, основы
• Wikipedia
29. Темы для докладов
• AOP
• Kanban / Lean (Карпов)
• SCRUM: Team / ScrumMaster – подробнее
про процесс (DS, Retro, SprintPlan, Demo…)
• Portfolio management, BMG (Alex Ostervald),
Scrum of Scrum
• NoSql БД
• Реализация ООП в Javascript (прототипы)
30. Лабы
• Открытые данные
– http://www.apps4russia.ru/, http://apps4russia.reformal.ru/,
http://data.worldbank.org/
• Готовое:
– http://minenergo.gov.ru/activity/statistic/,http://www.fms.gov.ru/abo
ut/ofstat/, http://www.federalspace.ru/main.php?id=10,
http://ivan.begtin.name/2011/10/02/gosuslugijson/
• Повышенный балл:
– Или наличие БД
– Или наличие веб интерфейса
– Индивидуальное задание (для тех, у кого уже есть что показать)
• Стажировка (Тестер / Разработчик)
– MS: C#, MS MVC, MS SQL Server