вторник, 24 ноября 2020 г.

Go style guides: избегайте изменяемых глобальных переменных

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

Неудачный вариант:

// sign.go

var _timeNow = time.Now

func sign(msg string) string {
    now := _timeNow()
    return signWithTime(msg, now)
}

// sign_test.go

func TestSign(t *testing.T) {
    oldTimeNow := _timeNow
    _timeNow = func() time.Time {
        return someFixedTime
    }
    defer func() { _timeNow = oldTimeNow }()

    assert.Equal(t, want, sign(give))
}

Более удачный вариант:

// sign.go

type signer struct {
    now func() time.Time
}

func newSigner() *signer {
    return &signer{
        now: time.Now,
    }
}

func (s *signer) Sign(msg string) string {
    now := s.now()
    return signWithTime(msg, now)
}

// sign_test.go

func TestSigner(t *testing.T) {
    s := newSigner()
    s.now = func() time.Time {
        return someFixedTime
    }

    assert.Equal(t, want, s.Sign(give))
}


Читайте также:


Комментариев нет:

Отправить комментарий