我的應用程式中有不同的方法來獲取用戶:
1. Fetch international users
2. Fetch users from same region
3. Fetch users from same city
目前,我為每個方法實作了一種方法:
const fetchIntenationalUsers = async (limit = 10) => {
const result = await db.collection("users").limit(limit).get();
...
return parseUsers(result);
}
const fetchSameRegionUsers = async (region, limit = 10) => {
const result = await db.collection("users").where("region", "==", region).limit(limit).get();
...
return parseUsers(result);
}
const fetchSameCityUsers = async (city, limit = 10) => {
const result = await db.collection("users").where("city", "==", city).limit(limit).get();
...
return parseUsers(result);
}
我想創建一個通用的方法,如:
const fetchUsers = (queryType = "international", location = {}, limit = 10) => {
const queries = {
"international": db.collection("users"),
"region": db.collection("users").where("region", "==", location.region),
"city": db.collection("users").where("city", "==", location.city),
};
const result = await queries[queryType].limit(limit).get();
...
return parseUsers(result);
}
但我不確定這是反模式還是設計模式。還有其他方法嗎?
uj5u.com熱心網友回復:
一般的想法對我來說看起來不錯,但有一個問題:這一行:
const queries = {
"international": db.collection("users"),
"region": db.collection("users").where("region", "==", location.region),
"city": db.collection("users").where("city", "==", location.city),
};
創建物件時,您將呼叫所有這些資料庫方法,而不僅僅是您需要的方法。(您也沒有處理由未使用的方法引發的可能錯誤。)
稍作調整,請考慮回傳查詢的函式。你也可以db.collection('users')提前做。
const users = db.collection("users");
const queries = {
international: () => users,
region: () => users.where("region", "==", location.region),
city: () => users.where("city", "==", location.city),
};
const result = await queries[queryType]().limit(limit).get();
uj5u.com熱心網友回復:
是的,我認為將它們放在一個“通用”方法中并引入該queryType列舉是一種反模式。將來你會得到越來越多的查詢型別,它會在那個上帝的方法中造成巨大的混亂。(此外,它具有@CertainPerformance 的回答中提到的缺點)。
相反,我建議保留單獨的函式(可以單獨呼叫),但將代碼的重復部分抽象為一個抽象輔助函式:
async function fetchUsers(addCondition, limit = 10) {
const query = addCondition(db.collection("users")).limit(limit);
const result = await query.get();
…
return parseUsers(result);
}
export const fetchInternationalUsers = (limit) =>
fetchUsers(q => q, limit);
export const fetchSameRegionUsers = (region, limit) =>
fetchUsers(q => q.where("region", "==", region), limit);
export const fetchSameCityUsers = async (city, limit) =>
fetchUsers(q => q.where("city", "==", city), limit);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/353640.html
標籤:javascript 设计模式 ecmascript-6
