План занятий курса
«Объектно-ориентированное программирование»

Лекции

Историческое развитие вычислительной техники, от античности до наших дней. Тенденция: увеличение абстрактности, универсализация. Появление универсального вычислителя (компьютера с программой). Языки программирования: низкого уровня, высокого, сверхвысокого. Парадигмы программирования. Появление ООП парадигмы как нового способа структурирования сложности, структурирования кода программы. Объектные модели: Simula/C++/Java/C#, Smalltalk/Objective C, Eiffel, Common Lisp / CLOS. Теория ООП: OOA & OOD Гради Буча, UML 2.0, паттерны проектирования, метод Eiffel (контрактное программирование, повторная используемость). Методологии разработки (RUP/ Agile: XP, Scrum, …). Разработка через тестирование (TDD), юнит-тестирование, рефакторинг. Непрерывная интеграция (Continuous Integration, CI). Будущее: разработка через модели (MBSE, Eclipse EMF/Xtend/Xtext), функционально-объектноориентированное программирование (FOOP, Scala/F#), новые open source языки (ad hoc полиморфизм Google Go, CTFE компиляция времени выполнения в D).

Основы реализации ООП. Базовые принципы реализации ООП: наследование, инкапсуляция, полиморфизм. Понятие объектной модели. Статическая и динамическая типизация. Наследование, композиция, агрегация. Строгая типизация, «утиная типизация», ad hoc полиморфизм. Множественное наследование реализации, наследование интерфейсов. Интерфейсы, компоненты. Компонентно-ориентированное программирование. Повторная используемость компонент.

Язык моделирования UML. Унификация нотаций Буча, Якобсона в UML 1.0. Диаграммы классов, последовательности, взаимодействия. Диаграмма развёртывания. Ассоциации, композиция, агрегация, наследование. Стереотипы. Компоненты. Сценарии использования. Управление требованиями (разработка ТЗ из ТР). Кодогенерация: генерация кода из модели, обратная разработка (модели из кода). Моделеориентированный характер UML 2.0. Универсальная модель, метамодель. Стандарт обмена XMI. Моделеориентированная системная (программная) инженерия, MBSE. Языки предметной области, DSL. Понятие о рефакторинге. Понятие об архитектуре приложения. Моделеориентированная архитектура, MDA.

Паттерны проектирования. Книга «банды четырёх» (Гамма, Хелм, Джонсон, Влиссидес) – «Паттерны проектирования». Назначение паттернов проектирования. Повторная используемость паттернов. Паттерны как идиомы языка. Примеры применения паттернов: абстрактная фабрика, команда, стратегия, визитор. Зависимость паттернов от объектной модели языка (например, визитор не нужен там, где есть поддержка мультиметодов вместо одинарной диспетчеризации). Разумная детализация паттернов. Антипаттерны: реализации, процесса разработки, организации.
Понятие архитектуры приложения.

Основы ООП проектирования. Пять принципов SOLID-принципа: Single Resp. «единой ответственности», Open/Close «открытости-закрытости», Liskov Substitution Principe, LSP «подстановки Барбары Лисков», Interface Seggregation «разделения интерфейса», Dependency Inversion «инверсии зависимостей». 

Методология разработки, основы. Понятие о жизненном цикле программной системы: выяснение требований, разработка: реализация требований - разработка задания, реализация задания – проектирование архитектуры системы, реализация архитектуры системы – развертывание компонент, реализация компонент – кодирование; развёртывание; эксплуатация и поддержка; доработка; списание системы. Понятие о целевой и обеспечивающей системах. Жизненный цикл систем, системная инженерия.  Итеративная разработка систем, инкрементальная разработка. Программная инженерия. Управление ЖЦ программной системы: ALM, Application Lifecycle Management.  Управление процессом разработки (методология разработки): унифицированный процесс UP (Rational Unified Process. Метод сценариев использования. Прослеживаемость требований. Матрица прослеживаемости требований.

Методология разработки, современность. Гибкие методологии (Agile): XP, SCRUM, Crystal. Управление проектом разработки: водопадная, каскадная модель, итеративная модель. Разработка через тестирование (TDD, Test Driven Development). Юнит-тестирование (модульное), функциональное тестирование, приёмочное тестирование, автотестирование. Нефункциональные требования (нагрузочное тестирование). Feature-driven development, спринты SCRUM. Рефакторинг, «чистый код», «запахи кода».  Автоматизация развёртывания – непрерывная интеграция, CI (Continuous Integration).

Необычное ООП. Сравнение.  Различия в объектных моделях (Simula, SmallTalk, Eiffel). Антипаттерны. Контрактное программирование, инварианты, предусловия, постусловия методов. Мультиметоды. Обобщённые типы – дженерики (шаблоны). Метод Eiffel, нотация BON. Генерация документации (doxygen, javadoc). Недостатки ООП подхода, «объектное программирование провалилось», компонентно-ориентированное программирование (отличия от ООП). Программная система.  Инкрементальная разработка. Ad hoc интерфейсы в Google Go, шаблоны-функции времени компиляции в D. Система типов языка программирования. Функционально-объектно ориентированное программирование (FOOP: Scala/F#).

Практика, лабораторные работы

НЕ нашли? Не то? Что вы ищете?
Историческое развитие вычислительной техники, от античности до наших дней.
Cущность ООП подхода.

Задание 1:
Дан следующий сценарий использования.
" Студенты и преподаватель посещают занятия по курсу ООП. Занятия это лекции или лабораторные. Всего 8 лекций и 8 лабораторных. Студенты это магистры группы УМВТ21 (магистры тоже студенты). У студентов и преподавателя есть ФИО. На лекции преподаватель читает лекции, студенты слушают. На лабораторных студенты выполняют задания, преподаватель оценивает задания. После 4 занятий (половины курса) проводится контрольная работа по изложенным на лекции вопросам. После 8 занятий (по окончанию курса) проводится экзамен. На экзамене студенты отвечают по билетам, на 2 вопроса по теории и один по практике. Итоговая оценка выводится по результатам контрольной работы, лабораторных и экзамена. "

Проведено ООП моделирование этого сценария (указаны: класс, метод, стереотип_ассоциации), в результате чего получена диаграмма классов и примерные прототипы методов и свойств.
Взаимодействие по сценарию описывается псевдокодом программы-симулятора (см. ЗаданияПоЛабараторной. PDF).

Напишите программу-симулятор на ООП языке Vala (язык проекта GNOME, см. материалы, похож на C#).

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

Ожидаемый результат: Программа на языке Vala, которая реализует такую функциональность.

Справочные материалы:  Материалы по языку Vala, компилятору valac. Похожесть Vala на C#.


Основы реализации ООП. Базовые принципы реализации ООП: наследование, инкапсуляция, полиморфизм. Понятие объектной модели.

Задание 2. Понятие объектной модели. Как можно было бы реализовать ООП модель в языке без поддержки ООП, например, Си?

Предложите способ реализации объектной модели на языке Си, реализующей базовые принципы: инкапсуляцию, наследование, полиморфизм.

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

Результаты для проверки, самоконтроля:

А)  Объектная модель GObject. Вызовите компилятор valac –c classes. vala. Посмотрите сгенерированную реализацию classes. c. Cравните с предложенным Вами вариантом.

Б) Объектная модель С++: VTable. Особенности реализации виртуальной таблицы методов.

Язык моделирования UML.

Задание 3.

Дан сценарий использования и диаграмма классов из Задачи 1.

Установите CASE-средство UML Architect Enterprise (триальная версия на 30 дней). Введите диаграмму классов из Задачи 1 (выберите требуемый стереотип_ассоциации). Введите диаграмму последовательности (сценарий программы-симулятора, заданный псевдокодом в Задаче 1).

А) Сгенерируйте из модели код на языке Java. Попробуйте его скомпилировать.
Б) Поправьте код: измените наследование «магистр не является подклассом студентов». Обновите из кода модель в UML Architect.

Ожидаемый результат:  продемонстрированная кодогенерация, прямая и обратная разработка.

Дополнительные материалы: Есть модель на основе псевдокода (с русскими буквами), по ней получен код на Java. Java поддерживает идентификаторы на русском языке в кодировке Unicode, типичный компилятор С++ –  не поддерживает. Переделайте модель для С++, продемонстрируйте сгенерированный код.

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

Задание 4.

Дан сценарий использования из Задания 1.  Есть пример реализации на Vala программы-симулятора. Попробуйте применить паттерн Visitor.

Для вычисления итоговой оценки по курсу (рейтинга) требуется обход оценок по лабораторным работам, учёт посещаемости (массив 16 булевых), оценки по контрольной, оценки по экзамену.
Рейтинг вычисляется как:
  /*
Рейтинг := ОценкаПоКонтрольной * (сумма по посещаемости)/16 * ОценкаПоЭкзамену/25

*/

Допустим, до применения паттерна реализованы:
метод Вычислить() в объекте Рейтинг, который вызывает методы других объектов:

Контрольная. Вычислить()*УчётПосещаемости. Вычислить()*Экзамен. Вычислить()

Предложите структуру классов после применения паттерна (класс визитора ВычислитьОценкуВизитор).

Ожидаемый результат:

Диаграмма классов в UML и/или работающая программа, вычисляющая рейтинг.

Должна показывать реализацию паттерна «визитор».

Основы ООП проектирования. Пять принципов SOLID-принципа: Single Resp. «единой ответственности», Open/Close «открытости-закрытости», Liskov Substitution Principe, LSP «подстановки Барбары Лисков», Interface Seggregation «разделения интерфейса», Dependency Inversion «инверсии зависимостей». 

Задание 5.
На примере иерархии классов из задания 1 или задания 4 продемонстрируйте некоторый из SOLID-принципов. Пусть N – ваш номер в списке фамилий студентов, отсортированный по алфавиту. N % 5 + 1  (остаток от деления на 5 + 1 ) – номер 1..5  нужного принципа.

Продемонстрируйте этот принцип на основе диаграммы классов из задания 1 или задания 4.

Методология разработки, основы. Понятие о жизненном цикле программной системы: выяснение требований, разработка: реализация требований - разработка задания, реализация задания – проектирование архитектуры системы, реализация архитектуры системы – развертывание компонент, реализация компонент – кодирование; развёртывание; эксплуатация и поддержка; доработка; списание системы. Понятие о целевой и обеспечивающей системах. Жизненный цикл систем, системная инженерия.  Итеративная разработка систем, инкрементальная разработка. Программная инженерия. Управление ЖЦ программной системы: ALM, Application Lifecycle Management.  Управление процессом разработки (методология разработки): унифицированный процесс UP (Rational Unified Process. Метод сценариев использования. Прослеживаемость требований.

Задание 6.

Задание 1 – реализация метода сценариев использования. Озвучьте перечень этапов жизненного цикла по доработке в задании 4 в методологии RUP. В каких программных средах реализованы разные этапы жизненного цикла? Какая возможна интеграция данных между этапами?
Методология разработки, современность. Гибкие методологии (Agile): XP, SCRUM, Crystal. Управление проектом разработки: водопадная, каскадная модель, итеративная модель. Разработка через тестирование (TDD, Test Driven Development). Юнит-тестирование (модульное), функциональное тестирование, приёмочное тестирование, автотестирование. Нефункциональные требования (нагрузочное тестирование). Feature-driven development, спринты SCRUM. Рефакторинг, «чистый код», «запахи кода».  Автоматизация развёртывания – непрерывная интеграция, CI (Continuous Integration).

Задание 7.
Предложите какой-либо тест для задания 4. Предложите вариант рефакторинга (как избавиться от паттерна визитор). Последовательность действий при рефакторинге по методике TDD.

Необычное ООП. Сравнение.  Различия в объектных моделях (Simula, SmallTalk, Eiffel). Антипаттерны. Контрактное программирование, инварианты, предусловия, постусловия методов. Мультиметоды. Обобщённые типы – дженерики (шаблоны). Метод Eiffel, нотация BON. Генерация документации (doxygen, javadoc). Недостатки ООП подхода, «объектное программирование провалилось», компонентно-ориентированное программирование. Инкрементальная разработка. Программная система.  Система типов. Функционально-объектно ориентированное программирование (FOOP: Scala/F#). Ad hoc интерфейсы в Google Go, шаблоны-функции времени компиляции в D.

Задание 8.

На выбор, одно из А) Б) В)

