В одной книжке нашёл два примера реактивного подхода. Но не понимаю в чём их принципиальное отличие. Помогите пожалуйста разобраться.
Императивный реактивный подход. Живое
демо здесь
Код:
class Calculator {
constructor(){
this.VAT = 22;
}
sum(items){
const items$ = Rx.Observable.from(items);
const total$ = items$.map(value => value + (value * this.VAT/100))
.reduce((acc, value) => acc + value);
return total$;
}
}
class Receipt {
constructor(calculator){
this.calc = calculator;
}
print(...items){
const total$ = this.calc.sum(items);
total$.subscribe(total => console.log(`total receipt £${total.
toFixed(2)}`));
}
}
const JEANS = 80.00;
const SHIRT = 35.00;
const SHOES = 90.00;
const COAT = 140.00;
const HAT = 29.00;
const calc = new Calculator();
const receipt = new Receipt(calc);
receipt.print(JEANS, SHIRT, SHOES, COAT, HAT);
Функциональный реактивный подход. Живое
демо здесь.
Код:
class Calculator {
getTotal(...items){
const items$ = Rx.Observable.from(items);
const total$ = items$.map(v => this.addVAT(v))
.reduce(this.sumElements);
return total$;
}
addVAT(itemValue){
return itemValue + this.calculateVAT(itemValue);
}
calculateVAT(value){
const VAT = 22;
return value * VAT/100;
}
sumElements(accumulator, value){
return accumulator + value
}
}
class Receipt {
print(total$){
total$.subscribe(total => console.log(`total receipt £${total.
toFixed(2)}`));
}
}
const JEANS = 80.00;
const SHIRT = 35.00;
const SHOES = 90.00;
const COAT = 140.00;
const HAT = 29.00;
const calc = new Calculator();
const receipt = new Receipt();
receipt.print(calc.getTotal(JEANS, SHIRT, SHOES, COAT, HAT));
На мой взгляд в обоих примерах отсутствуют внешние переменные, в которых хранится промежуточное состояние. Поэтому я бы оба эти примера отнёс к функциональному программированию. Но автор
книги со мной не согласился бы.