如何使此功能更具可重用性/特定性/更好的设计?

尼克·宾

我在下面编写了此函数,该函数按产品类型和货币类型转换传递的产品数组

function getProductsByCurrency(products, type, exchangeRate = 1) {
    var productsRetrieved = products.map(item => ({id: item.id,
        name: item.name,
        price: (item.price * exchangeRate).toFixed(2),
        type: type}));
    return productsRetrieved;       
}

是否可以将功能分解为更具体的功能?还是以更好的方式设计?例如,通过将其命名为getProductsByCurrency,它看起来不正确,因为如果我以默认汇率使用它,则可以传递books数组来检索类型为与汇率无关的“ books”类型的产品。也许有一种方法可以使用部分函数(FP)?

编辑:添加更多上下文到我想要实现。

可以说,我来自三种资源的三类产品(电话,化妆品,书籍)。我需要按不同货币创建所有产品的三个合并数组(productsUSD,productsAUD,productsPounds)

还使用下面的函数来合并数组

    function concatProducts(arr) {
        return [].concat.apply([], arr);
    }

因此,我要三遍调用getProductsByCurrency,以按产品类型和货币(汇率)对它们进行转换,然后将这些值作为数组传递,以使它们联系起来,以实现USD产品。并重复获取产品inAUD,产品inPounds。

类型也是字符串值(例如:“ mobiles”)

杰瑞德·史密斯(Jared Smith)

首先,您发布的功能并没有真正的问题我会做一些不同的事情,但我不会假装这不会使头发有些裂开。

const processItem = (type, exchangeRate = 1) => ({
  id,
  price,
  name,
}) => ({
  id,
  name,
  type,
  price: (price * exchangeRate).toFixed(2),
});

我们有一个函数,该函数带有一个类型和一个可选的exchangeRate,并返回一个将单个项目转换为所需形式的函数。这就是鲍勃在评论中所说的。我还在项目上使用对象结构分解,并在结果上使用了属性简写,以使代码更简洁。现在我们可以将其映射到各种类别的东西上:

const results = [
   ...mobilePhones.map(processItem('phone')),
   ...cosmetics.map(processItem('cosmetics')),
   ...books.map(processItem('book')),
];

如果您出于其他目的需要临时结果,只需将它们填充到vars中即可,但是为了简单起见,我将它们直接分散到结果数组中。

尽管比您为代码质量帽子戏法发布的内容更短,更清晰,更灵活,但我想重申一下,我看到的方式比您发布的功能还差。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章