Лучше использовать методы над замыканиями? - PullRequest
0 голосов
/ 10 апреля 2019

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

Это базовое представление шейдера OpenGL. И метод, и варианты закрытия выглядят одинаково для вызывающей стороны, но работают по-разному под капотом.

Закрытие:

type Shader struct {
    getID  func() uint32
    delete func()
}

func CreateShader(shader string) Shader {
    var id uint32
    //Do work...
    return Shader{
        getID: func() uint32 {
            return id
        },
        delete: func() {
            gl.DeleteShader(id)
        },
    }
}

Методы:

type Shader struct {
    id uint32
}

func CreateShader(shader string) Shader{
    var id uint32
    //Do work...
    return Shader{id: id}
}

func (s Shader) getID() uint32 {
    return s.id
}

func (s Shader) delete() {
    gl.DeleteShader(s.id)
}

Обе опции выглядят так:

func main() {
    shader := CreateShader("shader.code")
    id := shader.getID()
    fmt.Println(id)
    shader.delete()
}

Мисс, которого я думал избегать, заключался в том, что вызывающая сторона могла влиять на тип идентификатора без знания шейдера. Нечто похожее на:

shader.id = 4102 // or some other change

При использовании замыканий это поведение невозможно и требует от вызывающего абонента использовать правильные вызовы.

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

Есть ли причина, по которой закрывающая версия является "неправильной" по сравнению с методами? Существуют ли какие-либо стандарты Голанга, которые бы классифицировали любой вариант, более подходящий для моего варианта использования? Я ожидаю, что вызывающая сторона не будет касаться идентификатора шейдера и думаю, что использование замыканий упрощает правильное использование типа шейдера.

1 Ответ

3 голосов
/ 10 апреля 2019

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

Сказав это, замыкания могут быть способомобеспечивают защиту данных и часто (ab) используются для этого в языках, которые в противном случае не предлагают закрытые переменные (например, JavaScript).

Нет никаких оснований когда-либо использовать их для этой цели на ходу.

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