zoukankan      html  css  js  c++  java
  • 更好的创建构造函数的方式

    在Golang里,不支持函数重载,那么带来了一个问题。怎么创建多个可选参数的构造构造函数?

    通常我们的构造函数时这样子的:

    1 type Student struct {
    2     Name string
    3 }
    4 
    5 func NewStudent (name string) *Student{
    6     return &Student{Name:name}
    7 }

    那么问题来了,有一天我们发现Student结构体还有一些其他属性。现在的Student是这样的

    1 type Student struct {
    2     Name string
    3     Age int
    4 }

    这时我们怎么重构我们的代码?

    func NewStudent (name string, age int) *Student 不合适,不向后兼容。

    func NewStudentWithAge (name string, age int) *Student 难道以后有新的属性就加N个函数吗,各种属性组合起来?不是很好。

    func NewStudent(config *studentConfig) *Student 这个看起来不错,但是也有些问题。不向后兼容,最主要的问题是默认值不好处理。试想一下,Age默认值是5怎么写?

    这时,函数选项模式是不错的选择。英文名叫做:Functional Options Pattern

    type Student struct {
        Name string
        Age int
    }
    
    type StudentOption func(*Student)
    
    func WithAge(age int) StudentOption{
        return func(s *Student){
            s.Age = age
        }
    }
    
    func NewStudent(name string, options ...StudentOption) *Student{
        student := &Student{Name:name, Age:5}
        for _,o :=range options{
            o(student)
        }
        return student
    }

    调用的时候可以是NewStudent(“zhangsan”),也可以是NewStudent(“lisi”, WithAge(6))。既保持了兼容性,而且1个新属性只需要1个With函数。

    各位有没有更好的思路呢?

  • 相关阅读:
    8.3.ZooKeeper集群安装配置
    Shiro Demo 示例(SpringMVC-Mybatis-Shiro-redis)
    Shiro 学习
    JavaWeb项目:Shiro实现简单的权限控制(整合SSM)
    权限管理——权限模型和权限控制
    Java程序员面试题集(151-180)
    Java面试题集(136-150)
    Java面试题集(131-135)
    Java面试题集(116-135)
    Java面试题集(1-50)
  • 原文地址:https://www.cnblogs.com/13579net/p/13748737.html
Copyright © 2011-2022 走看看