Рефакторинг аналогичного кода, используемого несколькими методами
У меня есть такая ситуация: есть два метода (которые я не могу изменить, потому что они происходят из абстрактного класса) из () и в (), которые должны выполнять один и тот же код с небольшой разницей. Я создал третий метод и использовал логическую переменную, чтобы узнать, какой из двух методов называется третьим. Теперь, есть ли способ написать это более чистым способом?
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;
}
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; }