УДК 004.43:378.09
ПРОБЛЕМЫ ИЗУЧЕНИЯ ОБЪЕКТНЫХ ТЕХНОЛОГИЙ В ВУЗЕ1
Мясникова Нелли Александровна, доцент, Южно-Российский государственный технический
университет (Новочеркасский политехнический институт), Россия, Новочеркасск, [email protected]
Концепция объектно-ориентированного программирования (ООП) подразумевает, что основой управления процессом реализации программы является передача сообщений объектам. Поэтому объекты должны определяться совместно с сообщениями, на которые они должны реагировать при выполнении программы. В этом состоит главное отличие ООП от процедурного программирования, где отдельно определённые структуры данных передаются в процедуры (функции) в качестве параметров. Таким образом, объектно-ориентированная программа состоит из объектов, которые взаимодействуют друг с другом через определённые интерфейсы [4]. Объектно-ориентированный язык программирования должен обладать следующими свойствами:
1. абстракции - формальное представление о качествах или свойствах предмета путем мысленного удаления некоторых частностей или материальных объектов;
2. инкапсуляции - механизма, связывающего вмести код и данные, которыми он манипулирует, и защищающего их от внешних помех и некорректного использования;
3. наследования - процесса, с помощью которого один объект приобретает свойства другого, т.е. поддерживается иерархическая классификация;
4. полиморфизма - свойства, позволяющего использовать один и тот же интерфейс для общего класса действий.
Разработка объектно-ориентированных программ состоит из следующих последовательных работ:
• определение основных объектов, необходимых для решения данной задачи;
• определение закрытых данных (данных состояния) для выбранных объектов;
• определение второстепенных объектов и их закрытых данных;
• определение иерархической системы классов, представляющих выбранные объекты;
• определение ключевых сообщений, которые должны обрабатывать объекты каждого класса;
• разработка последовательности действий, которые позволяют решить поставленную задачу;
• разработка методов, обрабатывающих каждое сообщение;
• очистка проекта, то есть устранение всех вспомогательных промежуточных материалов, использовавшихся при проектировании;
• кодирование, отладка, компоновка и тестирование.
Объектно-ориентированное программирование позволяет программисту моделировать
объекты определённой предметной области путем программирования их содержания и поведения в рамках конструкции класса. Конструкция «класс» обеспечивает механизм инкапсуляции для реализации абстрактных типов данных.
Элементы объектно-ориентированного программирования (ООП) появились в конце 60-х годов в языке моделирования Симула, затем получили свое развитие в нескольких других языках программирования. В настоящее время ООП принадлежит к числу ведущих технологий программирования. Основная цель ООП, как и большинства других подходов к программированию, - повышение эффективности разработки программ. В традиционных методах программирования изменение данных или правил и методов обработки часто приводило к необходимости значительного изменения программы. Всякое существенное изменение программы - это большая неприятность для программиста, так как при этом
1 Лауреат номинации "Лучший доклад о методах преподавания объектных технологий в ВУЗе". Автор доклада награждается правом бесплатной публикации одного доклада по данной тематике на следующей конференции
86
увеличивается вероятность ошибок, вследствие чего возрастает время, необходимое для «доводки» программы. Использование ООП позволяет выйти из такой ситуации с минимальными потерями, сводя необходимую модификацию программы к её расширению и дополнению. Необходимо заметить, что ООП не является панацеей от всех программистских бед, но его ценность как передовой технологии программирования несомненна. Изучение идей и методов ООП может существенно упростить разработку и отладку сложных программ.
В период быстрорастущего количества объектных языков и развития объектноориентированных технологий остро встаёт проблема выбора языка для знакомства с основами объектно-ориентированного программирования. К сожалению, в настоящее время для знакомства с азами объектно-ориентированного программирования отсутствует общепризнанный язык, подобный Паскалю, повсеместно используемому для обучения основам программирования. Одним из вариантов может быть язык Java [3], созданный в 1995 году компанией Sun Microsystems, который распространён более других языков, и имеет много преимуществ. Одним из существенных его достоинств является кроссплатформенность, так как исходный код программы компилируется в специальный байт-код, поэтому может быть запущен на любой виртуальной машине Java, независимо от архитектуры. Но в тоже время существенный недостаток данного языка - количество потребляемых ресурсов (памяти, времени процессора и т. д.). Для преподавания в ВУЗе Java подходит, потому что синтаксис данного языка был частично заимствован из языка C++, что удобно для тех студентов, которые для знакомства с программированием изучали языки C/C++. В то же время это язык с нагроможденными синтаксическими конструкциями, который очень сложен в понимании.
Другим вариантом для знакомства с ООП может служить язык Python [5], так как этот язык имеет минималистический синтаксис, частично заимствованный из языка C, поддерживает структурное, объектно-ориентированное, функциональное и аспектноориентированное программирование. Для него характерны динамическая типизация, автоматическое управление памятью, полная интроспекция, поддержка многопоточных вычислений и т. д. И Java, и Python имеют сходные характеристики, однако высокоуровневые конструкции в языке Python более удобны для обучения основам ООП. Также существует реализация для JVM (Java Virtual Machine), при которой Python-код может быть запущен на виртуальной машине Java, что удобно, если совместно изучать языки Java и Python.
Python-программы выполняются медленнее, чем программы Java (обычно в 3-5 раз). Однако программы, написанные на Python, также требуют намного меньше времени для разработки. Это можно объяснить тем, что в Python встроены высокоуровневые типы данных, а также Python обладает динамической типизацией. Мощные типы полиморфных списков и словарей Python, для которых богатая синтаксическая поддержка встроена прямо в сам язык, находят применение почти в каждой Python-программе.
Динамическая типизация требует больше обработки во время выполнения, чем статическая, принятая в Java. Рассмотрим выражение (a + b). Python должен сначала исследовать объекты a и b, для того, чтобы выяснить их типы, которые неизвестны во время компиляции. После этого вызывается соответствующая операция сложения, которая может оказаться перегруженным пользователем методом. Язык Java, с другой стороны, может выполнять более эффективное сложение целых, а также чисел с плавающей точкой, но при этом требуются описания переменных a и b, и Java не позволяет перегружать оператор «+» для экземпляров классов, определенных пользователем.
По вышеописанным причинам язык Python лучше подходит как «склеивающий» язык, в то же время Java лучше характеризуется как низкоуровневый язык для реализации. Фактически, если использовать их совместно для разработки одного приложения, то можно получить довольно неплохой результат. Например: компоненты можно реализовывать на Java, а затем использовать в приложениях на Python; Python также полезно использовать для
87
прототипов компонентов, пока их разработка не «затвердеет» в Java-реализации [2]. Для поддержки такого типа разработки создается реализация Python, написанная на Java. Она позволяет вызывать Python код из Java и наоборот. В этой реализации исходный код Python транслируется в байт-код Java с помощью библиотеки времени выполнения для поддержки динамической семантики Python.
С целью определения языков, наиболее подходящих для обучения основам ООП, был проведен эксперимент: на разных языках ООП был запрограммирован один и тот же алгоритм (сортировка методом пузырька). Сравнение проводилось на основе времени, которое требуется для сортировки 10000 случайных элементов.
C/C++ - 0,330 сек.
Python - 42 сек.
Java - 0,515 сек.
С# - .NET 3.5 -0,350 сек.
В то же время, если увеличить количество до 100000 элементов, то для Python это будет довольно объемная программа, и нет смысла включать ее в тест.
C/C++ - 27,6 сек.
Java - 37,7 сек.
C# - 32, 5 сек.
Это объясняется тем, что у Python^ динамическая типизация, т.е. у него совсем другие задачи, чем у трех других исследуемых языков. Динамическая типизация - приём, широко используемый в языках программирования и языках спецификации, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной.
Сравнительная характеристика языков ООП по времени исполнения программ на Pentium 4 (1.8Ггц) и производительности (относительно производительности базового кода на C++) показано на рис. 1.
Та же диаграмма, но в виде таблицы:
Таблица 1. Сравнительная характеристика языков ООП
Язык программирования Java Java -server C++ C++, -O2 PHP Python 2.6 Python 3.1 Perl 5.8 Ruby 1.8 Ruby 1.9
Время исполнения, сек 5,3 2,8 8,5 2,6 62 91 145 91 207 30
Производительность, % 160 303 100 327 14 9 6 9 4.11 28
88
Тестовый программный код
Java, TestOl.java
public class Test01 {
public static void main(String[] args) {
long start = System.currentTimeMillis(); long r = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) { r = (r + (i * j) % 100) % 47;
}
}
System.out.println("answer: " + r);
System.out.println("run time (millis): " + (System.currentTimeMillis() -
start));
}
C++, TestOl.cpp
#include <iostream> using namespace std;
int main(void) { long r = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) { r = (r + (i * j) % 100) % 47;
}
}
cout << "answer: " << r << endl;
}
PHP, TestOl.php:
<?php $r = 0;
for ($i = 0; $i < 10000; $i++) {
for ($j = 0; $j < 10000; $j++) {
$r = ($r + ($i * $j) % 100) % 47;
}
}
echo 'answer: ' . $r . "\n";
?>
Python, TestOl.py:
r = 0
for i in range(0, 10000):
for j in range(0, 10000):
r = (r + (i * j) % 100) % 47
print("answer: ", r)
Среда тестирования:
$ cat /proc/cpuinfo |fgrep 'model name'
model name : Intel(R) Pentium(R) Dual CPU T3400 @ 2.16GHz
model name : Intel(R) Pentium(R) Dual CPU T3400 @ 2.16GHz
$ java -version java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.7) (6b20-1.9.7-0ubuntu1)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)
$ g++ -v
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
89
$ php-v
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:07:38)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
$ python2.6
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)
$ python3.1
Python 3.1.2 (release31-maint, Sep 17 2010, 20:27:33)
На данный момент языков для ООП множество, и у каждого есть свои преимущества и свои недостатки. Для изучения в ВУЗе наиболее всего подходит язык Java параллельно с Python, именно поэтому акцент был сделан на этих двух языках.
Литература
1. Бертран Мейер. Объектно-ориентированное конструирование программных систем + CD. Интернет-университет информационных технологий - ИНТУИТ.ру, Русская Редакция, 2005
2. http://habrahabr.ru
3. http://ru.wikipedia.org/wiki/Java
4. http://refu.ru/refs/67/15499/Lhtml
5. http://4programmers.org.ua.
УДК 004.4
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ МОДЕЛИРОВАНИЕ АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ИНТЕГРАЦИИ ОТКРЫТЫХ ВИРТУАЛЬНЫХ ЛАБОРАТОРНЫХ КОМПЛЕКСОВ1
Жукова Светлана Александровна, к.т.н., докторант, Чайковский технологический институт (филиал) Ижевского государственного технического университета, Россия, Чайковский,
otdel [email protected]
Германюк Денис Евгеньевич, аспирант, Чайковский технологический институт (филиал) Ижевского государственного технического университета, Россия, Чайковский
В настоящее время в России активно ведутся работы по созданию и развитию научнообразовательной среды с использованием Интернет-технологий для поддержки процессов проведения научных исследований и образования [1]. Формирование научнообразовательной среды предполагает разработку и внедрение информационных систем, обеспечивающих тесное взаимодействие научных и образовательных ресурсов посредством глобальных вычислительных сетей, и использует методы и технологии построения распределенных открытых систем [2]. Для данных систем характерно:
• территориальная удаленность пользователей;
• использование неоднородного программного и аппаратного обеспечения;
• динамическое наращивание функциональных сервисов приложений;
• множество объектов и их распределенность;
• неоднородность ресурсов,
что и характеризует их как сложные информационные системы. В этом случае возрастает роль моделирования и исследования структуры системы.
1 Статья рекомендована к опубликованию в журнале "Информационные технологии и вычислительные системы"
90