Объектно-ориентированное программирование на примере языка Java

Объектно-ориентированное программирование на примере языка

Java

Нестеренко Д. Ю.

Нестеренко Дмитрий Юрьевич /Nesterenko Dmitry Yuryevich - бакалавр программной

инженерии,

кафедра программной инженерии, факультет кибернетики, Национальный исследовательский ядерный университет Московский инженерно-физический институт, г. Москва

Аннотация: в статье рассматриваются принципы и особенности объектно-ориентированного программирования (ООП). Освещаются три основные парадигмы ООП и приводятся примеры на языке программирования Java.

Ключевые слова: объектно-ориентированное программирование, java, парадигмы, инкапсуляция, наследование, полиморфизм.

Введение

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

1. Объектно-ориентированное программирование и его парадигмы

Перед тем как начать рассматривать ООП на примере языка программирования JAVA стоит ввести определение, что же это такое и поговорить о его парадигмах.

Объектно-ориентированное программирование (ООП) — это методология программирования. Основная идея, которой это представление программы как совокупности объектов [4], которые в свою очередь являются экземплярами определённых классов. Сами же классы образуют иерархию наследования. В основе ООП лежат три принципа, а именно:

• Инкапсуляция

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

• Полиморфизм

Рассмотрим более подробно каждую парадигму и приведем конкретные примеры на языке программирования JAVA, но перед этим скажем несколько слов о JAVA. Данный язык программирования является объектно-ориентированным, разработанным компанией Sun Microsystems. Ключевой особенностью этого языка является то, что программа, написанная на java выполняется на виртуальной машине, что означает что программы, написанные на этом языке, при компиляции преобразуется не в машинный код, а в так называемый байт-код. Байт-код является машинным кодом виртуальной машины (JVM - Java Virtual Machine). В дальнейшем виртуальная машина обрабатывает байт-код и преобразует его уже в конкретные инструкции конкретной машины, выполняю, по сути, роль интерпретатора. Несомненным плюсом такого подхода является то, что программы, написанные на языке Java, могут быть запущены на абсолютно любой системе, на которой установлена виртуальная машина, тем самым получаем кроссплатформенные приложения.

2. Инкапсуляция

В ООП под инкапсуляцией подразумевается упаковка данных [2] и методов, функций, работающих с ними в один компонент, называемый объект. Для более простого понимания этого термина стоит представить некоторое производство, например, машиностроительный завод [3]. В своей структуре завод имеет множество частей, например, склад запчастей, сборочный конвейер, цех тестирования и т.д.

Переходя ближе к программированию можно провести ряд аналогий. Например, склад запчастей это какие-то данные, а сборочный конвейер и тестовый цех — это какие- то методы или функции, работающие с этими данными. Все вместе мы рассматриваем это как единую структуру, объект - машиностроительный завод. Ниже приводится класс AutomobileFactory, который олицетворяет наш абстрактный машиностроительный завод. Он будет содержать в себе всего два метода. Первый будет тем самым конвейером, который собирает автомобиль из запчастей, а второй будет цехом тестирования, который подтверждает правильно собран автомобиль или нет. public class AutomobileFactory {

public final String engine = "V8"; // Двигатель автомобиля public final String chassis = "Задний привод"; // Шасси автомобиля public final String body = "Седан"; // Кузов автомобиля

// Метод который строит какой-то автомобиль, принимая на вход его части

public String startConveyor(String engine, String chassis, String body){ String newCar = engine+" "+chassis+" "+body; return newCar; // Возвращаем результат работы конвейера

}

// Метод который проверяет правильность сборки полученного автомобиля

public String startTest(String newCar){ // Сравнение полученного с эталоном if(newCar.equals("V8 Задний привод Седан")){ // Выводит в консоль результат сравнения System.0иf.prmtln("Автомобиль: "+newCar+'\n'+"Cобран

корректно"); // Возвращаем автомобиль return newCar; }else{

// Выводит в консоль результат сравнения System.0иf.prmtln("Автомобиль: "+newCar+'\n'+"Собран не

корректно"); // Возвращаем автомобиль return newCar;

}

}

// Метод вызываемый при заупуске класса. public static void main(String[] args){ // Создали объект нашего завода AutomobileFactory factory = new AutomobileFactory(); // Создали новый автомобиль запустив сборку String newCar= factory.startConveyor(factory.engine,

factory.chassis, factory.body); // Протестировали полученный автомобиль factory.startTest(newCar);

}

}

После запуска данной простой программы в консоли выводится следующее сообщение:

Автомобиль: V8 Задний привод Седан Собран корректно

Данный пример довольно наглядно демонстрирует инкапсуляцию «в дело». Первоначально мы создали класс AutomobileFactory, который описывает нашу абстрактную фабрику. Задали в нем три поля для деталей автомобиля и два метода. За тем уже в методе main мы создали объект этого класса, создали автомобиль используя поля и методы этого класса и проверили правильность его сборки. Важно, что метод main мог быть расположен в любом другом классе и работал бы аналогично, но только при условии, что модификаторы видимости полей и методов были бы public.

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

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

// Унаследовали класс

public class UpdatedAutomobileFactory extends AutomobileFactory {

// Метод для создания лимузина

public String createlimousine(String newCar ){ newCar+= " Лимузин"; System.oMi.println(newCar); return newCar;

}

public static void main(String[] args){ // Создали объект нашего завода

UpdatedAutomobileFactory factory = new UpdatedAutomobileFactory(); // Издали новый автомобиль запустив сборку String newCar= factory.startConveyor(factory.engine,

factory.chassis, factory .body); // Протестировали полученный автомобиль factory.startTest(newCar);

// Превращаем построенный автомобиль в лимузин

factory.createlimousine(newCar); }

}

