Научная статья на тему 'ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ В ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ'

ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ В ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
545
40
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ / OBJECT-ORIENTED PROGRAMMING / КЛАСС / CLASS / ОБЪЕКТ / OBJECT / ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ / OBJECT INTERACTION

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Залогова Л.А.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Залогова Л.А.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

OBJECT INTERACTION IN OBJECT-ORIENTED PROGRAMMING

An object-oriented program consists of a set of objects. The usage of isolated objects solves only a small number of tasks. Typically, they are the objects which exchange messages, i.e. interact with each other, that are of interest. The paper specifies one of the possible ways to organize object interaction and provides fragments of a programming code for a specific example. To visualize the message exchange between objects, interaction diagrams and sequence diagrams are described. The proposed methods can be used in teaching the object-oriented programming technology.

Текст научной работы на тему «ВЗАИМОДЕЙСТВИЕ ОБЪЕКТОВ В ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПРОГРАММИРОВАНИИ»

ВЕСТНИК ПЕРМСКОГО УНИВЕРСИТЕТА

2016 Математика. Механика. Информатика Вып.3(34)

ИНФОРМАТИКА ИНФОРМАЦИОННЫЕ СИСТЕМЫ

УДК 004.432.4

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

Л. А. Залогова

Пермский государственный национальный исследовательский университет 614990, Россия, Пермь, ул. Букирева, 15 zalogova. la@gmail .com

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

Ключевые слова: объектно-ориентированное программирование; класс; объект; взаимодействие объектов.

DOI: 10.17072/1993-0550-2016-3-94-102

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

© Залогова Л. А., 2016

чении технологии объектно-ориентированного программирования.

Как правило, использование изолированных объектов не позволяет достичь поставленной цели. Интерес представляет взаимодействие объектов, т.е. обмен информацией между объектами. Обычно говорят, что один объект взаимодействует с другим посредством сообщений, т.е. в процессе взаимодействия объекты обмениваются сообщениями. Сообщение - это вызов метода. Совместное использование методов различных объектов -показатель взаимодействия объектов. Таким образом, методы одного объекта должны вызывать методы других объектов. В этом случае ни один метод, участвующий во взаимодействии, не может достигнуть цели самостоятельно. Именно поэтому так важно правильно организовать обмен информацией между методами различных объектов. Такой обмен предполагает, что результаты работы метода одного объекта являются исходными данными для метода другого объекта. Если

объект класса ClassB посылает

сообщение объекту класса

ClassА, то это означает, что объект вызывает метод объекта

(рис. 1). В этом случае при описании классов ClassA и ClassB возникает вопрос: как обратиться к методу класса ClassA в методе класса ClassB?

ClassA objectl

Решение этого вопроса состоит в следующем.

Вариант 1. Создать объект класса ClassA в качестве поля класса ClassB; после этого из любого метода класса ClassB можно обращаться к методам класса ClassA.

Вариант 2. Создать объект класса ClassA в качестве локального объекта некоторого метода класса ClassB; в дальнейшем в этом методе можно обращаться к методам класса ClassA.

Рассмотрим, как реализуется взаимодействие объектов на примере задачи "Курсы по выбору".

Постановка задачи. Каждый студент должен прослушать и сдать несколько курсов, перечисленных в учебном плане. Студент должен записаться на выбранные курсы. Только после этого можно приступить к занятиям и сдаче экзаменов. Язык программирования - С# [3].

Определим класс Student, который содержит информацию об отдельном студенте (рис. 2).

: Student

s name

s id

name "id

Student Display Equals

Рис. 2. Диаграмма объекта класса Student

В классе Student описано два поля -имя студента s name и номер студента s id. Методы класса: конструктор, печать информации о студенте и сравнение двух объектов класса Student на равенство (листинг 1).

Кроме класса Student необходим класс Course, который содержит информацию об отдельном курсе (рис. 3).

class Student{

string s name; // имя студента int s id; // номер студента

// описание свойств S name и S id . . .

public Student(string s name, int s id) {// конструктор . . public void Display(){ //вывод информации о студенте . . . // метод сравнивает два объекта класса Student на равенство public override bool Equals(object obj) { Student p = obj as Student;

return ((s name == p.s name)&&(s id == p.s id));

}

}

Сообщение Find -->

Объект Obj ect2 вызывает метод Find объекта obj ectl (obj ectl. Find) Рис. 1. Передача сообщения между объектами

: Course c_name|

C_name С id

Cours e

Display

Equals

Рис. 3. Диаграмма объекта класса Course

Поля класса Course - название курса c name и номер курса c id. Методы класса - конструктор, печать информации о курсе и сравнение двух объектов класса Course на равенство (листинг 2).

Студент должен записаться на курсы. Однако класс Course не содержит информации о студентах, а класс Student - о курсах. Следовательно, студент не может записаться на курсы, а курс невозможно связать с информацией о студентах, которые его посещают. Поэтому опишем еще два класса CSLink и CSRecords.

CSLink

grade^

S_id C_id Grade

CSLink Equals

Рис. 4. Диаграмма объекта класса CSLink

Класс CSLink связывает одного студента с одним курсом (рис. 4).

Поля класса CSLink - номер студента s id, номер курса c id и оценка студента по курсу gradе. Методы этого класса - конструктор и проверка на совпадение номеров студентов и номеров курсов у двух объектов класса CSLink (листинг 3).

Класс CSRecords используется для записи студентов на курсы (рис. 5).

class Course {

string c name; // название курса

int c id; // номер курса

// описание свойств C name и C id . . .

public Course(string c name, int c id) { // конструктор . .. } public void Display() {// вывод информации о курсе . . . } // метод сравнивает два объекта класса Course на равенство public override bool Equals(object obj) { . . . }

}

Листинг 2. Описание класса Course

class CSLink {

int s id, c id; // номер студента, номер курса int grade; // оценка

// описание свойств S id, C id и Grade . . .

public CSLink (int s id, int c id) { // конструктор . . . } // проверка на совпадение номеров студентов и номеров курсов public override bool Equals(object obj) { CSLink p = obj as CSLink;

return ((s id == p.s id) && (c id == p.c id));

}

} //class CSLink

:CSRecords

cs L ink s

: CSLink

s_id | c. |

с id | S |

pfzadej |

id e id Grade

CSLink Equals

ma counts [_ cur_counts |

Macounts

Cur_count s

CSRecord CS_Find AddRecard Display

Рис. 5. Диаграмма (пример) объекта класса CSRecords

:CSLink

s_id [ 201

c_id | | |

grade | |

Sid C_ id Grade

CSLink Equals

Поля класса CSRecords - массив cs Links, содержащий информацию о том, какие студенты на какие курсы записаны; max counts и cur counts - максимальное и текущее количество записей студентов на курсы.

Перед записью студента на курс нужно проверить, существует ли объект с заданным номером студента и номером курса в массиве cs Links. С этой целью в классе CSRecords описан метод CS Find, который

S создает объект temp класса CSLink (рис. 6), содержащий заданный номер студента num st и номер курса num course:

CSLink temp =

new CSLink(num st, num course);

S сравнивает объект temp с объектами массива cs Links, а именно, вызывает метод Equals объекта temp; параметр этого метода - текущий объект массива

cs Links:

int i=0;

while((i<cur counts)&&

!temp.Equals(cs_Links[i]))

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

i++;

Рис. 6. Диаграмма (пример) объекта temp класса CSLink

Таким образом, перед добавлением нового объекта в массив cs Links объект класса CSRecords посылает сообщение Equals объекту temp класса CSLink. Если объект с заданным номером студента и номером курса отсутствует в массиве cs Links, метод AddRecord добавляет объект temp в этот массив, т.е. записывает студента на курс. При этом считается, что номер студента и номер курса заданы верно (существуют). Запись студента на курс завершается успешно, если она не является повторной, и не превышено максимально допустимое количество записей.

Метод Display() распечатывает информацию обо всех объектах массива cs Links. Так как доступ к полям объектов класса CSLink - частный (private), получить их значения можно только в результате использования метода get соответствующих свойств. Поэтому объект класса CSRe-cords посылает сообщения каждому объек-

ту массива cs Links для определения номера студента, номера курса и соответствующей оценки:

for (int i=0; i< cur counts; i++) Console.WriteLine("Student: " + cs_Links [i].S_id + "Course " + cs_Links [i].C_id + " Grade " + cs_Links [i].Grade);

Описание класса CSRecords представлено в листинге 4.

В результате создания объекта класса CSRecords и записи студентов на курсы создаются и входящие в этот объект компоненты - объекты класса CSLink. Поэтому объект класса CSRecords является составным, а отношение между объектами классов CSRecords и CSLink - отношением включения.

class CSRecords {

CSLink [] cs Links; //ссылка на массив объектов класса CSLink int max counts; // максимальное количество записей

// студентов на курсы int cur counts; // текущее количество записей студентов на курсы // описание свойств Max counts и Cur counts . . . public CSRecords(int max counts) {// конструктор . . . } //метод проверяет, существует ли запись студента на курс public bool CS Find (int num st, int num course){

int i=0; CSLink temp = new CSLink (num st, num course); while ((i < cur counts) && !temp.Equals(cs_Links [i])) i++; if (i == cur counts) return (false); else return (true);

}

//метод записывает студента на курс

public bool AddRecord(int num st, int num course){ if (!CS Find (num st, num course))

// добавление информации о записи студента // на курс в массив cs Links . . .

}

// печать информации обо всех записях студентов на курсы

public void Display(){

for (int i=0; i< cur counts; i++)

Console.WriteLine("Student: " + cs_Links [i].S_id + "

Course " + cs_Links [i].C_id+ " Grade " +cs_Links [i].Grade);

}

}

Еще один класс Recorder содержит список всех студентов и список всех курсов (рис. 7).

Эта информация хранится в массивах list Student и list Course соответственно. Массив list Student может содержать студентов, которые пока не записались ни на один курс; а в массив list Course могут входить курсы, которые пока никто не выбрал. Кроме того, в классе Recorder описан объект csr CSRecords класса CSRecords, который связывает студентов, курсы и записи о выбранных студентами курсах.

Методы AddStudent и AddCourse добавляют новых студентов и новые курсы в соответствующие массивы. Сначала метод AddStudent проверяет, существует ли объект с заданным именем и номером студента в массиве list Student, а именно:

S создает объект temp класса Student, содержащий заданные значения имени name и номера студента num s t:

Student temp =

new Student(name, num st);

S сравнивает объект temp с объектами массива list Student, а именно, вызывает метод Equals объекта temp; параметр этого метода - текущий объект массива студентов:

int i=0;

while ((i < cur st) &&

!temp.Equals(list_Student[i]))

i++;

Таким образом, чтобы избежать повторного включения информации о студенте в массив list Student, объект класса Recorder посылает сообщение Equals объекту temp класса Student. Если объект с заданным именем и номером студента отсутствует в массиве, объект temp добавляется в массив.

Аналогичная ситуация имеет место и при добавлении курсов: перед включением записи о курсе в массив list Course объект класса Recorder посылает сообщение Equals объекту temp класса Course .

:Recorder

list Student

list Course

cur_st I I

cur_cs I I

max_st I I

max_cs I I

Li s t_5 tudent List Course

Recorder Addstudent AddCourse StDisplay CsDisplay Recording

Рис. 7. Диаграмма объекта класса Recorder

Как только студенты и курсы добавлены, можно начинать запись студентов на курсы. Для этого используется метод Recording, входные данные которого - номер студента и номер курса. Метод Recording

S проверяет наличие заданного студента student id в массиве list Student:

int i=0;

while ((i < cur st)&& (student id!=

lis t_Student[i] .S_id) )

в этом случае объект класса Recorder посылает сообщения каждому объекту массива list Student для определения номера студента;

S проверяет наличие заданного курса

course id в массиве list Course:

int j=0;

while ((j < cur cs) && (course id !=

list_Course[j]. C_id))

j++;

здесь объект класса Recorder посылает сообщения каждому объекту массива

list Course;

S вызывает метод AddRecord объекта csr CSRecords, т.е. для записи студента на курс объект класса Recorder посылает сообщение AddRecord объекту

csr CSRecords:

csr_CSRecords.AddRecord

(student_id , course_id).

Кроме того, при печати списка студентов и списка курсов объект класса Recorder посылает сообщения объектам класса Student и Course для получения имени и номера студента, а также имени и номера курса (листинг 5).

class Recorder {

Course [] list Course ; // ссылка на массив курсов Student [] list Student; // ссылка массив студентов CSRecords csr CSRecords; //ссылка на объект класса CSRecords int cur st; //текущее количество студентов

// описание свойств List Course и List Student . . . // конструктор . . .

// метод добавляет студента в массив студентов public void AddStudent(string name, int num st) { Student temp = new Student(name, num st); int i = 0; //проверяем, есть ли такой студент

while ((i < cur st) && !temp.Equals(list_Student[i])) i++;

if //не нашли, добавляем объект temp в массив list Student }

public void St Display(){ //вывод списка студентов for (int i = 0; i < cur st; i++)

Console.WriteLine(list_Student[i].S_name + " " +

list_Student[i].S_id);

}

// метод добавляет курс в массив курсов

public void AddCourse (string name, int num cs) { . . . } public void Cs Display(){ //вывод списка курсов . . . } // метод записывает студента на курс

public bool Recording (int student id, int course id){

if (csr_CSRecords.AddRecord(student_id, course_id))

return (true); else return (false);

}

}

Листинг 5. Описание класса Recorder

Таким образом, в процессе использования объекта класса Recorder реализуется взаимодействие объектов классов Student, Course, CSLink и CSRecords.

Важно наглядно представить передачу сообщений между различными объектами.

Для этой цели используются диаграммы взаимодействия и последовательностей [2].

На диаграмме взаимодействия изображаются последовательность (временной порядок) пе-объекты и их основные связи (рис. 8). Диа- редачи сообщений (рис. 9). грамма же последовательностей описывает

: Student

: CSReoords

: Recorder

: CSLink

: Course

Рис. 8. Диаграмма взаимодействия для задачи "Курсы по выбору"

Рис. 9. Диаграмма последовательностей для задачи "Курсы по выбору"

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

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

В статье представлено частичное решение задачи "Курсы по выбору", которое отвечает лишь за запись студентов на курсы. В дальнейшем это решение следует дополнить реализацией следующих действий:

• выставить оценку студенту по курсу;

• выяснить, сколько студентов не сдали курс;

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

• установить, какое количество студентов успешно освоили курс;

• выявить, на какой курс записалось наибольшее количество студентов

и др.

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

1.Гради Буч и др. Объектно-ориентированный анализ и проектирование с примерами приложений. М.: Вильямс, 2010.

2.Гради Буч и др. Язык UML. Руководство пользователя. М.: ДМК Пресс, 2007

3.Герберт Шилдт. Полный справочник по С#. М.: Вильямс, 2007.

Object interaction in object-oriented programming

L. A. Zalogova

Perm State University; 15, Bukireva st., Perm, 614990, Russia zalogova.la@gmail.ru

An object-oriented program consists of a set of objects. The usage of isolated objects solves only a small number of tasks. Typically, they are the objects which exchange messages, i.e. interact with each other, that are of interest. The paper specifies one of the possible ways to organize object interaction and provides fragments of a programming code for a specific example. To visualize the message exchange between objects, interaction diagrams and sequence diagrams are described. The proposed methods can be used in teaching the object-oriented programming technology.

Keywords: object-oriented programming; class; object; object interaction.

Object interaction in object-oriented programming

L. A. Zalogova

Perm State University; 15, Bukireva st., Perm, 614990, Russia zalogova.la@gmail.ru

Object-oriented program consists of a set of objects. The usage of the isolated objects solves only a small number of tasks. Typically the objects, which exchange the messages, that is interact with each other, are of great interest. The paper specifies one of the possible ways to organize the object interaction; the fragments of programming code are given for a specific example. Interaction diagrams and sequence diagrams are described to visualize the message exchange between the objects. The suggested methodology can be used in object-oriented programming technology teaching.

Keywords: object-oriented programming; class; object; object interaction.

i Надоели баннеры? Вы всегда можете отключить рекламу.