Интерфейсы и реализация
От: Буравчик Россия  
Дата: 01.07.20 21:34
Оценка:
Чем руководствуетесь, принимая решение выделять или не выделять интерфейс из класса, т.е. нужно ли разделить интерфейс и реализацию?

Когда имеется несколько реализация — понятно, интерфейс обычно выделяют.
Но если реализация только одна, для каких классов выделяете интерфейсы, а для каких нет?

P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.
Best regards, Буравчик
Re: Интерфейсы и реализация
От: СвободуАнжелеДевис СССР  
Дата: 01.07.20 21:49
Оценка: +1 -2
Б>Когда имеется несколько реализация — понятно, интерфейс обычно выделяют.
Б>Но если реализация только одна, для каких классов выделяете интерфейсы, а для каких нет?

Выделяется при любом взаимодействии двух и более классов, ибо тесты.

Б>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.


С#
Нет времени на раскачку!
Re: Интерфейсы и реализация
От: · Великобритания  
Дата: 01.07.20 22:12
Оценка: +4
Здравствуйте, Буравчик, Вы писали:

Б>Чем руководствуетесь, принимая решение выделять или не выделять интерфейс из класса, т.е. нужно ли разделить интерфейс и реализацию?

KISS же. Язык Java. Интерфейс создаю только когда без него никак. IDEA умеет рефакторинг "выделить интерфейс", так что нет никакой проблемы добавить когда реально понадобится.
Тест-фреймворк позволяет мокать любой класс.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Интерфейсы и реализация
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 02.07.20 02:09
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Чем руководствуетесь, принимая решение выделять или не выделять интерфейс из класса, т.е. нужно ли разделить интерфейс и реализацию?


Б>Когда имеется несколько реализация — понятно, интерфейс обычно выделяют.

Б>Но если реализация только одна, для каких классов выделяете интерфейсы, а для каких нет?

Б>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.


От языка сильно зависит. В том же C++ не выделяю интерфейсы до тех пор, пока без этого никак нельзя, т.е. крайне редко, так как довольно часто можно обойтись статическим полиморфизмом вместо динамического.

В случае с Python и того реже есть такая необходимость, благодаря динамической типизации, хотя если хочется точно указать какие методы должны быть реализованы, то abc наш лучший друг и соратник.

В Go ситуация диаметрально противоположная, там сам язык тебя подталкивает к тому, что бы как можно чаще выделять минимальные интерфейсы. Так что на Go интерфейсов всегда много и они выполняют строго одну задачу.
Re: Интерфейсы и реализация
От: Homunculus Россия  
Дата: 02.07.20 02:18
Оценка:
Здравствуйте, Буравчик, Вы писали:

C++
Я стараюсь писать классы так, чтоб H и CPP файл можно было просто взять и воткнуть в любой другой проект. Конечно, не всегда это возможно, но стараюсь.

Так вот, когда вижу, что класс полезный и стопроцентно пригодится в другом месте, но при этом у него есть взаимодействие с другими классами, то это взаимодействие определяю через интерфейсы.

Так же не обойтись без интерфейсов в плагинной системе.

Так же делегаты и коллбеки оборачиваю в интерфейсы.
Re: ВСЕГДА
От: LaptevVV Россия  
Дата: 02.07.20 04:31
Оценка:
Ибо тестирование, развитие программы
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Интерфейсы и реализация
От: Sharov Россия  
Дата: 02.07.20 10:24
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Чем руководствуетесь, принимая решение выделять или не выделять интерфейс из класса, т.е. нужно ли разделить интерфейс и реализацию?

Б>Когда имеется несколько реализация — понятно, интерфейс обычно выделяют.
Б>Но если реализация только одна, для каких классов выделяете интерфейсы, а для каких нет?
Б>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.

.net core, С#. Стал с недавнего времени использовать DI, а там без интерфейсов практически никуда.
Кодом людям нужно помогать!
Re[2]: Интерфейсы и реализация
От: Буравчик Россия  
Дата: 02.07.20 10:46
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>В случае с Python и того реже есть такая необходимость, благодаря динамической типизации, хотя если хочется точно указать какие методы должны быть реализованы, то abc наш лучший друг и соратник.


Я пишу на python. Тестировать можно и без интерфейсов, но руки все равно тянутся выделять интерфейсы, чтобы явно выделить контракт сервиса и развязать компоненты между собой (DI). И каждый раз, когда я создаю интерфейс, меня терзают мысли об overdesign Ведь это совсем не python-way
Best regards, Буравчик
Re[2]: Интерфейсы и реализация
От: Буравчик Россия  
Дата: 02.07.20 10:51
Оценка:
Здравствуйте, ·, Вы писали:

·>KISS же. Язык Java. Интерфейс создаю только когда без него никак. IDEA умеет рефакторинг "выделить интерфейс", так что нет никакой проблемы добавить когда реально понадобится.


В каких случаях добавляешь интерфейсы? Как отличить ситуацию, когда "без интерфейса никак" и когда "без интерфейса норм"?
Best regards, Буравчик
Re[2]: Интерфейсы и реализация
От: · Великобритания  
Дата: 02.07.20 15:02
Оценка:
Здравствуйте, Sharov, Вы писали:

Б>>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.

S>.net core, С#. Стал с недавнего времени использовать DI, а там без интерфейсов практически никуда.
А зачем для DI интерфейсы? Это специфика C# что-ли?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Интерфейсы и реализация
От: · Великобритания  
Дата: 02.07.20 15:17
Оценка: 12 (2)
Здравствуйте, Буравчик, Вы писали:

Б>·>KISS же. Язык Java. Интерфейс создаю только когда без него никак. IDEA умеет рефакторинг "выделить интерфейс", так что нет никакой проблемы добавить когда реально понадобится.

Б>В каких случаях добавляешь интерфейсы? Как отличить ситуацию, когда "без интерфейса никак" и когда "без интерфейса норм"?
В подавляющем большинстве случаев это когда более одной реализации.
Ещё иногда для выделения API между разными модулями (но это в каком-то смысле то же самое). Например, можно начать писать код, выделяя что-то в интерфейсы, мОкая их в тестах. А потом интерфейсы реализуется кем-то другим.
Другие случаи что-то в голову сейчас не приходят, вспомню — напишу.

Публичные методы класса это и есть интерфейс по сути.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 02.07.2020 15:19 · . Предыдущая версия .
Re[3]: Интерфейсы и реализация
От: Sharov Россия  
Дата: 02.07.20 19:35
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Sharov, Вы писали:


Б>>>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.

S>>.net core, С#. Стал с недавнего времени использовать DI, а там без интерфейсов практически никуда.
·>А зачем для DI интерфейсы? Это специфика C# что-ли?

1)необязательно, типа признака хорошего тона. Еще и буковка D в SOLID.
2)как иначе изменить реализацию через какой-нибудь конфиг файл?
Кодом людям нужно помогать!
Отредактировано 02.07.2020 19:37 Sharov . Предыдущая версия .
Re[4]: Интерфейсы и реализация
От: · Великобритания  
Дата: 02.07.20 21:05
Оценка:
Здравствуйте, Sharov, Вы писали:

S>>>.net core, С#. Стал с недавнего времени использовать DI, а там без интерфейсов практически никуда.

S>·>А зачем для DI интерфейсы? Это специфика C# что-ли?
S>1)необязательно, типа признака хорошего тона.
Культ Карго, иначе говоря.

S>Еще и буковка D в SOLID.

KISS über allen. Если классы в разных модулях это ещё имеет смысл. Но когда у тебя каждый класс продублирован интерфейсом, то просто мусорный код, который только мешается.

S>2)как иначе изменить реализацию через какой-нибудь конфиг файл?

Если реализацию можно изменить, значит у тебя несколько реализаций. Этот случай, вроде, не рассматриваем. Тут, ясен пень, интерфейс нужен.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 02.07.2020 21:06 · . Предыдущая версия .
Re[3]: Интерфейсы и реализация
От: Mystic Artifact  
Дата: 26.07.20 01:57
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Я пишу на python. Тестировать можно и без интерфейсов, но руки все равно тянутся выделять интерфейсы, чтобы явно выделить контракт сервиса и развязать компоненты между собой (DI). И каждый раз, когда я создаю интерфейс, меня терзают мысли об overdesign Ведь это совсем не python-way


Предполагаю, что желание выделять интерфейсы — обусловлено тем, что язык не имеет возможности разделить контракт от реализации (наподобии хидеров в C++), и когда реализация распухает — становится тяжело прочитать натуральным образом этот самый контракт. С этим могут помочь всяческие тулзы, редакторы, внешняя документация, но по моему мнению они сильно проигрывают простому файлу и в большинстве случаев не имеют необходимого функционала.