А) Для примера из задания 1 или задания 4:
Установите doxygen. Опишите в doc-комментариях документацию на методы. Сгенерируйте UML диаграмму классов (продемонстрируйте html).

Б) Установите другую ООП среду (Smalltalk, Eiffel, Google Go, D). Реализуйте в ней задание 1.

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

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

Основной

Джим Арлой, Айла Нейштадт. UML 2 и унифицированный процесс. Практический объектно-ориентированный анализ и проектирование, 2-е издание. – СПб: Символ-Плюс, 2007.
ISBN-13: 978-5-93286-094-6
ISBN-10: 5-93286-094-4 Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования.  СПб: Питер -2001 Гради Буч. Объектно-ориентированные анализ, и проектирование с примерами приложений на С++. СПб.: Издательства «Бином», «Невский Диалект», 1998. ISBN 0-8053-5340-2, 5-7989-0067-3, 5-7940-0017-1; Стив Макконнел. Профессиональная разработка программного обеспечения. СПб: Изд-во «Символ-Плюс», 2006


Дополнительный

Журнал «Знание-Сила», № 5 за 2010 год, стр. 43-51. Античный компьютер, или механизм из Антикитеры. труктурное программирование. М.: Мир – 1975 Бьянкуцци, Уорден. Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования. СПб.: Символ-Плюс, 2011
ISBN: 978-5-93286-170-7 Бьярн Страуструп. Дизайн и эволюция С++. СПб.: Питер, 2006. ISBN: 5-469-01217-4 Бертран Мейер. Основы объектно-ориентированного программирования. ISBN: 978-5-7502-0255-3 Бертран Мейер. Объектно-ориентированное конструирование программных систем. М.: - Изд-во «Русская редакция», 2005 ISBN 5-7502-0255-0, 0-13-62155-4; Бертран Мейер. Почувствуй класс. М.: - Изд-во: Интернет-университет информационных технологий, Бином. Лаборатория знаний, 2011. ISBN 978-5-9963-0573-5 Мартин Фаулер. Рефакторинг. Улучшение существующего кода. СПб.: - Издательство: Символ-Плюс, 2008. ISBN 5-93286-045-6, 978-5-93286-045-8, 0-201-48567-2 Б. Каннингем, Кент Бек. Экстремальное программирование: разработка через тестирование (Test-driven Development by Example). СПб.: - Издательство «Питер», 2003. ISBN 5-8046-0051-6, 0-321-14653-0 Стив Макконнел. Совершенный код. Практическое руководство по разработке программного обеспечения СПб.: Изд-во «Символ-Плюс», 2006 г.
ISBN: 5-7502-0064-7 Роберт Мартин. Чистый код. Создание, анализ, рефакторинг. СПб.: Изд-во «Питер» - 2011. ISBN: 978-5-459-00858-6 Питер Гудлиф. Ремесло программиста. Практика написания хорошего кода. Из-во «Символ-Плюс», 2009. ISBN 978-5-93286-127-1, 978-1-59327-119-0 Эндрю Хант, Дэвид Томас. Программист-прагматик. Путь от подмастерья к мастеру. Изд-во «Лори» - 2004.  ISBN: 5-85582-213-3 Ларри Константин. Человеческий фактор в программировании. Из-во «Символ-Плюс», 2004. ISBN 5-93286-044-8, 0-13-060123-3 Алистер Коберн. Быстрая разработка программного обеспечения. Изд-во «Лори» - 2002.  ISBN: 5-85582-182-X William J. Brown, Raphael C. Malveau, Hays W. "Skip" McCormick, Thomas J. Mowbray. AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis. Publisher: Wiley; 1 edition (April 3, 1998).  ISBN-10: 0471197130  | ISBN-13: 978-0471197133