很多人在写一个类时会写出这样的代码:
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-02-04 21:29:47 +08:00 2
那为什么不直接把 _initName 和 _send 抽离出去?别的类复用的时候还少一次实例化呢
|
2
wwqgtxx 2018-02-04 22:18:59 +08:00 via iPhone
你这种写法在 python 下都会建议你把写法函数改成 classmethod 或者 staticmethod 了
|
5
doubleflower 2018-02-05 08:25:03 +08:00 via Android
你把数据都从函数里面传进去还要写个类干嘛?不伦不类,面向对象类就是用来封装数据的
|
6
buzhiming OP @doubleflower 不对对外暴露的接口做这种优化,所有和类的使用并不冲突。
|
7
doubleflower 2018-02-05 09:54:08 +08:00
@buzhiming 这和对外暴露有什么关系。你既然实现用了类,数据就是绑在对象上的,方法是操作对象数据的,你要增加灵活性可以不从对象上取数据,还你的函数为何还要放在类里?定义一个类外的独立函数不是更好?
|
8
buzhiming OP @doubleflower 当然有关系,数据封装在了类里面,所以在外面调用类的对外暴露的方法时,只需传必要的参数,而不要去传封装的参数,这些方法是不能优化为纯函数的。
而供类内部自己使用的私有方法,这么优化是有我说的以上的几点好处的。 你说的没错,这些函数完全可以放在类的外部作为独立函数,只不过这不是重点。 |