Роль объектно-ориентированной методологии
На заре программирования казалось, что для решения любой задачи достаточно разработать последовательность элементарных действий, каждое из которых можно преобразовать в понятные компьютеру инструкции – то есть алгоритм для ее решения. Все вычислительные задачи решались именно таким образом.
Но сложность и объем программ увеличивались. Для упрощения их разработки появилась необходимость разбивать большие задачи на подзадачи. Так в языках программирования появилось понятие процедуры. Несколько однотипных процедур объединялись в модули (которые позже стали называть библиотеками), которые можно было использовать при работе над новыми программами. (Например, в программе кроме всего прочего нужно было рисовать на экране кнопки и значки. Действия по рисованию были запрограммированы в виде процедур и объединены в модуль. Если при разработке следующей программы опять возникнет необходимость в рисовании, программист просто подключит этот модуль и будет пользоваться уже написанными процедурами.) Такой подход получил название процедурного программирования.
С появлением персональных компьютеров и постепенным внедрением их во все сферы человеческой деятельности, чисто вычислительные задачи отходят на второй план. На первый план выдвигаются задачи обработки и манипулирования данными, причем как задачи, так и сами данные очень сильно «привязаны» к некоторой предметной области реального мира. Обслуживание клиентов банка, автоматизация документооборота на крупном предприятии, управление работой железной дороги – вот примеры новых задач, с которыми традиционный подход к программированию справляется не эффективно.
Дело в том, что арсенал средств процедурного программирования – переменные и функции – оказывается недостаточно эффективным для написания программы, которая должна обрабатывать данные об объектах и процессах реального мира. Такая программа может быть написана, но сложность ее разработки превысит все мыслимые нормы. Для учета информации обо всех обрабатываемых параметрах множества объектов понадобится большое количество переменных. При этом очень легко забыть, какая переменная за что отвечает. Кроме того, эти переменные должны постоянно изменяться под воздействием различным функций, но при этом легко потерять контроль над тем, какая функция на какие переменные воздействует. В результате на определенном этапе программу становится почти невозможно понимать и отлаживать.
Методология объектно-ориентированного программирования предназначена для снижения сложности программ и повышения их надежности. Наряду с традиционными средствами в распоряжении программиста оказываются классы, с помощью которых в программе строится модель предметной области решаемой задачи. Опираясь на эту модель, становится легко (по крайней мере, гораздо легче, чем без нее) манипулировать данными об объектах предметной области и моделировать происходящие в ней процессы.
Объекты
В основе методологии объектно-ориентированного программирования (ООП) лежит понятие объекта. Объект – это некая сущность (например, предмет или процесс) с четко очерченными границами, имеющий смысл в контексте рассматриваемой предметной области. Например, студент Иванов, файл «info.txt», лекция по информационным технологиям – это все примеры объектов.
Каждый объект обладает набором свойств (или атрибутов). Например, студент Иванов имеет свойства Имя, Возраст, Цвет глаз, Оценка по матанализу. С каждым свойством связано текущее значение определенного типа. К примеру, возможные свойства объекта Студент Иванов: Имя = "Вася", Возраст = 19, Цвет глаз = СИНИЙ, Оценка по матанализу = 4.
Совокупность текущих значений свойств объекта обычно называют его состоянием.
Для каждого объекта существует определенный набор действий, которые с ним можно произвести. Например, объект файл «info.txt» можно открыть, прочитать, изменить, сохранить, удалить и т.д. Как правило, в результате выполнения действия изменяются значения некоторых свойств объекта. Совокупность всех действий, которые можно произвести над объектом, называется его поведением.
Итак, объект имеет четыре характеристики: свойства, поведение, состояние и уникальную идентичность. Последнее означает, что любые два объекта можно различить, даже если значения всех их свойств совпадают. То есть, может быть два абсолютно одинаковых студента Иванова с одинаковыми оценками по матанализу, но ни у кого не возникает сомнения, что это два разных объекта (как минимум, они находятся в разных местах). Для объектов, созданных программой уникальность означает, что каждый объект занимает свое место в памяти ЭВМ.
Классы
Объекты, обладающие одинаковым набором свойств и одинаковым поведением, относятся к одному классу. Класс – это абстракция, описание группы однородных объектов. Например, студент, лекция, файл, стул – все это примеры классов. Обратите внимание, имеется в виду не конкретный студент, например, Иванов, а студент вообще; этот класс представляет собой обобщенное понятие студента.
У класса есть имя, атрибуты и методы.
Имя выступает в качестве идентификатора класса, т.е. не может быть классов с одинаковыми именами. В качестве имени класса обычно выбирают существительное, описывающее абстрактный объект этого класса (Студент, Лекция, Файл,Стул – это все имена классов).
Атрибуты класса описывают свойства его объектов. С каждым атрибутом сопоставляется некоторый тип (это может быть обычный тип языка программирования вроде int, char, boolean, а может быть другой класс). Например, класс Зачетная книжка имеет атрибут Номер типа int (целое число) и атрибут Владелец типа Студент.
Методы класса описывают его поведение. Это действия, которые могут выполнять объекты данного класса. В программе, как правило, методы представляют собой функции, которые могут работать с атрибутами класса.
Классы выделяются на этапе проектирования программы, который должен предшествовать этапу реализации (т.е. собственно программирования).
Приблизительный перечень классов получают, изучив предметную область программы и разграничив используемые в ней понятия. К этим классам добавляются те, которые необходимы для поддержки алгоритмов, которые будут использоваться в программе. Большая часть их берется в готовом виде из стандартных библиотек – например, класс Vector, реализующий одну из разновидностей списков в Java. Другие выделяются на основе устоявшихся шаблонов (так называемых паттернов проектирования) или личного опыта программиста.
Для каждого класса необходимо определить его поведение. Для этого нужно ответить на вопрос, как классы должны взаимодействовать друг с другом во время работы программы. Обычно для этого используют диаграммы вариантов использования (прецедентов) и диаграммы последовательности действий, информацию о которых вы можете почерпнуть в любом учебнике по UML. Так, класс Студент в программе для учета успеваемости студентов служит для обработки информации о конкретном студенте и должен «уметь» сообщать другим классам свое имя, номер зачетной книжки и т.д., а также «позволять» выполнять над собой такие операции как Перевести на следующий курс, Допустить к защите. Следовательно, класс Студент должен иметь набор соответствующих методов.
Чтобы требуемые методы могли быть реализованы, в классе должны храниться некоторые данные. Например, чтобы студент мог сообщать свое имя, он должен его «знать», а чтобы операция Перевести на следующий курс применительно к студенту имела смысл, он должен «знать» свой текущий курс и при необходимости его увеличивать. Таким образом, выделяется набор атрибутов.
В результате мы получаем объектно-ориентированную модель, которую можно использовать в программе.
Классы и объекты
Java – полностью объектно-ориентированный язык, поэтому, как мы уже отмечали, все действия, выполняемые программой, находятся в методах тех или иных классов.
Описание класса начинается с ключевого слова class, после которого указывается идентификатор – имя класса. Затем в фигурных скобках перечисляются атрибуты и методы класса. Атрибуты в языке Java называются полями. Поля и методы называются членами класса.
Поля описываются как обычные переменные.
Опишем для примера класс Dog (собака). У него будет два поля: кличка и возраст. При описании поведения собаки ограничимся лаем. Еще одно условие, что когда собак вынуждают лаять, они говорят «гав-гав» столько раз, сколько им лет.
Заметим, что в программе уже есть один класс (тот, в котором описан метод main()). Поскольку этот класс к собакам отношения не имеет, описывать новый класс Dog следует за его пределами.
class Dog {
int age; // возраст
String name; // кличка
public void voice() {
for (int i = 1; i <= age; i++) {
System.out.println("гав-гав");
}
}
}
Класс должен описывать некоторое законченное понятие. Это может быть понятие из предметной области программы (собака, велосипед, аквариум, сессия) или понятие, необходимое для работы самой программы (очередь, список, строка, окно, кнопка, программа).
Полями класса должны быть данные, относящиеся к этому понятию. Для собаки это возраст, кличка, порода и т.д., а для сессии – дата начала, продолжительность и т.д.
Методы класса, как правило, работают с данными этого класса. Например, метод voice() обращается к полю age (возраст).
Когда какой-то класс описан, могут создаваться объекты этого класса и с ними можно работать, вызывая их методы (кормить собаку, выгуливать, просить ее лаять – словом делать все то, что позволяет поведение класса, т.е. совокупность его методов).
Для обращения к объектам удобно использовать переменные, имеющие тип класса. Например, для работы с собаками опишем переменную типа Dog:
Dog x;
Переменная типа класса является ссылочной переменной, она не хранит данные (как переменные простых типов int, char и т.д.), а указывает на место в памяти, где эти данные хранятся (как переменные типа массива). Данными, на которые указывает только что описанная переменная x, может быть объект класса Dog. Его необходимо предварительно создать командой new:
x = new Dog();
Теперь переменная x указывает на некий объект класса Dog, хранящий в памяти свои данные (возраст и кличку). Кроме того, эту собаку можно заставить лаять, вызвав соответствующий метод командой:
x.voice();
Для того, чтобы обратиться к члену класса, необходимо указать его имя после имени объекта через точку.
Необходимо обратить внимание, «залаяла» именно та собака, на которую «указывала» переменная x. Если в программе были созданы другие собаки, они будут молчать до тех пор, пока не будет вызван их метод voice().
Таким образом, когда данные (поля) и команды (методы) описываются в одном классе, они оказываются тесно связаны друг с другом в объектах этого класса. Метод вызывается не сам по себе, а для конкретного объекта и работает с полями именно этого объекта.
Поэтому команды
voice();
age += 1;
не имеют никакого смысла, если употребляются вне методов класса Dog. Обязательно указание на конкретный объект, с которым производится действие. Внутри метода указание на конкретный объект не обязательно: в рассмотренном примере запись
for (int i = 1; i <= age; i++)
означает, что для определения «продолжительности» лая будет проверяться возраст того самого объекта, для которого будет вызван данный метод. Этот объект обозначается ключевым словом this.
Метод voice() можно было описать и так:
public void voice() {
for (int i = 1; i <= this.age; i++) {
System.out.println("гав-гав");
}
}
Ключевое слово this в этом примере наглядно указывает, что используется атрибут age именно того объекта класса Dog, для которого вызывается метод voice().
Когда имя метода или атрибута записывается без указания объекта, всегда подразумевается объект this.
Дата добавления: 2017-01-26; просмотров: 1562;