Объектно-ориентированный анализ и программирование Лекция 1. Введение в объектно-орентированное программирование

Download Report

Transcript Объектно-ориентированный анализ и программирование Лекция 1. Введение в объектно-орентированное программирование

Объектно-ориентированный анализ и программирование Лекция 1. Введение в объектно-орентированное программирование и язык Java

к.т.н. Гринкруг Е.М. (email: [email protected]) 27-Apr-20 Software Engineering 1

Введение в объектно-ориентированное программирование

Все языки программирования обеспечивают некоторые абстракции (предоставляя «машину, сделанную с помощью машины»): –

Язык ассемблера

обеспечивает абстрацию физической машины; –

«Императивные» языки

языков ассеблеров (и те, и другие требуют мышления в терминах компьютера, а не решаемой задачи: программист обеспечивает преобразование понятий предметной области в понятия машинно ориентированного языка); (Fortran, С и др.) обеспечивают абстракции – –

«Проблемно-ориентированные»

языки сосредоточены на решении задач определенного класса, для которых они дают полезные абстракции, но они не всегда пригодны для задач других классов;

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

Такой подход имеет сравнительно адекватную аналогию в реальном мире.

27-Apr-20 Software Engineering 2

Характеристики объектно-ориентированного языка

(сформулированы для ОО-языка Smalltalk – предшественника Java) • Все является объектом, способным выполнять присущие ему операции; • Программа – это совокупность объектов, указывающих друг другу, что делать, посредством сообщений (вызовов методов); • Каждый объект имеет собственную память, возможно состоящую из других объектов; • Каждый объект имеет тип, определяющий множество сообщений, которые можно посылать объекту данного типа; • Все объекты данного типа могут получать одинаковые сообщения.

27-Apr-20 Software Engineering 3

• •

Определение характеристик объекта (Буч):

Объект обладает состоянием, поведением, индивидуальностью.

Это - более общее определение (нет сопоставления объекта с типом). В программировании (computer science) используется термин object based (language) для указания на: – –

Ограниченную реализацию объектно-ориентированного программирования, где имеются одно или более из ограничений:

• Нет наследования • Нет полиморфизма • Не все значения являются объектами.

Пример – Visual Basic.

Prototype-based типа / класса).

