函数和方法名称

避免重复

在为一个函数或方法选择名称时,要考虑该名称将被阅读的环境。请考虑以下建议,以避免在调用地点出现过多的重复:

  • 以下内容一般可以从函数和方法名称中省略。

    • 输入和输出的类型(当没有冲突的时候)
    • 方法的接收器的类型
    • 一个输入或输出是否是一个指针
  • 对于函数,不要重复软件包的名称

    1. `// Bad:`
    2. `package yamlconfig`
    3. ``
    4. `func ParseYAMLConfig(input string) (*Config, error)`
  • 对于方法不要重复方法接收器的名称。

    // Bad:
    func (c *Config) WriteConfigTo(w io.Writer) (int64, error)
    // Good:
    func (c *Config) WriteTo(w io.Writer) (int64, error)
  • 不要重复传参的变量名称

    // Bad:
    func TransformYAMLToJSON(input *Config) *jsonconfig.Config
    // Good:
    func Transform(input *Config) *jsonconfig.Config

    当有必要区分类似名称的函数时,包含额外信息是可以接受的。

    // Good:
    func (c *Config) WriteTextTo(w io.Writer) (int64, error)
    func (c *Config) WriteBinaryTo(w io.Writer) (int64, error)

命名约定

在为函数和方法选择名称时,还有一些常见的约定:

  • 有返回结果的函数使用类名词的名称。
// Good:
func (c *Config) JobName(key string) (value string, ok bool)

这方面的一个推论是,函数和方法名称应该避免使用前缀Get。

// Bad:
func (c *Config) GetJobName(key string) (value string, ok bool)
  • 做事的函数被赋予类似动词的名称。
// Good:
func (c *Config) WriteDetail(w io.Writer) (int64, error)
  • 只因所涉及的类型而不同,而功能相同的函数在名称的末尾带上类型的名称。
    // Good:
    func ParseInt(input string) (int, error)
    func ParseInt64(input string) (int64, error)
    func AppendInt(buf []byte, value int) []byte
    func AppendInt64(buf []byte, value int64) []byte

    如果有一个明确的 “主要 “版本,该版本的名称中可以省略类型:

// Good:
func (c *Config) Marshal() ([]byte, error)
func (c *Config) MarshalText() (string, error)