Многократная реализация одного и того же метода, который может иметь различные зависимости с Go и интерфейсами - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблема с использованием интерфейсов.

У меня есть метод Compute (a, b int), который имеет 2 реализации в зависимости от получателя.

func (addition *Addition) Compute(a, b int) int{
    return a+b
}

func (mult *Multiplication) Compute(a, b int) int{
    return a*b
}


type myInterface{
    Compute(a, b int) int
}

Давайте представим, что я нужно вызвать веб-сервис в умножении, чтобы получить значение.

Теперь у нас есть:

func (mult *Multiplication) Compute(iface WSInterface, a, b int) int{
    a := iface.getA()
    return a*b
}

Теперь мне нужно будет добавить iface WSInterface в Compute() Определение интерфейса, и добавьте его в дополнение, даже если оно не нужно.

Я закончу с:

type Addition struct{}

type Multiplication struct{}


func main() {
    addition := &Addition{}
    multiplication := &Multiplication{}
    res1 := addition.Compute(nil, 1, 2)
    res2 := addition.Compute(multiplication, 3, 4)
    fmt.Print(res1, res2)
}

type WSInterface interface {
    getA() int
}

func (mult *Multiplication) getA() int {
    return 1 // Mocked
}

type myInterface interface {
    Compute(iface myInterface, a, b int) int
}

func (addition *Addition) Compute(iface WSInterface, a, b int) int {
    return a + b
}

func (mult *Multiplication) Compute(iface WSInterface, a, b int) int {
    return iface.getA() * b
}

, но в дополнение оно не будет использовано.

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

Это нормально делать, это плохая схема или как мне это исправить?

1 Ответ

3 голосов
/ 15 апреля 2020

Эти специальные интерфейсы / объекты должны быть переданы в конструктор, сохраняя чистоту самих интерфейсов.

Что-то вроде:

type Multiplication struct {
  iface otherInferface
  // .. other Multiplication-specific fields
}

func NewMultiplication(iface otherInterface) *Multiplication {
  return &Multiplication{iface: iface}
}

А затем:

func (mult *Multiplication) Compute(a, b int) int{
    a := mult.iface.getA()
    return a*b
}

Таким образом, ваш myInterface остается простым и чистым:

type myInterface interface {
  Compute(a, b int)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...