организацию (объекты не являются экземплярами

Пример – JavaScript.

27-Apr-20 Software Engineering 4

• • • •

Понятия тип и класс

Логическое мышление связано с классификацией

попытка классификации принадлежит Аристотелю, основоположнику формальной логики, – «класс рыб, класс птиц, ...»); (первая описанная

Классификация лежит в основе познания мира

классификации при начальном усвоении языка); (младенцы уже способны к

Концепция того, что все объекты, будучи уникальными, классифицируются по наличию общих характеристик и сходному поведению, была впервые реализована в первом объектно ориентированном языке Simula-67

( предназначенном для Simulation моделирования реального мира, откуда название, - в 1967 г.) Программные объекты, идентичные во всем, кроме внутреннего состояния во время выполнения программы, группируются в «класс объектов».

Class – как программный термин – впервые использован в Simula-67.

В дальнейшем понятия «тип» и «класс» используются для классификации интерфейса и реализации – соответственно (в основном...)

.

27-Apr-20 Software Engineering 5

• • • • • •

Создание абстратных типов данных – фундаментальное понятие объектно-ориентированного программирования

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

27-Apr-20 Software Engineering 6

• • • •

Интерфейс и реализация

Model-driven development / software engineering – методология програмной инженерии, которая фокусируется на создании моделей, или абстракций, более приближенных к концепциям конкретной предметной области, чем к конкретным вычислительным (алгоритмическим) концепциям; Объектно-ориентированное программирование обеспечивает поддержку этой методологии средствами системы программирования (языка программирования); Операции, запросы на выполнение которых могут направляться объекту, составляют интерфейс объекта; Интерфейс предполагает наличие кода, реализующего операции интерфейса, и этот код определяется и реализуется типом объекта (классом) в совокупности со скрытыми используемыми при этом данными.

27-Apr-20 Software Engineering 7

Объект – конкретный поставщик услуг

Такой подход к проектированию:

– –

способствует структуризации программы; повышает связываемость программных элементов;

– –

Помогает «компонентизации» программы; Упрощает понимание и сопровождение кода

.

Объект имеет скрытую реализацию

Такой подход к проектированию:

разделяет программистов на создателей классов и клиентов;

позволяет изменять реализацию без нарушения работы клиентов;

– –

защищает реализацию от нарушений со стороны клиента; Упрощает понимание и сопровождение кода.

27-Apr-20 Software Engineering 8

Повторное использование реализации

Разработаный и протестированный класс может быть «полезным куском кода»: хорошо спроектированный код может быть полезен для других программ; • Переиспользование кода – одно из важнейших преимуществ объектно ориентированного программирования.

• Способы повторного использования кода: – –

Повторная инстанциация

класса (создание новых объектов); – Внедрение объекта в реализацию другого (member object); то есть

композиция (composition) или аггрегирование (aggregation)

, что описывается отношением “has-a”

(“a car has an engine”);

Наследование

(менее «гибкий» способ, так как опирается на компилятор

).

27-Apr-20 Software Engineering 9

• • • • •

Наследование

Объединение данных и функциональности в класс позволяет описывать и моделировать«концепции» предметной области; Удобно описывать сходные концепции указывая только отличия от исходной; Исходная концепция представляется базовым классом (

суперклассом, родительским классом

); Изменения указываются в унаследованном классе (

производном, дочернем [под]классе

); Базовый тип содержит все характеристики и действия, общие для всех типов, унаследованных от него.

Замечание: в prototype-based языках, где отсутствует понятие класса, наследование сводится к описанию отличий производного объекта от родительского объекта (JavaScript )

27-Apr-20 Software Engineering 10

Наследование

Предложите для этих фигур индивидуальные методы расширения поведения...

• Наследуемый тип повторяет интерфейс базового типа; • Производный класс является частным случаем базового класса; • Иерархия типов воплощает как сходные, так и различные свойства понятий; • Без указаний отличия в реализации главный смысл наследования теряется...

• Два способы внесения отличий: – Расширение набора методов; – Переопределение методов (изменение поведения).

27-Apr-20 Software Engineering 11

• •

Отношения «является» и «является-также» ( “IS-A” И “IS-LIKE-A”)

Принцип замены (“is-a”, “является”):

если можно обойтись только переопределением методов, то базовый и производный класс имеют одинаковый интерфейс, и их объекты – взаимозаменяемы

(как, например, USB флешки разных производителей).

Принцип расширения (“is-like-a”, “является-также”):

старого класса взаимозаменяемы «в одну сторону»

но он к тому же может фотографировать)

если новый класс расширяет совокупность методов в своем интерфейсе, то объекты нового и

