Интерфейсы
Трудно понять назначение инструмента, который решает проблему, которой у вас никогда не было. Я не понимал интерфейсы некоторое время после того, как начал программировать. Мы поняли, что они сделали, но я не знала, почему ты захочешь их использовать.
Вот в чем проблема - вы знаете, что вы хотите сделать, но у вас есть несколько способов сделать это, или вы можете изменить способ сделать это позже. Было бы неплохо, если бы вы могли играть роль невежественного менеджера - лаять несколько заказов и получать желаемые результаты, не заботясь о том, как это делается.
Допустим, у вас есть маленький веб-сайт, и вы сохраняете всю информацию о ваших пользователях в CSV-файле. Не самое сложное решение, но оно работает достаточно хорошо для хранения пользовательских данных вашей мамы. Позже ваш сайт взлетает, и у вас есть 10 000 пользователей. Может быть, пришло время использовать правильную базу данных.
Если бы вы сначала были умны, вы бы увидели, что это произойдет, и не сделали бы звонки для сохранения в csv напрямую. Вместо этого вы будете думать о том, что вам нужно сделать, независимо от того, как это было реализовано. Скажем так store()
и retrieve()
. Вы делаете Persister
интерфейс с абстрактными методами store()
и retrieve()
и создать CsvPersister
подкласс , который фактически реализует эти методы.
Позже вы можете создать объект, DbPersister
который реализует фактическое хранение и извлечение данных совершенно иначе, чем это делал ваш класс CSV.
Самое замечательное, все, что вам нужно сделать сейчас, это изменить
Persister* prst = new CsvPersister();
в
Persister* prst = new DbPersister();
и тогда вы сделали. Ваши звонки prst.store()
и prst.retrieve()
все еще будут работать, они просто обрабатываются по-разному "за кадром".
Теперь вам все еще нужно было создать реализации cvs и db, так что вы еще не испытали роскоши быть боссом. Реальные преимущества очевидны, когда вы используете интерфейсы, созданные кем-то другим. Если кто-то еще был достаточно любезен, чтобы создать CsvPersister()
и DbPersister()
уже, то вам просто нужно выбрать один и вызвать необходимые методы. Если вы решите использовать другой позже или в другом проекте, вы уже знаете, как он работает.
Я действительно ржавый на своем C ++, поэтому я просто буду использовать несколько общих примеров программирования. Контейнеры являются отличным примером того, как интерфейсы делают вашу жизнь проще.
Вы можете Array
, LinkedList
, BinaryTree
и т.д. все подклассы из Container
которых имеет такие методы , как insert()
, find()
, delete()
.
Теперь при добавлении чего-либо в середину связанного списка вам даже не нужно знать, что такое связанный список. Вы просто звоните, myLinkedList->insert(4)
и он волшебным образом перебирает список и вставляет его туда. Даже если вы знаете, как работает связанный список (что вам действительно нужно), вам не нужно искать его специфические функции, потому что вы, вероятно, уже знаете, что это такое, используя другое Container
ранее.
Абстрактные классы
Абстрактные классы очень похожи на интерфейсы (технически интерфейсы - это абстрактный класс, но здесь я имею в виду базовые классы, в которых некоторые их методы раскрыты).
Скажем, вы создаете игру, и вам нужно определить, когда враги находятся на расстоянии удара от игрока. Вы можете создать базовый класс, Enemy
который имеет метод inRange()
. Несмотря на то, что у врагов много разных вещей, метод, используемый для проверки их дальности, одинаков. Поэтому у вашего Enemy
класса будет конкретный метод проверки дальности, но чисто виртуальные методы для других вещей, которые не имеют общих черт среди типов врага.
Хорошая вещь в этом заключается в том, что если вы испортили код обнаружения диапазона или хотите его настроить, вам нужно всего лишь изменить его в одном месте.
Конечно, есть много других причин для интерфейсов и абстрактных базовых классов, но это некоторые причины, по которым вы можете их использовать.
Одиночки
Я использую их время от времени, и они никогда меня не сжигали. Это не значит, что в какой-то момент они не разрушат мою жизнь, основываясь на опыте других людей.
Вот хорошая дискуссия о глобальном состоянии от некоторых более опытных и настороженных людей:
почему глобальное государство так зло?