Файл: Применение объектно-ориентированного подхода при проектировании информационной системы (Методы и средства).pdf
Добавлен: 23.04.2023
Просмотров: 12099
Скачиваний: 1
ВВЕДЕНИЕ
ООП (Объектно-Ориентированное Программирование) стало неотъемлемой частью разработки многих современных проектов, но, не смотря на популярность, эта парадигма является далеко не единственной. Если вы уже умеете работать с другими парадигмами и хотели бы ознакомиться с оккультизмом ООП, то впереди вас ждет немного лонгрид и два мегабайта картинок и анимаций. В качестве примеров будут выступать трансформеры.
Объектно-ориентированный подход в последнее десятилетие стал одним из наиболее интенсивно развивающихся направлений в программировании и наиболее популярным средством разработки программного обеспечения [7].
Объектно-ориентированное программирование — это шаблон проектирования ПО, позволяющий решать задачи разработчика с точки зрения взаимодействия объектов. При этом большая часть объектно-ориентированных языков, например, Ruby, Python, Java, C++ наследуют на основе классов. Если говорить о JavaScript, то в нём ООП реализуется через прототипное наследование.
Наиболее удачное и популярное определение ООП звучит следующим образом — это методология программирования, которая основана на представлении программы в виде совокупности ряда объектов, причём каждый из этих объектов — это экземпляр определённого класса.
Начало развитию объектно-ориентированного подхода положил язык Simula 67, который был разработан в конце 60-х гг. в Норвегии. Несмотря на то, что язык намного опередил свое время, современники (программисты 60-х гг.) оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (прежде всего, с языком Fortran) [4].
Но достоинства языка Simula 67 были замечены некоторыми программистами, и в 70-е гг. было разработано большое число экспериментальных объектно-ориентированных языков программирования. В результате исследования этих языков были разработаны современные объектно-ориентированные языки программирования: C++, Ada, Smalltalk и др [9].
Вместе с развитием объектно-ориентированного программирования стали развиваться и объектно-ориентированные методы разработки программного обеспечения, охватывающие стадии анализа и проектирования. Среди общепризнанных объектно-ориентированных подходов к анализу и проектированию следует выделить методы Г. Буча [3, 4], Д. Рамбо, А. Джекобсона, Шлеера-Меллора и Коуда-Йордона. В результате объединения усилий первых трех авторов появился на свет унифицированный язык моделирования UML [2, 5, 7, 9], который в 1997 г. был принят в качестве стандарта консорциумом Object Management Group и получил широкое распространение в сфере производства программного обеспечения.
Объектно-ориентированный подход дает следующие основные преимущества:
- уменьшение сложности программного обеспечения;
- повышение его надежности;
- обеспечение возможности модификации отдельных компонент программ без изменения остальных компонент;
- обеспечение возможности повторного использования отдельных компонент программного обеспечения.
Систематическое применение объектно-ориентированного подхода позволяет разрабатывать хорошо структурированные, надежные в эксплуатации, достаточно просто модифицируемые программные системы. Этим объясняется интерес программистов к объектно-ориентированному подходу и объектно-ориентированным языкам программирования.
Целью данной работы является введение в объектно-ориентированный подход к разработке программного обеспечения.
Для достижения поставленной цели в работе рассматриваются такие понятия объектно-ориентированного программирования как классы и объекты, ассоциация, наследование, полиморфизм, инкапсуляция, абстракция, паттерны проектирования и фреймворки.
Объектом исследования является объектно-ориентированная парадигма программирования. Предметом исследования – объектно-ориентированные языки программирования.
Структурно работа состоит из введения, заключения
1. ОБЗОР ЭЛЕМЕНТОВ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ И ИХ СВОЙСТВ
1.1 Классы и объекты
Сразу лирическое отступление: объектно-ориентированный подход возможен и без классов, но мы будем рассматривать, извиняюсь за каламбур, классическую схему, где классы — наше всё.
Самое простое объяснение: класс — это чертеж трансформера, а экземпляры этого класса — конкретные трансформеры, например, Оптимус Прайм или Олег. И хотя они и собраны по одному чертежу, умеют одинаково ходить, трансформироваться и стрелять, они оба обладают собственным уникальным состоянием. Состояние — это ряд меняющихся свойств. Поэтому у двух разных объектов одного класса мы можем наблюдать разное имя, возраст, местоположение, уровень заряда, количество боеприпасов и т. д. Само наличие этих свойств и их типы описываются в классе.
Таким образом, класс — это описание того, какими свойствами и поведением будет обладать объект. А объект — это экземпляр с собственным состоянием этих свойств.
Мы говорим «свойства и поведение», но звучит это как-то абстрактно и непонятно. Привычнее для программиста будет звучать так: «переменные и функции». На самом деле «свойства» — это такие же обычные переменные, просто они являются атрибутами какого-то объекта (их называют полями объекта). Аналогично «поведение» — это функции объекта (их называют методами), которые тоже являются атрибутами объекта. Разница между методом объекта и обычной функцией лишь в том, что метод имеет доступ к собственному состоянию через поля.
Итого, имеем методы и свойства, которые являются атрибутами. Как работать с атрибутами? В большинстве ЯП оператор обращения к атрибуту — это точка (кроме PHP и Perl). Выглядит это примерно вот так (псевдокод):Объектно-ориентированное программирование (сокращенно ООП) - это парадигма разработки программных систем, в которой приложения состоят из объектов [6].
Объекты - это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс Character (персонаж), а его экземплярами будут hero или npc.
Свойства - это данные, которые связаны с конкретным объектом:
- здоровье;
- очки;
- деньги;
- сила;
- ловкость;
- интеллект;
- скорость;
- координаты [6].
Поведение объекта определяется с помощью методов - специальных блоков кода, которые можно вызывать из разных частей программы. Например, у того же объекта Character могут быть следующие методы:
- идти;
- атаковать;
- говорить;
- подобрать;
- выбросить;
- использовать.
Используя эти свойства и методы, можно значительно ускорить разработку, сделать код более читаемым. К тому же самому программисту проще составлять код, если он думает с помощью объектов [6].
То есть он не пишет какую-то функцию, которая будет делать что-то для программы в целом. Вместо этого он мысленно разделяет приложение на отдельные компоненты и продумывает их свойства и поведение. Такую парадигму используют многие популярные языки: C#, Java, Python, JavaScript, PHP, Swift, C++ (таблица 1).
Таблица 1 - Плюсы и минусы объектно-ориентированного программирования
|
Плюсы |
Минусы |
|
Легко читается. Не нужно выискивать в коде функции и выяснять, за что они отвечают. |
Потребляет больше памяти. Объекты потребляют больше оперативной памяти, чем примитивные типы данных. |
|
Быстро пишется. Можно быстро создать сущности, с которыми должна работать программа. |
Снижает производительность. Многие вещи технически реализованы иначе, поэтому они используют больше ресурсов. |
|
Проще реализовать большой функционал. Так как на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей. |
Сложно начать. Парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени. |
|
Меньше повторений. Не нужно писать однотипные функции для разных сущностей |
Изучая C#, разработчик в первый же день сталкивается с классами и объектами. Например, вот как выглядит первая программа любого новичка:
using System;
namespace OOPConsole
{
class Program
{
static void Main(string[5] args)
{
Console.WriteLine(«Hello World!»);
}
}
}
Здесь создается класс Program, у которого есть метод Main () - с него начинается выполнение программы, поэтому его называют точкой входа. Для вывода текста используется следующий оператор:
Console.WriteLine(«Hello, World!»);
Тут программа обращается к объекту Console и вызывает метод WriteLine (), который выводит переданное значение в консоль. Также у объекта Console есть разные свойства:
Console.ForegroundColor = ConsoleColor.Red; // Цвет шрифта - красный
Console.BackgroundColor = ConsoleColor.Blue; // Цвет фона - синий
Если бы не было объекта, было бы сложно определить, цвет какого фона и какого шрифта будет указываться, потому что их в программе может быть несколько.
Теперь можно добавить поля и свойства для класса. Поле объявляется как обычная переменная:
class Character
{
int health = 100;
int x = 50;
int y = 25;
}
Теперь у объекта есть свои поля, но к ним нельзя обратиться извне, потому что закрыт доступ (подробнее об этом - в статье про инкапсуляцию). Чтобы его открыть, нужно поставить перед каждым полем ключевое слово public. То же слово нужно поставить перед словом class.
public class Character
{
public int health = 100;
public int x = 50;
public int y = 25;
}
Теперь можно вернуться к созданному объекту и обратиться к его полю здоровья:
Console.WriteLine(hero.health);
Если доступ к полям открыт, то с ними можно проводить вычисления или просто получать их значение. Это специальные конструкции, которые позволяют обращаться к полям [6]. Чтобы создать свойства, нужно сначала закрыть доступ к полям с помощью уровня доступа private - тогда они будут доступны только изнутри класса:
public class Character
{
private int health = 100;
private int x = 50;
private int y = 25;
}
Методы являются аналогами функций (возвращают значение) и процедур (не возвращают), но с той разницей, что они являются частью какого-то класса [6]. Например, можно в классе Character создать метод Move (), который будет отвечать за движение персонажа.
public void Move(string direction)
{
switch (direction)
{
case «forward»:
this.x++;
break;
case «backward»:
this.x--;
break;
case «up»:
this.y++;
break;
case «down»:
this.y--;
break;
}
}
Сначала указывается уровень доступа public, затем тип возвращаемого значения (в данном случае используется void, что говорит компилятору о том, что ничего возвращать не нужно).
Затем идет название метода и круглые скобки. Внутри скобок указываются аргументы, которые принимает метод (в данном случае направление движения), - от переданных аргументов зависит результат работы метода [6].
Таким образом, были рассмотрены классы и объекты объектно-ориентированного программирования.
1.2 Ассоциация
Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Например, менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример - Преподаватель и Студент - т.е. какой-то Студент учится у какого-то Преподавателя.
Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя. Идея достаточно простая - два объекта могут быть связаны между собой и это надо как-то описать [4].
Агрегация и композиция на самом деле являются частными случаями ассоциации. Это более конкретизированные отношения между объектами. Агрегация – отношение, когда один объект является частью другого. Например, студент входит в группу любителей физики [2].
Композиция - еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Например, машина и двигатель.
Хотя двигатель может быть и без машины, но он вряд ли сможет быть в двух или трех машинах одновременно. В отличии от студента, который может входить и в другие группы тоже. Такие описания всегда несколько условны, но тем не менее [8].
Таким образом, на самом деле каких-либо сложных и высокоумных технических решений нет - все достаточно тривиально. В одном классе делается ссылка на другой и наоборот.
1.3 Наследование
Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации [1].
Например, подумайте об описании жилого дома. Дом - это часть общего класса, называемого строением. С другой стороны, строение - это часть более общего класса - конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека.
В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли.