Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Развитие методологии объектно-ориентированного программирования).pdf
Добавлен: 28.03.2023
Просмотров: 462
Скачиваний: 3
СОДЕРЖАНИЕ
1. Развитие методологии объектно-ориентированного программирования
1.2 Структурное программирование
1.3 Объектно-ориентированное программирование
2. Реализация объектно-ориентированного программирования
2.1 Объектно-ориентированное программирование в языке C++
2.2 Объектно-ориентированное программирование в языке Objective-C
3.1 Обзор и анализ предметной области
3.2 Проектирование классов программы
3.4 Проектирование интерфейса и алгоритмов программы
Перед созданием динамического экземпляра класса (по аналогии с любыми динамическими переменными) необходимо объявить указатель на экземпляр:
имя_класса* указатель_на_экземпляр;
Динамический экземпляр класса создается с помощью оператора new, а уничтожается с помощью оператора delete:
указатель_на_экземпляр= new имя_класса (параметры конструктора);
delete указатель_на_экземпляр;
Метод класса (по аналогии с полем структуры) вызывается одним из следующих способов:
имя_экземпляра.имя_метода или имя_экземпляра->имя_метода
Инкапсуляция – такое объединение внутри класса полей и методов, при котором доступ к полю возможен только путем вызова соответствующего метода.
При идеальном выполнении принципа инкапсуляции поля класса могут быть только личными (private).
Ниже перечислены уровни инкапсуляции, т. е. уровни доступа к элементам класса:
- private (личный). Этот уровень накладывает самые жесткие ограничения на доступ к элементам класса. Именно эти элементы могут быть использованы только методами данного класса. Как правило, поля класса объявляются private.
- public (общий). Элементы класса данного уровня доступны из любой точки программы (самый «широкий» доступ).
- protected (защищенный). Элементы класса данного класса доступны методам данного класса и его наследников.
Наследование – это возможность определения для базового класса (предка) иерархии производных классов (наследников), в каждом из которых доступны элементы базового класса (их описание становится частью описания производного класса). Иначе говоря, наследование – механизм, посредством которого класс может наследовать элементы другого класса и добавлять к ним свои элементы.
Как правило, базовый класс является общим, производные – более специальными, конкретными. Естественно, у класса-наследника обычно больше полей и методов, чем у класса-предка, так как при наследовании обычно добавляются новые элементы. Если имеется иерархия классов, то можно рассматривать защищенные (protected) элементы класса, которые доступны для методов своего класса и его наследников. Наследование может быть единичным (наследник имеет одного предка) и множественным (количество предков больше 1). В C++ допустимо множественное наследование [10.]. Наследование может быть общим, личным и защищенным. Видимость полей и функций базового класса из производного определяется секцией, в которой находится объявление компонента, и видом наследования (см. таблицу 2).
Как видно из таблицы 2, при общем наследовании общие и защищенные элементы класса-предка сохраняют свой уровень инкапсуляции и в классе-наследнике. При личном наследовании общие и защищенные элементы класса-предка становятся личными для класса-наследника. При защищенном наследовании защищенные элементы сохраняют свой уровень в классе-наследнике, а общие становятся защищенными. Независимо от вида наследования, личные элементы базового класса недоступны в производных классах. Таким образом, чтобы «достать» их из производного класса, надо использовать унаследованные общие и защищенные методы класса-предка.
Таблица 2
Видимость компонентов базового класса в производном
|
Вид наследования |
Объявление компонентов в базовом классе |
Видимость компонентов в производном классе |
|
private |
не доступны |
|
|
private |
protected |
private |
|
public |
private |
|
|
private |
не доступны |
|
|
protected |
protected |
protected |
|
public |
protected |
|
|
private |
не доступны |
|
|
public |
protected |
protected |
|
public |
public |
Описание производного класса в общем виде приведено в листинге 2.
Листинг 2. Описание производного класса в языке C++
class Имя_производного_класса:
Вид_наследования_1 Имя_базового_класса_1,
Вид_наследования_2 Имя_базового_класса_2,
...
Вид_наследования_n Имя_базового_класса_n,
{
Описание_добавляемых_элементов_производного_класса
};
Если Вид_наследования не указан, то по правилу умолчания принимается public.
Самая простая ситуация – это единичное общее наследование. Заголовок производного класса в этом случае имеет вид:
class имя_наследника: public имя предка;//можно без public
Преимущества C++ [11.]:
- Портативность
C++ предлагает функцию переносимости или независимости от платформы, которая позволяет пользователю легко запускать одну и ту же программу в разных операционных системах или интерфейсах
- Объектно-ориентированность и мультпарадигменность
Одним из самых больших преимуществ C++ является особенность объектно-ориентированного программирования, которое включает в себя такие понятия, как классы, наследование, полиморфизм, абстракция данных и инкапсуляция, которые позволяют многократно использовать код и делают программу еще более надежной. Более того, это помогает решать реальные проблемы, рассматривая данные как объект.
C++ является языком программирования с несколькими парадигмами. Термин «парадигма» относится к стилю программирования. Парадигмой программирования называют используемый различными языками подход к программированию, то есть, проще говоря, набор идей и понятий, определяющих стиль написания программ. Среди основных парадигм программирования выделяют объектно-ориентированную, императивную, декларативную, структурную, функциональную и логическую. Большинство языков программирования, активно используемых в современной разработке прикладных программ, являются мультипарадигменными.
- Манипуляции низкого уровня
Поскольку C++ тесно связан с Си, который является процедурным языком, тесно связанным с машинным языком, C++ допускает низкоуровневое манипулирование данными на определенном уровне. Встроенные системы и компилятор создаются с помощью C++.
- Управление памятью
C++ дает программисту полный контроль над управлением памятью. Это можно рассматривать как ценное качество, так и как повышенную ответственность, поскольку такая возможность увеличивает ответственность пользователя за управление памятью, а не за управление сборщиком мусора. Эта концепция реализована с помощью динамического распределения памяти с использованием указателей.
- Поддержка большого сообщества
C++ имеет большое сообщество, которое поддерживает его, предоставляя онлайн-курсы и лекции, как платные, так и бесплатные. С точки зрения статистики, C++ является 6-м наиболее часто используемым тегом на StackOverflow и GitHub.
- Совместимость с Си
C++ в значительной степени совместим с C. Практически каждая скомпилированная и отлаженная программа на языке Си является допустимой программой на C++. В зависимости от используемого компилятора каждая программа C++ может запускаться в файле с расширением .cpp.
- Масштабируемость
Масштабируемость относится к способности программы масштабироваться. Это означает, что программа на C++ способна работать как в небольших масштабах, так и на больших объемах данных. Также можно создавать приложения, которые являются ресурсоемкими.
- Производительность
Как язык со статической типизацией, C++, как правило, более производительный, чем языки с динамической типизацией, потому что код проверяется перед выполнением. Java набирает обороты с точки зрения скорости, но, в конце концов, в зависимости от того, насколько талантлив разработчик C++, C++ все еще может быть быстрее, чем Java.
- Карьерные перспективы
Для разработки популярных видеоигр, скорее всего, придется использовать C++. Многие мобильные бестселлеры также были созданы с Cocos2d-x, который является свободно распространяемым кроссплатформенным игровым движком с открытым исходным кодом. Игры Cocos2d-x разрабатываются на C++, хотя Cocos2d теперь также поддерживает другие языки.
Недостатки языка C++ [11.]:
- Использование указателей
Указатели в C / C++ довольно сложны для понимания и занимают много памяти. Неправильное использование указателей, известное как «висячие указатели», может привести к сбою системы или неправильному поведению системы.
- Проблема безопасности
Хотя объектно-ориентированное программирование обеспечивает большую безопасность обрабатываемых данных по сравнению с другими языками программирования, которые не являются объектно-ориентированными, такими как Си, некоторые проблемы безопасности все еще существуют из-за доступности дружественных функций, глобальных переменных и указателей.
- Отсутствие сборщика мусора
Как обсуждалось ранее, C++ дает пользователю полный контроль над управлением памятью компьютера с помощью динамического управления. В C++ отсутствует функция сборщика мусора для автоматической фильтрации ненужных данных.
2.2 Объектно-ориентированное программирование в языке Objective-C
Objective-C – это язык общего назначения, который разработан поверх языка программирования Си путем добавления возможностей языка программирования Smalltalk, что делает его объектно-ориентированным языком. Он в основном используется при разработке операционных систем iOS и Mac OS X, а также его приложений. Язык был создан Брэдом Коксом в начале 1980-х в его компании Stepstone, причем первоначально Objective-C был разработан NeXT для ее ОС NeXTSTEP, от которой Apple перешла к его iOS и Mac OS X. Язык полностью поддерживает объектно-ориентированное программирование, включая полиморфизм, наследование и инкапсуляцию.
Основная цель языка программирования Objective-C состоит в том, чтобы добавить объектную ориентацию к языку программирования Си. Классы являются центральным понятием в Objective-C и часто называются пользовательскими типами.
Класс используется для определения объекта, и он объединяет представление данных и методы для манипулирования этими данными в одном месте. Данные и методы класса называются членами класса.
Характеристики Objective-C:
- Класс определяется в двух разных разделах, а именно: @interface и @implementation.
- Почти все структурные единицы языка представлены в виде объектов.
- Объекты получают сообщения, и они часто называются получателями.
- Объекты содержат переменные экземпляра класса.
- Объекты и переменные экземпляра имеют область видимости.
- Классы скрывают реализацию объекта.
- Свойства используются для предоставления доступа к переменным экземпляра класса в других классах.
Когда определен класс, то определена «схема» для типа данных. На самом деле это определение не определяет какие-либо данные, но объясняет, что означает имя класса, то есть то, из чего будет состоять объект класса и какие операции могут быть выполнены с таким объектом.
Определение класса начинается с ключевого слова @interface, за которым следует имя интерфейса (класса); и тело класса, заключенное в пару фигурных скобок. В Objective-C все классы являются производными от базового класса, называемого NSObject. Это суперкласс для всех классов Objective-C. Он предоставляет основные методы, такие как выделение памяти и инициализация. Например, тип данных Box может быть определен с использованием ключевого слова class так, как показано в листинге 3.
Листинг 3. Описание класса в языке Objective-C
@interface Box:NSObject
{
double length;
double breadth;
}
@property(nonatomic, readwrite) double height;
@end
Переменные экземпляра класса являются частными (private) и доступны только внутри реализации класса.
Свойства (properties) введены в Objective-C для обеспечения доступа к переменной экземпляра класса вне класса.
Различные части объявления свойства заключаются в следующем.
- Свойства начинаются с @property, который является ключевым словом.
- За ним следуют спецификаторы доступа, которые являются неатомарными или атомарными, доступными для чтения или записи и только для чтения, сильными или слабыми (в случае указателей) и т.д. Для других типов можно использовать модификаторы readwrite или readonly.
- Далее следует тип данных переменной.
- Наконец, имя свойства, оканчивающееся точкой с запятой.
Класс предоставляет «схемы» для объектов, поэтому в основном объект создается при помощи класса. Объекты классов объявляются точно так же, как и переменные базовых типов. Операторы из листинга 4 объявляют два объекта класса Box.
Листинг 4. Создание двух экземпляров классов в Objective-C
Box box1 = [[Box alloc] init];
Box box2 = [[Box alloc] init];
Оба объекта box1 и box2 будут иметь собственную копию элементов данных.
Objective-C не допускает множественного наследования. Все классы в Objective-C являются производными от суперкласса NSObject. Наследование имеет следующий вид:
@interface имя класса-наследника: имя базового класса
Основной заботой создателя языка была ремонтопригодность больших файлов кода. Опыт мира структурированного программирования показал, что одним из основных способов улучшения кода было разбиение его на более мелкие части. Objective-C добавил концепцию категорий, чтобы помочь с этим процессом.
Категория собрала реализации метода в отдельные файлы. Таким образом, программист мог бы поместить группы связанных методов в свою собственную «категорию», чтобы сделать ее более читаемой. Например, можно создать категорию «SpellChecking» для объекта String, собрав все методы, связанные с проверкой орфографии, в одном месте.