Как сделать управление версиями в Go при добавлении параметра variadi c в конструктор? - PullRequest
3 голосов
/ 01 февраля 2020

Я считаю, что добавление функции variadi c к обычной функции или методу нарушает изменение, основанное на этом посте . Но как насчет добавления параметров variadi c в функцию конструктора? как добавление Функциональные параметры .

При использовании semver этот код v1.0.0

type Foo struct{}

// constructor with default behavior
func NewFoo() *Foo {
    return &Foo{}
}

Добавление параметра c variadi

type Foo struct{}

type Option func(&Foo)

// constructor with option
func NewFoo(opts ...Option) *Foo {
    // process option before return
    // ...
    return &Foo{}
}

Старый код все еще в порядке при вызове функции конструктора, и никто не назначает конструктор переменной и передает конструктор другой функции, такой как , в данном случае .

Так что в приведенном выше коде следует Я увеличиваю основную версию до версии 2.0.0 или младшую до версии 1.1.0?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

В Go, следует ли мне увеличить основную версию до v2.0.0 или младшую до v1.1.0?


В Go, NewFoo типы функций

v1.0.0:

type Foo struct{}

func NewFoo() *Foo {}

и

v2.0.0:

type Foo struct{}

type Option func(*Foo)

func NewFoo(opts ...Option) *Foo { }

являются различными типами. Это делает это серьезным изменением, обновлением основного номера версии.


Однако, это не главное изменение, просто расширение, поэтому обновите вспомогательный номер версии. Используйте похожие, но разные имена функций. Например, NewFoo и NewFooOpts.

v1.1.0:

type Foo struct{}

func NewFoo() *Foo {
    return NewFooOpts()
}

type Option func(*Foo)

func NewFooOpts(opts ...Option) *Foo {
    var foo Foo
    for _, opt := range opts {
        // handle opt
        _ = opt
    }
    return &foo
}

Детская площадка: https://play.golang.org/p/HcN1WCi0YK4

Используйте комментарии документирование функций, чтобы предоставить пользователю руководство относительно того, какую функцию использовать. Например, возможно, функция NewFoo устарела в пользу функции NewFooOpts.


Никто не назначает конструктор переменной и не передает конструктор другой функции.


Поскольку кто-то это делает, утверждение ложно.

1 голос
/ 01 февраля 2020

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

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

...