繁体   English   中英

Ramda.js重构

[英]Ramda.js refactoring

我决定使用Ramda编写一个简单的todo应用程序,但是我一直陷入与重构相关的问题。 我认为可以重构以下两个函数:

const isItemCompleted = R.pipe(
    R.prop("states"),
    R.contains("completed")
)

const isItemEdited = R.pipe(
    R.prop("states"),
    R.contains("editing")
);

如您所见,有一些代码重复,如果我有更多的状态,这将变得更加混乱。 我一直在尝试隔离重复的功能,例如:

const statesContains = R.flip(R.pipe(
    R.prop('states'),
    R.contains()
))

//I would like to use it like this:
const isItemCompleted = statesContains("completed")
const isItemEdited = statesContains("editing")

但是我只是无法解决这个问题。 我可以使它使用不同的参数顺序,但是我想遵循后数据规则创建简洁的函数。

传递给这些isItemCompleted和isItemEdited函数的数据可能是这样的:

let item = {states:["editing", "complete"]};
isItemCompleted(item); //true

有(实用的)想法吗?

有几种方法可以解决这个问题。

也许最直接的是

const statesContains = R.curry(
  (state, item) => R.contains(state, R.prop('states', item))
);

const isItemCompleted = statesContains("completed");

但是合理地将此抽象一下,以使搜索的属性也可以变化。 所以你可以这样写:

const propContains = R.curry(
  (propName, state, item) => R.contains(state, R.prop(propName, item))
);

const editorsContains = propContains('editors')
const edFred = editorsContains('fred');

// or edFred = propContains('editors', 'fred');

这两个都是合理的。 但Ramda有一个函数读取非常好,并且将服务于这些需求相当好, where 这样,您可以简单地编写:

const isItemCompleted = R.where({states: R.contains('completed')});

我认为,这是您一次过的最简单的方法。 但是以上两种都可以帮助您创建可重用的函数。

您可以在Ramda REPL中看到所有这些操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM