
很多人在写一个类时会写出这样的代码:
class Person { talk (name, msg) { this._initName(name) this.msg = msg this._send() } _initName (name) { this.name += ': ' } _send () { console.log(this.name + this.msg) } } 我认为更好的写法是这样:
class Person { talk (name, msg) { this.name = this._initName(name) this._send(this.name, msg) } _initName (name) { return name += ': ' } _send (name, msg) { console.log(name + msg) } } 在实现了同样的功能的同时,下面的代码有以下几个优点:
纯函数的特点是没有副作用,如果在该类的其他地方仍需复用这个逻辑,可以直接使用,比如
const anotherName = this._initName(anotherName) 而原来的 initName(name) 因为和 this.name 绑定,无法很好的复用。
阅读代码 1 时,当看到 talk 的代码时很难看出来 this.initName(name) 和 this.send() 到底在做什么,代码 2 比代码 1 多传递了以下信息:
1 viko16 2018 年 2 月 4 日 那为什么不直接把 _initName 和 _send 抽离出去?别的类复用的时候还少一次实例化呢 |
2 wwqgtxx 2018 年 2 月 4 日 via iPhone 你这种写法在 python 下都会建议你把写法函数改成 classmethod 或者 staticmethod 了 |
5 doubleflower 2018 年 2 月 5 日 via Android 你把数据都从函数里面传进去还要写个类干嘛?不伦不类,面向对象类就是用来封装数据的 |
6 buzhiming OP @doubleflower 不对对外暴露的接口做这种优化,所有和类的使用并不冲突。 |
7 doubleflower 2018 年 2 月 5 日 @buzhiming 这和对外暴露有什么关系。你既然实现用了类,数据就是绑在对象上的,方法是操作对象数据的,你要增加灵活性可以不从对象上取数据,还你的函数为何还要放在类里?定义一个类外的独立函数不是更好? |
8 buzhiming OP @doubleflower 当然有关系,数据封装在了类里面,所以在外面调用类的对外暴露的方法时,只需传必要的参数,而不要去传封装的参数,这些方法是不能优化为纯函数的。 而供类内部自己使用的私有方法,这么优化是有我说的以上的几点好处的。 你说的没错,这些函数完全可以放在类的外部作为独立函数,只不过这不是重点。 |