(например, цифровой фотоаппарат при подключении через USB-порт «является также» флешкой,

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

27-Apr-20 Software Engineering 12

Раннее и позднее связывание

• • • • При попытке обращения к объекту производного типа как к объекту базового типа программист не хочет - и компилятор не может - знать заранее, какой конкретно код будет выполнен (

это безразлично для вызывающей программы

);

Раннее связывние (early binding)

– связь вызывающего злемента (метода) программы с вызывамым устанавливается до выполнения программы (компилятором и редактором связей);

Позднее связывание (late binding)

(и может не быть известна ранее); – связь с вызываемым элементом устанавливается динамически, во время выполнения

Позднее связывание – основополагающая концепция реализации ООП, делающая программу расширяемой.

27-Apr-20 Software Engineering 13

• • •

Восходящее и нисходящее преобразование типов Преобразование типов

объектом иного типа; – оперирование с объектом как

Восходящее преобразование типов (upcasting)

– оперирование объектом производного типа как объектом базового типа (движение вверх по диаграмме наследования);

Нисходящее преобразование типов (downcasting)

оперирование с объектом как представителем более конкретного типа.

– 27-Apr-20 Software Engineering 14

Одиночное наследование

• Практически все объектно-ориентированные языки (кроме С++) обеспечивают одиночное наследование (singly rooted inheritance hierarchy) классов; • Все типы имеют общий корень иерархии типов – класс Object; • Все объекты гарантированно обладают общей базовой функциональностью, с ними можно производить определенные основные операции, что упрощает их реализацию и использование, а именно: – динамическое создание; – сборку мусора; – обработку исключительных ситуаций.

27-Apr-20 Software Engineering 15

• • •

Создание и уничтожение объектов

Создание объекта сопровождается выделением ему памяти; когда объект становится ненужным, память надо освободить.

Память объектов распределяется динамически: – объекты создаются специальными операциями своих типов (конструкторами), – память выделяется из общей «кучи» (heap) , – количество и типы создаваемых объектов не известны до запуска программы.

Память объектов освобождается с помощью специального механизма сборки мусора (garbage collection), который: – определяет, когда память объекта может быть освобождена; – освобождат программиста от многих хлопот по ее освобождению; – снижает вероятность утечки памяти (memory leak),

но не гарантирует от нее.

27-Apr-20 Software Engineering 16

Системное программирование

(этот термин не есть антоним бессистемного программирования)

• Исторически системное программное обеспечение компьютеров было принято делить на: – Операционные системы, • Ответственны за динамические аспекты работы – Сиситемы программирования • Организация программ до этапа выполнения.

• С появлением объектно-ориентированного ПО эти различия стираются: – Операционные системы становятся объектно-ориентированными средствами поддержки языков программирования; – Объектно-ориентированные языки программирования содержат встроенные в них динамические средства операционных систем.

27-Apr-20 Software Engineering 17

Цель данного курса

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

Изучение программирования предполагает программирование, как обучение игре на фортепиано немыслимо без музицирования.

Нельзя научиться плавать даже прослушав лекци чемпионов по плаванию: надо залезать в воду...

27-Apr-20 Software Engineering 18

Введение в Java

История появления языка Java

В 1991 г.

Патрик Нортон и Джеймс Гослинг из Sun приступили к разработке языка для программирования контроллеров переключения каналов кабельного TV (для embedded software для различных микроконтроллеров с небольшой памятью), язык получил название Green (Дж.Гослинг называл его Oak – дуб, но потом выяснилось, что язык с таким названием уже есть, и его переименовали в Java – название Яванского кофе) ; – Для независимости от конкретного микроконтроллера в основу была положена

концепция виртуальной машины

– сперва этот проект не имел применения (вплоть до руководителем одной из компаний, отказавшихся подписать контракт на использование проекта Green, был Джим Кларк (позже основатель компании Netscape – полностью опиравшейся на Java); ;

1994 г

.); забавно, что –

В 1994

с развитием www потребовался web-browser (html – в изображение на экране);

большинство пользователей применяли browser Mosaic разработки Университета шт.Иллинойс (1993 – это была дипломная работа Марка Андреессена

, позднее - еще одного основателя Netscape); – –

В 1995

году был разработан browser HotJava, привлекший к Java всеобщий интерес.

Первая версия языка java от фирмы Sun появилась в 1996 году (Java 1.0)

27-Apr-20 (уже в 1996 г мне довелось написать программы на java в компании Paragraph) Software Engineering 19

Сравнительная популярность языков программирования

первая двадцатка

(данные 2006 г.) 27-Apr-20 Software Engineering 20

Динамика популярности

27-Apr-20 Software Engineering 21

Развитие Java – платформы (основные «вехи»)

– – – – –

Версия Java 1.1

(1996-1997) – усовершенствование языка, библиотек, появление MS Java VM, встроенной в MS IE;

Версия Java 1.2

(1998) – “Java 2 Standard Edition Software Development Kit Version 1.2” (J2SE SDK), появление Micro Edition, Enterprise Edition, лозунг «write once – run everywhere»;

Версии Java 1.3 и 1.4

– совешенствование библиотек, применение в серьезных серверных приложениях;

Версии 5 и 6 (в настоящее время)

виртуальной машины, библиотек (именилась нумерация версий – отбросили «1.» спереди); – совершенствование языка,

На подходе Java 7

27-Apr-20 Software Engineering 22

27-Apr-20 Software Engineering 23

27-Apr-20 Software Engineering 24

Инструменты программирования на Java

• Java – программы выполняются виртуальной машиной (jvm). Существуют многочисленные реализации jvm (от больших систем до тех, что у вас в телефонах), есть реализации практически для всех основных операционных систем, мы будем использовать Java Development Kit (JDK) для Windows ( более ранние версии назывались Java Software Development Kit (Java SDK)); • Нас будет интересовать Java 2SE (Java 2 Standard Edition); скачивается с http://java.sun.com/j2se ( вы найдете все, что нужно на нашем сервере); • После установки необходимого инструментария вы можете быть (почти) уверены, что ваши Java-программы будут работать под любыми операционными системами.

27-Apr-20 Software Engineering 25

• Вполне возможно, что java-машина и java runtime environment (jre) в вашей системе уже есть: многие программы, использующие java, «приносят» их с собой (на моей машине одновременно находятся несколько разных версий java); • При инстолляции в Windows бывает полезно избегать установку в директории, имеющие пробел в имени

(вместо установки в Program Files лучше устанавливать прямо в «корень» - кто скажет – почему?)

; • После установки надо в консольном окне проверить, с какой java мы имеем дело: 27-Apr-20 Software Engineering 26

Если увидите другое, надо разбираться

: – Что-то не так установилось (повторить установку); – Уже были установки других java машин, что можно проверить/исправить с помощью манипуляций с переменными окружения (PATH, JAVA_HOME ); эти переменные полезно посмотреть

(кто скажет – как?).

Sun

предоставляет все необходимые исходные файлы (и даже

все файлы реализаций jvm, компилятора, и т.д. – за исключением некоторых коммерческих версий под конкретные процессоры):

Чтение исходных файлов – лучший способ овладения java программированием

и повседневная практика java-программиста 27-Apr-20 Software Engineering 27

27-Apr-20

Что установлено?

• • • • • • • README.html – «корень» для получения ВСЕХ знаний по Java; Src.zip – все нужные исходные файлы; bin – все .exe файлы инструментов JDK; lib – необходимые библиотеки; demo, sample – демонстрационные программы и примеры; JRE – runtime environment (без инструментария); Include – header-файлы для добавления платформозависимых библиотек; Software Engineering 28

Java SE 6

27-Apr-20 Software Engineering 29

Работа с командной строкой

• Комиляция исходных файлов • Выполнение Java application 27-Apr-20 Software Engineering 30

Integrated Development Environments

• За прошедшие годы сменились или продолжают использоваться могочисленные среды разработки – Borland JBuilder, – MS Java++, – Oracle JDeveloper, – IBM VisualAge For Java, – Eclipse, – Sun NetBeans, – JetBrains IntellyJ IDEA.

Наш выбор – IDEA:

(ниже только некоторые, наиболее известные в свое время и/или сейчас):

– CosmoCode (CosmoSoftware, SiliconGraphics), http://www.jetbrains.com

(есть на нашем сервере) 27-Apr-20 Software Engineering 31

Установка IntellyJ IDEA

• Специально для нашего курса компания JetBrains предоставила лицензию (есть на нашем севере) for free –

скажем ей “thanks a lot”!

27-Apr-20 Software Engineering 32

Демонстрация (applications, applets)

• Java application • Java applet 27-Apr-20 Software Engineering 33

Обзор учебных материалов на сервере

• Имеющиеся материалы и ресурсы предназначены только для ваших учебных целей. Они не подлежат распространению и использованию в иных целях, кроме учебных! • На нашем сервере имеются: – Книги • Наиболее строгое изложение собственно языка – в The Java Language Specification (3d edition); – Необходимые инструменты – Примеры и упражнения 27-Apr-20 Software Engineering 34

Q&A 27-Apr-20 Software Engineering 35