При запуске программы в консоль будет выведено следующее сообщение:

Автомобиль: V8 Задний привод Седан

Собран корректно

V8 Задний привод Седан Лимузин

Как видно из кода программы, класс UpdatedAutomobileFactory значительно меньше чем его родитель. Мы не описывали в нем методы, отвечающие за сборку седана и поля, содержащие в себе детали, так данный класс унаследован от AutomobileFactory и может использовать его поля и методы. Мы лишь добавили метод для превращения седана в лимузин. Наследование не только позволяет существенно ускорить написание программы путем использования уже готовых конструкций, но и позволяет поддерживать иерархию классов.

4. Полиморфизм

Полиморфизм в ООП - это свойство, которое дает возможность работать с несколькими типами так, как будто это один и тот же тип и в то же время поведение каждого типа будет уникальным [1] и зависеть от его реализации. Рассмотрим данное явление на примере нашего машиностроительного завода. Как и ранее представим, что мы имеем некий завод, который мы описали при помощи класса AutomobileFactory. Условно он состоял из трех частей, а именно склада с деталями, сборочного конвейера и цеха тестирования. Унаследовав от этого класса, мы получили класс UpdatedAutomobileFactory, описывающий завод со сходной структурой, но переделывающий обычные седаны в лимузины. Далее мы переписываем метод конвейера в классе наследника таким образом, чтобы на выходе мы сразу получали лимузины, таким образом мы переопределяем метод startConveyor. Рассмотрим далее это на примере кода программы. public class AutomobileFactory {

public final String engine = "V8"; // Двигатель автомобиля public final String chassis = «Задний привод»; // Шасси автомобиля public final String body = «Седан»; // Кузов автомобиля

// Метод который строит какой-то автомобиль, принимая на вход его части public String startConveyor(String engine, String chassis, String body){ String newCar = engine+" "+chassis+" "+body;

return newCar; // Возвращаем результат работы конвейера

}

}

public class UpdatedAutomobileFactory extends AutomobileFactory {

// Метод который строит какой-то автомобиль, принимая на вход его части

public String startConveyor(String engine, String chassis, String body){

String newCar = engine+" "+chassis+" "+" Лимузин"; System. oMi.println(newCar); return newCar; // Возвращаем результат работы конвейера

}

public static void main(String[] args){ // Создали объект нашего завода

AutomobileFactory factory = new UpdatedAutomobileFactory(); // Издали новый автомобиль запустив сборку String newCar= factory.startConveyor(factory.engine, factory.chassis, factory .body);

}

}

Особое внимание стоит обратить на строку AutomobileFactory factory = new UpdatedAutomobileFactory();

Как известно при создании экземпляра объекта в Java слева от его имени указывается тип. Как видно из данного примера объект UpdatedAutomobileFactory мы «сужаем» до объекта класса AutomobileFactory. Это никак не противоречит, так как UpdatedAutomobileFactory унаследован от AutomobileFactory, но каждый из этих классов имеет свою реализацию метода startConveyor. В таком случае может возникнуть вопрос, какой из методов должен быть вызван, ведь они названы одинаково. А вызван будет метод класса потомка. И в консоль будет выведено следующее сообщение:

V8 Задний привод Лимузин

Здесь мы видим, что объект factory обозначен как имеющий тип AutomobileFactory, соответствующий родительскому классу. Для его создания просто

29

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

разных заводов. Это и представляет собой полиморфизм.

Литература

1. Java course Полиморфизм. [Электронный ресурс]. URL: http://java-course.ru/begin/polymorphism/ (дата обращения: 07.08.2016).

2. Wikipedia Инкапсуляция. [Электронный ресурс]. URL: https://ru.wikipedia.org/wiki/Инкапсуляция/ (дата обращения: 07.08.2016).

3. TechNerium. Парадигмы объектно-ориентированного программирования на примере Java. [Электронный ресурс]. URL: http://www.technerium.ru/izuchenie-java-na-praktike/paradigmy-obektno-orientirovannogo-programmirovaniya-na-primere-java (дата обращения: 07.08.2016).

4. Wikipedia ООП. [Электронный ресурс]. URL: https://ru.wikipedia.org/wiki/ Объектно-ориентированное_программирование/ (дата обращения: 07.08.2016).

Технология VPN VipNet Наумов Р. В.

Наумов Родион Владимирович /Naumov Rodion Vladimirovich - студент, кафедра информационных технологий, институт математики и информатики, Северо-Восточный федеральный университет, г. Якутск

Аннотация: в статье предлагается описание, применение использования технологии VipNet, виды VPN.

Ключевые слова: VipNet, VPN, защищенная сеть.

ViPNet - это программное обеспечение, предназначенное для защиты передачи данных от внешних атак от компании Инфотекс.

VPN (Virtual Private Network - Виртуальная частная сеть) - это частная сеть передачи данных, сохраняющая при этом полную конфиденциальность передаваемых данных с помощью применения средств защиты информации [1].

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

Интранет VPN (Intranet VPN) - внутрикорпоративная виртуальная сеть, примером такой виртуальной сети могут быть филиалы одной организации, объединенной в единую защищенную сеть.

VPN удаленного доступа (Remote Access VPN) - виртуальная сеть с удаленным доступом, реализует защищенное соединение между сегментом корпоративной сети и удаленным пользователем.

Клиент - сервер VPN (Client - Server VPN) - обеспечивает защиту передачи данных между двумя узлами корпоративной сети.

Экстранет VPN (Extranet VPN) - межкорпоративная виртуальная сеть, реализует защищенное соединение компании с ее деловыми партнерами и клиентами [1].

Для защищенного взаимодействия в большой сети необходимо 3 обязательных элемента.