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

Объектно-ориентированное программирование (сокращенно ООП) — это парадигма разработки программных систем, в которой приложения состоят из объектов.

Объекты — это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс Car (машина), а его экземплярами будут Toyota Corolla или Ford Focus.

Свойства — это данные, которые связаны с конкретным объектом:

  • Объем двигателя
  • Габаритные размеры
  • Потребление топлива на 100км
  • Объем багажника
  • Цвет кузова
  • Максимальная скорость

Поведение объекта определяется с помощью методов — специальных блоков кода, которые можно вызывать из разных частей программы. Например, у того же объекта Car могут быть следующие методы:

  • Завести двигатель
  • Заглушить двигатель
  • Ехать
  • Сигналить
  • Включить фары

Используя эти свойства и методы, можно значительно ускорить разработку, сделать код более читаемым. К тому же самому программисту проще составлять код, если он думает с помощью объектов.

То есть он не пишет какую-то функцию, которая будет делать что-то для программы в целом. Вместо этого он мысленно разделяет приложение на отдельные компоненты и продумывает их свойства и поведение.

Классы и объекты

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

Таким образом, класс — это описание того, какими свойствами и поведением будет обладать объект. А объект — это экземпляр с собственным состоянием этих свойств.

Попробуем разобраться на примере

class Car {
  private:
    String color;
    float fuel;
    float consumption;
    int odo;
 
  public:    
    Car(String _color, int _fuel, float _consumption) {
      color = _color;
      fuel = _fuel;
      consumption = _consumption;
      odo = 0;
    }
 
    void go(int dist) {
      odo += dist;
      fuel -= consumption / 100.0 * dist;
    }
 
    float getFuel() {
      return fuel;
    }
 
    int getOdo() {
      return odo;
    }
};

Мы объявили класс Car, описали его свойства и методы. Свойства класса Car

  • color — цвет
  • fuel — количество топлива в баке
  • consumption — потребление топлива на 100км
  • odo — одометр (счетчик пробега в километрах)

Методы класса Car

  • void go(int dist) — ехать. Принимает в качестве параметра количество километров
  • int getOdo() — получить текущее количество топлива в баке
  • float getFuel() — получить текущий пробег

Сразу возникает вопрос, а что за метод Car(String _color, int _fuel, int _consumption). Это конструктор — функция, вызываемая при создании объекта. Когда создается объект, то код этой функции исполняется. Наш конструктор автомобиля принимает сразу несколько параметров — цвет, количество топлива в баке и потребление топлива на 100км. При создании объекта автомобиля мы эти параметры указываем и конструктор создает объект с заданными параметрами.

Класс это всего лишь шаблон, и объектов, которые могут быть созданы по нему — много. Используя класс Car можно создать много экземпляров автомобилей со своими наборами свойств.

Ключевые слова private (приватный) и public (публичный) определяют доступность свойств и методов снаружи класса. Например мы не сможем напрямую изменить свойство «odo» так как оно является приватным. Для изменения «odo» нам нужно воспользоваться публичным методом go().

Как видно мы описали абстрактно автомобиль. У любого автомобиля есть цвет, есть одометр, определенное потребление топлива и сколько-то топлива в баке. Теперь создадим два конкретных автомобиля — мой автомобиль и автомобиль брата:

Car MyCar("Black", 50, 10);
Car BrotherCar("White", 60, 15);

Мы создали два объекта автомобиля MyCar и BrotherCar. Это разные автомобили, разного цвета, в них разное количество топлива и даже потребляют они по-разному. Посмотрим сколько сейчас топлива в моем автомобиле и сколько он проехал.

Serial.println(MyCar.getOdo());
Serial.println(MyCar.getFuel());

Результат:

0
50.00

Мой автомобиль еще ничего не проехал и топлива не потратил нисколько. Теперь проедем 20 километров и еще 10.

MyCar.go(20);
MyCar.go(10);

И повторим запросы пробега и уровня топлива

Serial.println(MyCar.getOdo());
Serial.println(MyCar.getFuel());

Результат:

30
47.00

Действительно MyCar проехала 30 километров и за это время израсходовала 3 литра топлива. Теперь дадим проехаться машине BrotherCar

BrotherCar.go(15);
Serial.println(BrotherCar.getOdo());
Serial.println(BrotherCar.getFuel());)

Результат:

15
57.75

Мы рассмотрели основы объектно- ориентированного программирования. Поняли что такое класс и объект. Узнали как создать объект и как вызывать его методы. Но на самом деле объектно- ориентированное программирование на этом только начинается.