假设我在全球商店中有很多实体
如果我想使用函数getAppleJuicePrice,我可以用2-3种方式完成
通过参数
function getAppleJuicePrice(apples, juices) {
return apples * juices; // Some computing
}
通过getState,没有参数
function getAppleJuicePrice() {
return (dispatch, getState) => {
const {apples, juices} = getState();
return apples * juices; // Some computing
}
}
通过getState和参数
function getAppleJuicePrice(applesParam, juicesParam){
return (dispatch, getState) => {
const apples = applesParam || getState().apples;
const juices = juicesParam || getState().juices;
return apples * juices; // Some computing
}
}
*如果是2,3,我需要发送函数
你能否告诉我你的建议
A)功能1,2,3 - 以这种方式可以吗?或者其中一些更好?
B)架构(我的意思是我们在全局商店中有很多实体,所以我们甚至可以创建依赖它们的函数)
答案 0 :(得分:0)
我强烈反对例如#1。
此功能纯粹,具有描述性,不依赖于外部知识。假设您已经可以访问状态,那么几乎总是更好地导出您所追求的值而不是直接请求状态。
如果那是不可能的,那么将数据检索分解为第二个函数,然后将值传递给第一个函数。这样你就可以清楚地分离关注点,你的方法很容易理解,你不依赖于副作用(状态值的存在),这两种方法都应该很容易测试。
天啊,你可以再进一步重构功能1,作为比较/组合无论的价格的通用实用工具,而不仅仅是苹果和果汁。
const stateObject = getState() // At top of whatever scope
// Generic, no side-effects
function processPrice (x, y) {
return x * y; // Whatever processing
}
// Specific, injected dependency on state
function getAppleJuicePrice (state) {
const { apples, juice } = state;
return processPrice(apples, juice);
}
// Explicit value assignment
const appleJuicePrice = getAppleJuicePrice(stateObject)
快速评论商店架构:始终致力于尽可能保持简单,扁平和数据相关。为了方便计算价值,避免危及商店的数据结构。你可以在本地(而且很容易)得到任何你应该这样做的东西。商店不是复杂价值突变的地方。
(* preemptive 这不是一个严格的规则,只是一个指南)