我有这样的情况:有两种方法(我不能更改,因为它们来自抽象类) from()和 to()必须以很小的差异执行相同的代码。我创建了第三个方法,并使用一个布尔变量来知道这两个方法中的哪一个称为第三个方法。现在,有没有一种更简洁的方式来编写此代码?
protected from(x: any): any[] {
return this.convertArray(true, x);
}
protected to(y: any): any[] {
return this.convertArray(false, y);
}
private convertArray(isFrom: boolean, inArray: any[]): any[] {
const array = [];
if (this.types.length === 1) {
// ... some code here ...
array.push(isFrom ? adapter.from(value) : adapter.to(value));
} else {
// ... some code here ...
array.push(isFrom ? adapter.from(inArray[i]) : adapter.to(inArray[i]));
}
return array;
}
答案 0 :(得分:1)
您还有其他选择:
您可以使用字符串作为方法名称和方括号表示法,以从adapter
获取方法:
private convertArray(isFrom: boolean, inArray: any[]): any[] {
const array = [];
const method = isFrom ? "from" : "to"; // ***
if (this.types.length === 1) {
// ... some code here ...
array.push(adapter[method](value)); // ***
} else {
// ... some code here ...
array.push(adapter[method](inArray[i])); // ***
}
return array;
}
您可以使用通过bind
创建的包装函数(这样调用中的this
是adapter
):
private convertArray(isFrom: boolean, inArray: any[]): any[] {
const array = [];
const method = (isFrom ? adapter.from : adapter.to).bind(adapter); // ***
if (this.types.length === 1) {
// ... some code here ...
array.push(method(value)); // ***
} else {
// ... some code here ...
array.push(method(inArray[i])); // ***
}
return array;
}
或(通过箭头函数将其称为“ 2(b)”):
private convertArray(isFrom: boolean, inArray: any[]): any[] {
const array = [];
const op = isFrom ? value => adapter.from(value) // ***
: value => adapter.to(value); // ***
if (this.types.length === 1) {
// ... some code here ...
array.push(op(value)); // ***
} else {
// ... some code here ...
array.push(op(inArray[i])); // ***
}
return array;
}
或直接通过.call
使用该方法:
private convertArray(isFrom: boolean, inArray: any[]): any[] {
const array = [];
const method = isFrom ? adapter.from : adapter.to; // ***
if (this.types.length === 1) {
// ... some code here ...
array.push(method.call(adapter, value)); // ***
} else {
// ... some code here ...
array.push(method.call(adapter, inArray[i])); // ***
}
return array;
}