Это старая версия документа!


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

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

Объекты — это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс 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 можно создать много экземпляров автомобилей со своими наборами свойств.

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

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

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