region23
@region23
веб-разработчик

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

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


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

Почему нужно сначала описать интерфейс, а потом реализовать класс?
  • Вопрос задан
  • 4230 просмотров
Решения вопроса 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
А мне кажется, тут недостаточно читать книги, иначе вопрос не уйдет, а лишь окрепнет. Надо просто писать программы. При написании программ внезапно обнаруживается, что так проще лучше и приятнее.
Ответ написан
Кстати, не всегда это хорошая практика. Можно считать это преждевременной универсализацией и оопизацией во многих случаях, если вы точно не уверены, что понадобится несколько классов с разными реализациями, но одним интерфейсом (тестирование отдельный случай, во многом зависит от языка и инструментов, где-то мок/стаб легко создать без интерфейсов, где-то, наверное, невозможно). Вот когда понадобится, тогда и создадите, а достоверая оценка оценка вероятности понадобится или нет приходит только с опытом. Но лучше, имхо, для более быстрого его набирания лишний раз выделить интерфейс из уже реализованного класса, чем выделить сразу, а потом и не вспомнить, что зря его выделял и таскать по всему проекту без особой надобности. А когда интерфеейса не хватате, то это чувствуется, особенно в языках с сильной типизациейю.
Ответ написан
Комментировать
taliban
@taliban
php программист
Интерфейс не нужно описывать перед классом, а можно, это разные вещи. И как писали выше, Вы сами поймете когда оно того стоит а когда нет, нельзя точно сказать «вот тут делай интерфейс, а вот здесь не нужно».
Ответ написан
Комментировать
Monnoroch
@Monnoroch
По поводу дополнения к вопросу:
Ответ на вопрос «зачем?» тривиален: так удобнее.
А вот понять почему можно только на собственном опыте, это как почему сладкое вкусно. Сколько не обьясняй, пока не попробуешь не поймешь.
Ответ написан
Комментировать
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»
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы