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

Вопрос наверно скорее всего риторический) Есть ли какой-то паттерт создания

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

Пока что самым правильным кажется решение с валидацией в каждом метод, хоть и с оверхедной проверкой и бойлерплейтом

https://go.dev/play/p/VlbkmJpl4ZQ

13 ответов

17 просмотров

Возвращай интерфейс. А сама структура пусть приватная будет

Co.In-🇺🇦 🔜 Автор вопроса
Oleg Karakin
Возвращай интерфейс. А сама структура пусть приват...

Вначале я так и делал) Но потом узнал про антипаттерн preemptive interface и линтер ругался на ireturn, так что ему нужно было в правила добавлять исключения) https://bryanftan.medium.com/accept-interfaces-return-structs-in-go-d4cab29a301b

Co.In 🇺🇦 🔜
Вначале я так и делал) Но потом узнал про антипатт...

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

Co.In-🇺🇦 🔜 Автор вопроса

Интерфейс фу-фу-фу, но init - топчик) Ну и init не решит проблему. Чем неявная инициализация лучше ошибки явной? Проверка что так что так в каждом методе нужна

Co.In 🇺🇦 🔜
Интерфейс фу-фу-фу, но init - топчик) Ну и init не...

Проверки иногда можно избежать: https://dave.cheney.net/2013/01/19/what-is-the-zero-value-and-why-is-it-useful Ну вы же наверное либу пишите. Разве не приятнее, когда либа прощает, а не принуждает нас? А чем принуждение к конструктору лучше непринуждения к нему?

Alex Sibyakin
Проверки иногда можно избежать: https://dave.chene...

Вот за что Go нельзя не любить: статье 10 лет, а она не устарела.

Co.In-🇺🇦 🔜 Автор вопроса
Alex Sibyakin
Проверки иногда можно избежать: https://dave.chene...

А если речь про обязательньіе поля? К примеру разраб заполнил не все, потом неявно мержить с остальньіми обязательньіми которьіе по дефолту при первом вьізове заполнять?

Co.In 🇺🇦 🔜
Вначале я так и делал) Но потом узнал про антипатт...

preemptive interface это когда конструктор интерфейс возвращает?

У тебя же сама структура может быть приватной а конструктор нет и ты можешь вернуть не интерфейс а приватную структуру

Co.In-🇺🇦 🔜 Автор вопроса
Артём Лазаренко
У тебя же сама структура может быть приватной а ко...

Да. Нужно только немного угомонить линтер и IDE а то они с ума сходят от unexported type). И положить рядом интерфейс в либу, если кому в консюмере нужно будет сохранить инстанс, чтоб не описьівать руками 100500 методов // Modulator a list of methods to store in the consumer as an interface. type Modulator interface { Alice() error Bob() error } // New instance of module //goland:noinspection GoExportedFuncWithUnexportedType func New() *module { //nolint:revive,golint m := &module{} return m } // New instance of module as interface func NewI() Modulator { //nolint:ireturn return New() } type module struct {} func (m *module) Alice() error { return nil } func (m *module) Bob() error { return nil } Хотя я до конца так и не проникся в чем боль ireturn по сравнению с возвращением приватной структурьі, что вьіигрьіваем? Можно даже сделать два конструктора один возвращает приватную структуру, второй интерфейс. Чтоб гарантированно подгорело у всех)

Co.In 🇺🇦 🔜
Да. Нужно только немного угомонить линтер и IDE а ...

да, этот рул про запрет unexported structs from exported functions, самый разражающий, его везде и всюду приходится отключать. кто вообще придумал считать антипаттерном то что применяют повсюду без каких-либо проблем

типа type foo struct { ... } func ExportedFunc() foo { } ``` так?

Alexander N
типа type foo struct { ... } func ExportedFunc()...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта