Что такое ООП?
Языков программирования огромное множество, столько же и моделей программирования. Писать программы можно по разному, применяя те или иные модели программирования. Среди таких методологий проектирования программ часто проскакивает объектно-ориентированное программирование (ООП). Это обуславливается тем, что данная методология обладает большим количеством преимуществ и является самой популярной на сегодняшний день. Индустрия IT и частные разработчики отдают предпочтение ООП нежели структурному программированию.
Что представляет собой ООП
Объектно-ориентированное программирование — это разделение программы на объекты, каждый из которых выполняет свою роль. В процедурном программировании нет такого понятия как объект или класс. Поэтому программа разделяется на функции, каждая из которых является частью алгоритма. В то же время ООП сохранило в себе все самое лучшее из процедурного программирования и улучшило эту концепцию, позволяя значительно сокращать время на проектирование программ и улучшать ее структуру.
Объекты
Любой ООП язык использует объекты. В жизни объектами являются все вещи, которые нас окружают. Это расческа, автомобиль, дом, самолет, чайник, человек и тому подобное. С программной точки зрения объектом является некий набор данных и функций, которые являются частью этого объекта.
К примеру чайник — размер, вес, литраж, материал и цвет, рабочая мощность являются его свойствами. Кипячение, автоматическое отключение, подсветка — функции чайника. Свойства объекта в программировании являются переменные с определенными значениями, а функции объекта являются методами. Обратиться к свойства и вызвать метод можно только через имя объекта.
Классы
Классы являются шаблонами для создания объектов. В классе мы задаем свойства и методы для всех объектов, которые будут создаваться от имени класса.
Пример:
class Kettle { класс «Чайник» для создания объектов чайников
developer: «»,
height: 15, // высота
power: 600, // мощность
color: red, // цвет корпуса
waterAmount: 0 // количество воды
tenHeat: 0 // температура тена
switch: false, // кнопка выключена// конструктор объектов
Kettle: function(dev){
this.developer = dev;
}//методы
on: function(){ // включение чайника
this.switch = true;
boil(waterAmount); // при включенной кнопке запускается кипячение
}off: function(){ // отключение чайника
this.switch = false;
}fillWater(water){ // наполнение чайника водой
this.waterAmount = water;
}
boil: function(){
if(this.switch == true && waterAmount>0) setInterval(this.tenHeat++, 1000)
if(this.tenHeat == 100){ this.off(); print(«Kettle is off»);}
}}
В данный момент нами был спроектирован класс для создания объектов чайников. Как видно мы только что создали набор переменных (свойств) и функций (методов). Эти функции и свойства присваиваются каждому объекту, созданному через класс Kettle. Теперь создадим несколько объектов.
Пример:
var phillips = new Kettle(«phillips»); // создали объект чайник с брендом филлипс
var samsung = new Kettle(«samsung»); // с брендом самсунг//Теперь обратимся к свойствам чайника
print(phillips.color); // red
print(samsung.developer); // samsung// вызовем методы
phillips.on(); // «Kettle is off»
Как видно в коде свойства и методы являются функциями и переменными, которые доступны по ссылке — имени переменной объекта. Мы можем изменять свойства через объект. Но при создании нового объекта посредством функции-конструктора, мы изменяем только имя производителя, значения свойств остаются так как прописано в классе по умолчанию.
Структуры
Класс является не единственным шаблоном для создания объектов. Структуры также являются подобием классов, но обладают своими особенностями. Структуры, как и классы также хранят свойства и методы для присвоения их созданным объектам. Созданный объект не является экземпляром класса, но структуры.
Пример:
struct Car{
// свойства
type;
maxSpeed;
// методы
go: function(){print(«car is go»);}stop: function(){print(«car is stopped»);}
//конструктор
Car: function(type, maxSpeep){type = this.type, maxSpeed = maxSpeed;}
}
Отличительной особенность структур от класса является необходимость инициализации всех свойств конструктором. Нельзя инициализировать свойства в описании структуры — они должны инициализироваться конструктором. Это все малочисленные отличия структуры от класса.
Модификаторы доступа
Модификаторы доступа устанавливают область видимости свойств и методов классов. Это специальные зарезервированные слова в языках программирования, которые ставятся перед типом или именем свойства и метода. По умолчанию, если модификатор не прописывать в классе, то элемент становится приватным.
Рассмотрим их по подробнее:
- public. Публичный член класса или сам класс, доступные с любого места кода в программе, а также при подключении сборок, в которых есть публичные элементы.
- private. Закрытый член класса, доступный только внутри класса.
- protected. Член класса доступен только в текущем классе, а также его наследниках.
- internal. Члены класса с этим модификатором доступны везде в текущей сборке, однако эти члены не доступны если класс подключен вместе со сборкой.
Также есть парные модификаторы:
- protected internal. Члены класса доступны только в текущей сборке, а также в наследуемых классах этой же сборки.
- private protected. Член класса доступный только в пределах текущего класса и сборки.
Пример:
class Human{
private int height: 180;
public int age: 30;
public void go{print(«Human height is» + this.height)}
}var man = new Human();
print(man.age); // сработало и выведет 30
print(man.height); // выдаст ошибку, так как нельзя обратиться к приватному члену вне класса
man.go(); // Human height is 180 — сработало, так как обращение к приватному свойству осуществилось через метод класса
Стоит отметить, что модификаторы доступа ставятся и классам, что влияет на их видимость в разных сборках проекта.
Модификатор static
Статический модификатор не присваивает член к объектам класса. Обращение к полю или методу осуществляется через имя класса.
Пример:
class Human{
private int height: 180;
public int age: 30;
static int count: 0; // статическое свойство
public void go{print(«Human height is» + this.height)}
void Human(){count++;} // при создании объекта человека счетчик будет увеличиваться на 1
}var man1 = new Human();
var man2 = new Human();
print(man1.count); // ошибка — к статическому члену можно обратиться только от имени класса
print(Human.count); // 2 — было создано 2 объекта
Принципы проектирования классов и объектов в ООП
Есть несколько принципов, по которым проектируются классы и объекты. Эти принципы упрощают написание кода и делают ООП более гибкой моделью программирования. Среди них: наследование, инкапсуляция, полиморфизм и абстракция.
Наследование
Наследование позволяет классу наследнику получать все свойства и методы класса, от которого наследуют.
Пример:
class Human{
private int height: 180;
public int age: 30;
static int count: 0; // статическое свойство
public void go{print(«Human height is» + this.height)}
void Human(){count++;}
}// Теперь унаследуем функционал от класса Human и передадим все другому классу
class Worker extends Human{
public string Job: «car mechanic»;
}var man = new Worker(); // создали объект рабочего, который наследует все от класса Human
print(man.age); // 30
Как видно в классе наследнике мы прописали всего одно свойство. Однако через объект этого класса мы получили свойство age, а также все остальные члены. Наследование позволяет значительно сократить время на написание кода, исключая необходимость повторения написания одних и тех же свойств в разные классы.
Ведь если рассматривать эти два класса с человеческой точки зрения, то рабочий по сути является человеком, поэтому при создании отдельного класса не нужно переписывать свойства человека — достаточно прописать конструкцию extended и класс Worker наследует все от Human.
Инкапсуляция
Еще одним принципом ООП является инкапсуляция, которая позволяет скрывать некоторые функциональные возможности объектов от ручного вмешательства. Представим мобильный телефон. Пользователю доступен лишь интерфейс на экране с возможностью отключать телефон и заряжать его. Такие функции, как работа электроники и передача данных посредством аппаратной части не доступны пользователю — они скрыты от его вмешательства.
Так и в программировании. С помощью модификаторов private программист может скрывать функционирование объектов от ручного вмешательства. Когда в алгоритме мы можем изменять значения публичных членов, приватные же нам не доступны и их значения изменяются в методах при определенных обстоятельствах.
Полиморфизм
Полиморфизм придает функциям больше гибкости, позволяя обрабатывать разные данные. Гибкость функций регулируется условиями, которые создает сам программист. Или же объекты принимают разные формы за счет функций, в зависимости от определенных условий.
Действие одноименного метода может быть разным — все зависит от условий, а также от того, что один метод может использоваться в разных классах. К примеру у человека есть функция «движение» в зависимости от того когда эта функция применяется — движением может быть ходьба, бег, управление рулем автомобиля, плавание и так далее.
Абстракция
Абстракция в программировании — это способ проектирования классов. Абстракция определяет какие элементы классов и классы важны в программе, а какие несущественны. Абстракция применяется при планировании класса и его проектировании. Абстракция объединяет в себе принципы инкапсуляции, полиморфизма и наследования.
Ключевое слово this
В примерах выше мы часто использовали слово this. Он является заменой имени объекта. То есть, this.age — все равно, что worker.age. This в объекте относится только к одному — текущему объекту и не может ссылаться на другие объекты.
Подводя итоги
Класс состоит из свойств, методов и конструктора. Если не передать конструктор в класс, то будет вызываться конструктор по умолчанию без аргументов. Можно создавать классы без методов или свойств. Уже созданному объекту можно присваивать свойства и методы вне класса, но они будут работать только с текущим объектом. Все объекты обладают типом класса, посредством которого они были созданы.
Все члены класса, в том числе и классы могут быть модифицированы модификаторами доступа. Это позволяет скрыть (инкапсулировать) некоторые функции объектов от внешнего вмешательства.
Также при проектировании классов и объектов используют принципы проектирования в ООП: абстракция, полиморфизм, инкапсуляция и наследование. Они предоставляют гибкие возможности для упрощения создания классов и расширяют их функциональность.
По сути объекты — это набор переменных и функций к которым обращаются по ссылке — имени переменной объекта. При создании нового объекта — его свойства изменяются посредством присваивания значений через аргументы конструктора или остаются по умолчанию, как были изначально присвоены в классе.