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

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

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

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

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

13 ответов

8 просмотров

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

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()...

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

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
5
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Карта сайта