[JS Compose] 1. Refactor imperative code to a single composed expression using Box

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JS Compose] 1. Refactor imperative code to a single composed expression using Box相关的知识,希望对你有一定的参考价值。

After understanding how Box is, then we are going to see how to use Box to refacotr code, to un-nested expression.

 

For example, we have code:

const moneyToFloat = str => {
  const cost = str.replace(/\$/g, ‘‘);
  return parseFloat(cost);
}

const percentToFloat = str => {
  const cost = parseFloat(str.replace(/\$/g, ‘‘));return cost * 0.01;
}

const applyDiscount = (price, prec) => {
  const cost = moneyToFloat(price);
  const p = percentToFloat(prec);
  return cost - cost * p;
}

const result = applyDiscount($5.00, 20%)
console.log(result) // 4

 

So how it would be when we using Box version:

const moneyToFloat = str => {
  const cost = str.replace(/\$/g, ‘‘);
  return parseFloat(cost);
}

const moneyToFloat = str => 
  Box(str)
  .map(s => s.replace(/\$/g, ‘‘))
  .map(s => parseFloat(cost))

Well, nothing really impress here, we put ‘str‘ into Box, and using map to do all the logic.

 

const percentToFloat = str => {
  const cost = parseFloat(str.replace(/\$/g, ‘‘));
  return cost * 0.01;
}

const percentToFloat = str => 
  Box(str.replace(/\$/g, ‘‘))
    .map(s => parseFloat(s))
    .map(s => s * 0.01)

This part, notice we un-nest ‘parseFloat(str.replace(...))‘, make logic more readable by using map.

 

const applyDiscount = (price, prec) => {
  const cost = moneyToFloat(price);
  const p = percentToFloat(prec);
  return cost - cost * p;
}

const applyDiscount = (price, prec) =>
  moneyToFloat(price)
    .fold(cost => percentToFloat(prec)
         .fold(p => cost - cost * p))

Notice here, because ‘moneyToFloat‘ return a Box, so we are able to chain map on that.

And ‘cost‘, we can use clouse to remember ‘cost‘, and chain ‘fold‘ on precentToFloat. The reason we use ‘fold‘ instead of ‘map‘, is ‘fold‘ we can get value out of Box.

 

const Box = x =>
({
  map: f => Box(f(x)),
  fold: f => f(x),
  toString: () => `Box(${x})`
})

const moneyToFloat = str => 
  Box(str)
  .map(s => s.replace(/\$/g, ‘‘))
  .map(s => parseFloat(cost));

const percentToFloat = str => 
  Box(str.replace(/\$/g, ‘‘))
    .map(s => parseFloat(s))
    .map(s => s * 0.01);

const applyDiscount = (price, prec) =>
  moneyToFloat(price)
    .fold(cost => percentToFloat(prec)
         .fold(p => cost - cost * p))

const result = applyDiscount($5.00, 20%)
console.log(result) // 4

 

以上是关于[JS Compose] 1. Refactor imperative code to a single composed expression using Box的主要内容,如果未能解决你的问题,请参考以下文章

csharp refactor.cs

refactor window_x64微信小程序环境搭建

js函数式编程curry与compose实现

[JS Compose] 6. Semigroup examples

[JS Compose] 5. Create types with Semigroups

docker compose 使用节点 js 和 mysql - 无法与 mysql 连接