170 похожих чатов

Всем доброго времени суток! Мне стало интересно, а как правильно

оформлять комментарии к коду в случае если есть файл в котором интерфейс + его реализация. Вот пример того о чем я говорю:


# main.go

type Servicer interface {
Foo(a string) error
Bar(b int) error
}


type Service struct {}
func (s *Service) Foo(a string) error {…}
func (s *Service) Bar(b int) error {…}


В каком месте лучше оформлять доку, в интерфейсе или все таки его реализации? Или дублировать?
Я пока что склоняюсь к варианту чтоб в интерфейсе описывать в общих чертах зачем и для чего нужно, а уже в структуре описывать нюансы реализации. Но правильно ли это я хз

19 ответов

3 просмотра

неправильно свзывать интерфейс с реализацией, для начала

rglitchard- Автор вопроса
Daniel Podolsky
неправильно свзывать интерфейс с реализацией, для ...

в плане моего понимания или кода выше?) Ну вот допустим интерфейс описывает поведение какого-то круда где будет куча бизнес логики (подразумевается что это находится в слое service из примеров чистая архитектура/DDD) Интерфейс с реализациями же всегда будет связан как не крути. А вот куда комменты в этом случае запихнуть я не знаю)

rglitchard
в плане моего понимания или кода выше?) Ну вот до...

а зачем вам нужен отдельный интерфейс круда? что бы было?

rglitchard- Автор вопроса
Andrei 🦉 Sergeev
а зачем вам нужен отдельный интерфейс круда? что б...

в случае с интерфейсами этот код легко тестировать, потому что любой метод можно мокнуть

rglitchard
в случае с интерфейсами этот код легко тестировать...

Ну вот и описывайте интерфейсом используемую часть круда в том месте, где он используется У вас в голове все еще парадигма других языков программирования, что есть абстрактный класс- интерфейс, а есть его реализация, но в го нет абстрактных классов, а интерфейс это просто контракт

rglitchard
в случае с интерфейсами этот код легко тестировать...

Интерфейс должен лежать там где его используешь. Используешь в нескольких местах пишешь несколько интерфейсов(всё равно с течением времени разойдутся) Если интерфейс прям во многих местах используется можно ему отдельный пакет дать...

Andrei 🦉 Sergeev
Ну вот и описывайте интерфейсом используемую часть...

"в го нет абстрактных классов" ну почему ж, автогенеренный мок для интерфейса, где каждый метод вызывает panic("implement me") - ведь почти тоже самое, что абстрактный класс по поведению. ну да, классов и иерархии в принципе нет.

Elmanov Anton
"в го нет абстрактных классов" ну почему ж, автоге...

нет, не то же самое,это называется писать джавовый код на го🤣

Andrei 🦉 Sergeev
нет, не то же самое,это называется писать джавовый...

я вот не заметил по вопросу документирования интерфейса и реализации, что это попахивает джавой 🙂

Elmanov Anton
я вот не заметил по вопросу документирования интер...

сама постановка вопроса отдает джавой, в любом туториале по го в главе об интерфейсах сразу говорят, что так делать не надо

rglitchard- Автор вопроса
Andrei 🦉 Sergeev
Ну вот и описывайте интерфейсом используемую часть...

если представить типичную (в моем понимании) реализацию веб-сервера с простым крудом, это будет выглядеть примерно вот так: Слой #0 - модели (они же выступают доменной зоной) Слой #1 - интерфейс репозитория (взаимодействует с моделями) Слой #2 - интерфейс сервиса с бизнес логикой который взаимодействует с моделями и интерфейсом репозитория Слой #3 - хэндлеры используемые веб-фреймворком которые дергают интерфейс сервиса и только. Это все достаточно удобно по частям покрывать юнит тестами и в принципе работать с этим Но получается с вашим подходом я должен определять в хэндлерах интерфейс сервиса который отвечает за круд? Тогда это будет какая-то путаница, по крайней мере сейчас в моей голове) А есть примеры кода где можно посмотреть на такой подход? Потому что все что я гуглил про интерфейсы сводилось к описанию слоев которое я прикрепил выше

rglitchard
если представить типичную (в моем понимании) реали...

Вы исходите из того,что чистая архитектура - это истина в последней инстанции и пытаетесь по нее подогнать даже типичный круд, сразу выделяя 4(!) слоя абстракций и сходу утыкаетесь в проблемы с интерфейсами, потому что сам дизайн языка этому противоречит. Я не смогу вам здесь ничего ответить, потому что за мою 6 летнюю практику на го я с такой проблемой ни разу не сталкивался

rglitchard- Автор вопроса
Andrei 🦉 Sergeev
Вы исходите из того,что чистая архитектура - это и...

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

Вы должны понимать, что интерфейс - это не описание какого-то сервиса, а наоборот, сервис - это имплементация интерфейса Поэтому интерфейс надо определять в месте его использования

rglitchard
если представить типичную (в моем понимании) реали...

Вы написали только горизонтальные слои. По моему небольшому опыту, если горизонтальные слои разделять интерфесами(а других не вводить), то современем они обрастают гиганскими интерфейсами, которые устанешь мокать и которые приводят к сильной связанности. Используйте "ещё вертикальные" слои внутри горизонтальных. Т.е. нужен хендлеру из всего CRUD только метод R, то пусть и интерфейс у него будет только с одним R. А уже реализация может реализовывать несколько интерфейсов без проблем...

rglitchard
ну я бы не сказал что истина в последней инстанции...

Я тоже что то сходу не нашел все те статьи, что в свое время читал при входе в го, все потонуло в шлаке про ca и ddd...

rglitchard
ну я бы не сказал что истина в последней инстанции...

Проблема не в примерах а в понимании концепций слабой связаности

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

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
17
Есть вопрос: допустим есть железка с каким-то интерфейсом(допустим usb), но как по этому интерфейсу железкой управлять неизвестно, прог нету, а управлять очень хочется надо. К...
Mixail Frolov
15
а как ловят такое ghci> res <- getPos2 urlt 0 (alist !! 0) 200 ghci> res SearchAtom (Search "www.google.com" "/search?q=" "Haskell") "haskell.org" (SearchTS [(2024-05-06 07:...
Fedor
14
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
13
Карта сайта