Используя C# хочется иногда вводить подобные интерфейсы, но приходится себя останавливать, т.к. в нем это инструмент для разрешения иных задач. Поэтому без необходимости не ввожу. Например, если, я сделаю struct (value-type) которая реализует интерфейс — это с одной удовлетворит мои желания, а с другой может провоцировать пользователей передавать их именно через интерфейс (что приведет к боксингу) — что аннигилирует саму цель её существования. Ну, в более стандартных ситуациях это все равно выливается в лишний шум.
Re: Интерфейсы и реализация
От: scf  
Дата: 26.07.20 08:28
Оценка: +1
Здравствуйте, Буравчик, Вы писали:

Б>Чем руководствуетесь, принимая решение выделять или не выделять интерфейс из класса, т.е. нужно ли разделить интерфейс и реализацию?


Java/Scala
Еще две причины:
— Тестирование. тестовую реализацию интерфейса можно заимплементить, не сваязываясь с фреймворками для моков.
— Оформление кода. отдельный интерфейс с джавадоком — это удобная документация для программиста, не загроможденная реализацией.
Re[3]: Интерфейсы и реализация
От: a7d3  
Дата: 26.07.20 09:05
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Sharov, Вы писали:


Б>>>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.

S>>.net core, С#. Стал с недавнего времени использовать DI, а там без интерфейсов практически никуда.
·>А зачем для DI интерфейсы? Это специфика C# что-ли?

Хотелось бы посмотреть на DI без интерфейсов в случае юнит-тестов на С++.
Re[4]: Интерфейсы и реализация
От: · Великобритания  
Дата: 26.07.20 18:56
Оценка:
Здравствуйте, a7d3, Вы писали:

Б>>>>P.S. Возможно, ответ сильно зависит от используемого языка. По возможности, укажите используемый язык.

S>>>.net core, С#. Стал с недавнего времени использовать DI, а там без интерфейсов практически никуда.
A>·>А зачем для DI интерфейсы? Это специфика C# что-ли?
A>Хотелось бы посмотреть на DI без интерфейсов в случае юнит-тестов на С++.
Во-первых, в С++ нет интерфейсов. Так что не очень понятно что конкретно ты имеешь в виду.
Во-вторых, класс с вирт-функциями мокается ровно же как и в Java/C#, без всяких интерфейсов. Или ты конструктор имеешь в виду?
В-третьих, другие опции есть, шаблоны там, препроцессор, подмена .cpp системой сборки.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Интерфейсы и реализация
От: a7d3  
Дата: 26.07.20 20:54
Оценка:
Здравствуйте, ·, Вы писали:

A>>·>А зачем для DI интерфейсы? Это специфика C# что-ли?

A>>Хотелось бы посмотреть на DI без интерфейсов в случае юнит-тестов на С++.
·>Во-первых, в С++ нет интерфейсов. Так что не очень понятно что конкретно ты имеешь в виду.

В каком плане в С++ нет интерфейсов?
И что именно понимается под интерфейсами, которые якобы не нужны в DI?
Re[6]: Интерфейсы и реализация
От: · Великобритания  
Дата: 26.07.20 21:44
Оценка:
Здравствуйте, a7d3, Вы писали:

A>>>·>А зачем для DI интерфейсы? Это специфика C# что-ли?

A>>>Хотелось бы посмотреть на DI без интерфейсов в случае юнит-тестов на С++.
A>·>Во-первых, в С++ нет интерфейсов. Так что не очень понятно что конкретно ты имеешь в виду.
A>В каком плане в С++ нет интерфейсов?
В языке такого понятия нет.

A>И что именно понимается под интерфейсами, которые якобы не нужны в DI?

Ищем в гугле "di c# example", первая ссылка вот. Там interface ICustomerDataAccess не нужен, и даже немножко вреден.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Интерфейсы и реализация
От: a7d3  
Дата: 26.07.20 22:57
Оценка: +1
Здравствуйте, ·, Вы писали:

·>Здравствуйте, a7d3, Вы писали:


A>>>>·>А зачем для DI интерфейсы? Это специфика C# что-ли?

A>>>>Хотелось бы посмотреть на DI без интерфейсов в случае юнит-тестов на С++.
A>>·>Во-первых, в С++ нет интерфейсов. Так что не очень понятно что конкретно ты имеешь в виду.
A>>В каком плане в С++ нет интерфейсов?
·>В языке такого понятия нет.

Всегда было и вдруг исчезло? https://en.cppreference.com/w/cpp/language/abstract_class

A>>И что именно понимается под интерфейсами, которые якобы не нужны в DI?

·>Ищем в гугле "di c# example", первая ссылка вот. Там interface ICustomerDataAccess не нужен, и даже немножко вреден.

Чем именно вреден и в каком из сценариев использования DI (IoC)?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.