Задать вопрос
region23
@region23
веб-разработчик

Для чего до реализации класса определять интерфейс?

Почему в книжках по многим языкам программирования (C#, Objective-C) сначала определяют интерфейс, а потом реализуют класс? Не проще ли сразу писать класс? Так ведь и кода меньше получается.


Почему интерфейс это не лишняя трата времени и строк кода?

Почему нужно сначала описать интерфейс, а потом реализовать класс?
  • Вопрос задан
  • 4249 просмотров
Подписаться 9 Оценить 1 комментарий
Решения вопроса 1
AlexanderG
@AlexanderG
А подскажите что конкретно почитать?
image

Просто потрясающая книга. Охватывается большинство аспектов разработки ПО, от проектирования и выработки требования до советов по именованию переменных. Всё очень доступно разъясняется, но при этом не слишком заумно, но и не слишком упрощенно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 10
@Slayt
Попробуйте для себя написать простенькую программу, которая будет рисовать разные фигуры (квадрат, эллипс, ромб) на экране.
Вскоре вы обнаружите, что постоянно писать:
for (Square s: squares) {
  s.draw();
}
for (Ellipse e: ellipses) {
  e.draw();
}
for (Diamond d: diamonds) {
  d.draw();
}
...

довольно неудобно, особенно если потом понадобится добавить еще фигуры. Куда лучше будет объявить общий для фигур интерфейс с методом draw() и использовать в коде именно его:
for (Figure f: figures) {
  f.draw();
}
Ответ написан
Monnoroch
@Monnoroch
А мне кажется, тут недостаточно читать книги, иначе вопрос не уйдет, а лишь окрепнет. Надо просто писать программы. При написании программ внезапно обнаруживается, что так проще лучше и приятнее.
Ответ написан
Monnoroch
@Monnoroch
По поводу дополнения к вопросу:
Ответ на вопрос «зачем?» тривиален: так удобнее.
А вот понять почему можно только на собственном опыте, это как почему сладкое вкусно. Сколько не обьясняй, пока не попробуешь не поймешь.
Ответ написан
Комментировать
Кстати, не всегда это хорошая практика. Можно считать это преждевременной универсализацией и оопизацией во многих случаях, если вы точно не уверены, что понадобится несколько классов с разными реализациями, но одним интерфейсом (тестирование отдельный случай, во многом зависит от языка и инструментов, где-то мок/стаб легко создать без интерфейсов, где-то, наверное, невозможно). Вот когда понадобится, тогда и создадите, а достоверая оценка оценка вероятности понадобится или нет приходит только с опытом. Но лучше, имхо, для более быстрого его набирания лишний раз выделить интерфейс из уже реализованного класса, чем выделить сразу, а потом и не вспомнить, что зря его выделял и таскать по всему проекту без особой надобности. А когда интерфеейса не хватате, то это чувствуется, особенно в языках с сильной типизациейю.
Ответ написан
Комментировать
taliban
@taliban
php программист
Интерфейс не нужно описывать перед классом, а можно, это разные вещи. И как писали выше, Вы сами поймете когда оно того стоит а когда нет, нельзя точно сказать «вот тут делай интерфейс, а вот здесь не нужно».
Ответ написан
Комментировать
szKarlen
@szKarlen
Думаю, сначала нужно четко определить, что не всегда и не во всех случаях необходимо реализовывать интерфейс. Так, для класса Point2D абсолютно этого не надо, или же Vector2D, Vector3D.
Выше приводили пример с фигурами — однако, он показывает не это. Его предназначение — наследование в ООП (вспомним три постулата: полиморфизм, инкапсуляция и наследование).
Интерфейсы, на практике, определяются в большинстве случаев для:
  1. уменьшения связности системы
  2. классов (объектов), выполняющих роль по обработке данных
  3. классов (объектов), следующих какому-либо паттерну программирования (репозиторий, стратегия)
  4. на этапе проектирования для создания заглушек
  5. для использования в юнит-тестировании

А так как Вы еще писали про C# — то вспомним и про явную и неявную реализацию интерфейса, что удобно, например в GUI.
Интерфейс — скелет, на котором строится вся система.
Ответ написан
Комментировать
VenomBlood
@VenomBlood
Ну хотябы вот пара причин:
1) При проектировании вы сначала думаете, что должен делать класс, и лишь потом как, отсюда сначала делается интерфейс, потом класс.
2) Для меньшей связанности системы, вы можете везде где возможно общаться с интерфейсом, и потом без проблем подставить другой класс.

На самом деле причин гораздо больше, тут советую почитать какие-нибудь книги по программированию (именно по программированию как таковому, а не по какому-то языку), там это хорошо объясняется.
Ответ написан
Комментировать
unconnected
@unconnected
Меня учили, что он нужен прежде всего для командной работы.
Допустим, что некий класс получает какой-то набор данных из БД. БД еще нет. Соответственно, описываем интерфейс и реализуем класс который тупо возвращает некий набор констант. Когда БД появится, кто-то уже реализует класс получающий реальные данные, а не заглушки. Процесс отладки тоже упрощается — проще изолировать код: пока для реализации интерфейса использовался класс А — всё работало, стал класс Б — всё сломалось.
Как-то так.

Если вы один, без ансамбля и жнец, и на дуде игрец, то смысла в описание интерфейсов становится гораздо меньше.
Ответ написан
ngreduce
@ngreduce
Как вариант — реализация нескольких интерфейсов в одном классе, не используя множественное наследование.
Ответ написан
Комментировать
Lihonosov
@Lihonosov
Для тестов! JUnit и т.п. Например:
Интерфейс работы с БД
1. Реализация интерфейса для работы с Mysql
2. Реализация интерфейса для работы с MongoDB
3. Реализация интерфейса для работы с «In Memory DB»
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы