Нарушает ли "Accept Interfaces" устаревшие инструменты?
Устаревание
Поддерживаемый способ пометки функций как устаревших выглядит примерно так:
type MyStruct struct {
}
// MyFunc returns hello
// Deprecated: Use YourFunc
func (m MyStruct) MyFunc() string {
return "hello"
}
Современные IDE будут выделять любое использование этой функции, а линтеры также могут вызывать предупреждения (я лично это не проверял)
Принимайте интерфейсы. Возвратные структуры.
Популярная передовая практика - «Принимать интерфейсы. Возвращать структуры». - что имеет тенденцию поощрять твердотельный дизайн в программном обеспечении.
Однако следующий код, который следует этой передовой практике, скрывает предупреждение об устаревании:
// MyInterface specifies a single function that we require from a dependency
type MyInterface interface {
MyFunc() string
}
func main() {
var v MyInterface
v = MyStruct{}
v.MyFunc()
}
Вопрос
Есть ли решение этой проблемы?
Если бы я был, например, сопровождающим библиотеки: как я могу гарантировать, что мои предупреждения об устаревании увидят пользователи библиотеки, которые также следуют лучшим практикам и определяют свои собственные интерфейсы зависимостей.
1 ответ
Это кажется логичным, поскольку метод интерфейса не устарел. Добавление
Deprecated:
в этом случае может помочь строка функции интерфейса (не проверял, так как VSCode этого еще не делает).
// MyInterface specifies a single function that we require from a dependency
type MyInterface interface {
// Deprecated: use YourFunc
MyFunc() string
}
В этом случае, поскольку интерфейс имеет только одну функцию, вы должны отказаться от всего этого. Я знаю, что поддерживается godoc/pkg.go.dev, например, Queryer .
// MyInterface specifies a single function that we require from a dependency
// Deprecated: use YourInterface
type MyInterface interface {
MyFunc() string
}