0:00
[БЕЗ_ЗВУКА] Мы начинаем большой
разговор об объектно-ориентированном программировании в языке C++.
Ядром объектно-ориентированного программирования является создание
программистом собственных типов данных.
Для начала давайте обсудим, зачем это вообще может понадобиться.
Рассмотрим следующий пример: предположим, нам нужно в нашей программе работать с
видеолекциями, например, с названием видеолекции и ее продолжительностью.
Отлично.
Давайте напишем какую-нибудь функцию,
которая будет работать с этими характеристиками видеолекции, например,
функцию, которая будет выводить эти характеристики на экран.
Какие должны быть параметры у этой функции?
Понятно, что это должны быть, соответственно,
название видеолекции в виде строки и ее продолжительность в виде целого числа.
Мы принимаем эти два параметра функции и их выводим в каком-то удобном нам формате.
Допустим, теперь нам нужно выводить информацию о наборе видеолекций.
Напишем функцию PrintCourse.
Эта функция должна принять на вход набор видеолекций,
но поскольку они у нас хранятся в виде характеристик,
отдельно в виде названий и отдельно в виде продолжительностей,
мы должны в этой функции принять, соответственно, вектор названий
видеолекций, которые составляют курс, и отдельно вектор продолжительностей.
Затем мы должны проитерироваться по этим векторам с помощью, например, цикла while,
заведем временную переменную i, которая будет означать номер очередной лекции.
И пока у нас эта переменная i не превысила размер первого вектора,
мы будем ее увеличивать и вызывать функцию PrintLecture от, соответственно,
названия i-й лекции и продолжительности i-й лекции.
Предположим, что теперь у нас появилась необходимость хранить и обрабатывать еще
одну характеристику видеолекции, например, имя автора, в виде еще одной строки.
Как нам нужно модифицировать код?
Нам нужно в функцию PrintLecture добавить еще один параметр, еще одну
строчку принять на вход — имя автора и, соответственно, как-то ее вывести.
Как нужно модифицировать функцию PrintCourse?
Теперь у нас будет не только набор названий и набор продолжительностей
лекции, но еще и набор имен авторов лекций.
Добавляется третий вектор в параметр функции PrintCourse,
и соответственно нужно поправить вызов функции PrintLecture.
Нужно передавать в нее третий аргумент: название автора i-й лекции.
В чем же проблемы такого подхода,
в чем же проблема хранить видеолекции отдельно: отдельно каждую характеристику,
передавать вот так вот три вектора в одну функцию, передавать отдельно название,
отдельно продолжительность, отдельно имя автора?
Основная проблема в том, что мы неявно и неправильно выражаем свои намерения.
Мы хотим хранить видеолекцию, но храним почему-то отдельно название,
отдельно продолжительность, отдельно имя автора.
Хотим передать в функцию набор лекций, а передаем почему-то три набора: набор
названий, набор продолжительностей, набор имен авторов.
Из этой проблемы вытекает следующая проблема,
что когда у нас меняется набор характеристик, когда у нас добавляется
новая характеристика или удаляется какая-то характеристика видеолекций,
мы должны поменять очень много заголовков функций и, соответственно,
посмотреть в реализации этих функций: не нужно ли там что-то поменять,
вызов каких-то функций и так далее.
И наконец, если кто-то еще захочет поправить наш код или написать еще
какую-то функцию, которая будет работать с видеолекцией, у него не будет какого-то
единого места, где он смог бы подсмотреть, какие у нас вообще бывают характеристики.
Потому что мы в принципе могли добавить имя автора в одну функцию и не добавить в
другую, потому что оно нам в другой функции не нужно.
Чтобы решить эти проблемы, мы и создадим новый тип данных.