介紹
想象一下 10 種不同的功能:
const a = async (uid, data) => { ... };
const b = async (uid, data) => { ... };
const c = async (uid, data) => { ... };
const d = async (uid, data) => { ... };
const e = async (uid, data) => { ... };
const f = async (uid, data) => { ... };
const g = async (uid, data) => { ... };
const h = async (uid, data) => { ... };
const i = async (uid, data) => { ... };
const j = async (uid, data) => { ... };
和 4 個不同的鍵:
"key1", "key2", "key3", "key4"
我創建了以下物件:
const OBJECT = { // constant, will always look like this
key1: [a, b, c, d, e, f, h, i, j],
key2: [a, b, c, d, f, i, j],
key3: [a, b, c, d, e, f, g, h, i, j],
key4: [a, b, c, d, e, f, h, i, j],
}
我將按如下方式使用它:
const uid = uuid.v4();
const dynamicData = { // can contains any key (key1, key2, key3, key4)
key1,
key2,
};
let selectedMethods = [];
Object.keys(dynamicData).forEach((key) => {
if (key in OBJECT) {
selectedMethods.push(...OBJECT[key]);
}
});
// Uniquefy the list using lodash
selectedMethods = _.uniq(selectedMethods);
const promises = selectedMethods.map(
(method) => method(uid, dynamicData)
);
await Promise.all(promises);
問題
這段代碼不是很干凈......正如你所看到的,我在初始化陣列物件時重復了很多東西(看起來像一個原始實作)。
如何更改初始化它的方式?此外,如您所見,不同的方法引數中有一個模式(它們都接受相同的東西)。那么,如果你認為可以讓這段代碼少一些意大利面,我該怎么做呢?
uj5u.com熱心網友回復:
您可以將重復的部分提取到輔助變數中并將其傳播到相應的陣列文字中:
const abcd = [a, b, c, d];
const ef = [e, f];
const ij = [i, j];
const OBJECT = {
key1: [...abcd, ...ef, h, ...ij],
key2: [...abcd, f, ...ij],
key3: [...abcd, ...ef, g, h, ...ij],
key4: [...abcd, ...ef, h, ...ij],
}
但是,您應該只在語意上有意義的情況下執行此操作。如果ef在您的業務領域中沒有進一步的含義,則可能是巧合的重復,如果使用站點可能獨立更改,則實際上作業量更大。不必要的抽象也使代碼更難理解。
另一種可能可行的方法是將公共前綴和后綴放入輔助函式中:
const value = middle => [a, b, c, d, ...middle, i, j];
const OBJECT = {
key1: value([e, f, h]),
key2: value([f]),
key3: value([e, f, g, h]),
key4: value([e, f, h]),
}
您不妨將它們OBJECT完全洗掉,并始終將它們添加到selectedMethods串列中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488636.html
標籤:javascript 算法 重构
上一篇:在Java中從字串中洗掉一個字符
