拒绝编程中的隐式


作者:郑凯

golang 最大的优点,也是学习这语言最大的收获,就是拒绝隐式。

比方说 this 为什么叫 this,就是隐式。因为在所有 OO 语言里都这么叫,只因为约定俗成见怪不怪,直到 JS 的 this 把所有人恶心到,才把这个问题暴露出来。到了 golang,没有 this 这个关键词了,成了普通变量名。

前段时间临时帮忙的项目,到处都是 OO 最可恶的地方,比方说 foo.scan(bar),不看完整代码根本不知道 foobar 的哪些成员变量有什么变化。于是自己写的时候,类似的地方会写成 foo.result = foo.scan(bar),尽量函数式,这里 foo.scan. 其实只起到命名空间的作用。

配置文件也是如此,以前我可能会设定 foo.item[0].config 如果为空就默认 foo.defaultConfig,这就是典型的隐式赋值。现在新写的一个主配置,目前还没有这种“缺省”设定,重复就重复了。另外也仰仗 protobuf 只记 value 不记 key 的特点,可能我很难碰到大到需要用默认值的防止来优化的部分。另外像上面这个例子,如果某个函数来处理 item,可能我只需要传值 foo.item[0] 而不是整个 foo,因为 item 里已经包含了所有必要的内容。我对目前的配置文件的规划很得意,确保了完整和清晰这两个我所关注的点。

可能给人看的时候需要简要一些、只列出不同。但是给机器读的时候,好的配置的应该让处理配置的程序尽可能少写 if