2012-03-26 63 views
1

以功能風格設計程序時,我考慮設計一個在單個對象上運行的函數的基礎層。然後,如果我需要對這些對象的集合進行操作,那麼我將使用傳統的功能性膠水(如映射,過濾,縮小等)開始在該基礎層之上構建。以功能風格設計一個支持數據庫的應用程序

例如,可以說我擁有一個DB支持的應用程序具有用戶和任務,用戶分配任務。

我可能會這樣定義

def doesUserPerformTask?(taskId, userId) 
    // Go to DB to see if this userId does this taskId 
    // return userid if success or else nil 
end 

後來在路上,我給定用戶ID的列表,並想知道哪些人執行任務X.完美,我已經有功能的功能doesUserPerformTask?並且它已經在代碼中的其他地方進行了戰鬥測試,所以我可以映射到用戶標識列表併爲每個列表調用該函數,然後篩選結果。雖然這是功能設計的一個很大的好處,但我有一個效率問題,即傳遞給map的每個元素(即用戶id)都需要數據庫命中。我現在需要創建一個在userId列表上運行的全新函數。

我在設計功能風格的數據庫支持程序時遇到了這個問題,我一直不得不編寫新的函數,這些函數沒有構建基本的函數層,最終導致了許多專門爲這兩個函數編寫的函數在單個項目和項目集合上進行操作。

有沒有更好的方法來組織以功能風格編寫的DB支持的程序?

+1

此外*不做* *?有些事情不是FP的強項。儘管如此,狂熱。 – cHao 2012-03-26 18:13:54

+0

誰知道,也許當固態硬盤變得更便宜/更快/更大時,RAM /磁盤之間的邊界將變得更加模糊,性能處罰將消失,並且您提出的編程風格將會有意​​義。在此期間,緩存怎麼樣? – Eduardo 2012-03-26 18:22:51

回答

0

爲什麼不將實際對象傳遞給函數?

def doesUserPerformTask?(task, user) 
    // Check the user object directly 
    // return true or (false|nil) 
end 

然後寫一個包裝將從DB

def doesUserPerformTaskFromDB?(taksId, userId) 
    // DB calls here 
    if doesUserPerformTask?(task, user) ? user.id : nil 
end 

獲取用戶和任務然後再然後寫出集合

def whichUsersPerformTask?(task) 
    // fetch users from DB 
    // map non-db function over collection 
end 

的包裝,除非你打算使用那個用戶集合來做其他事情不是更好的依靠數據庫查詢來獲得你需要的用戶(通過任何一種查詢語言)嗎?似乎有幾個選項可以使這個既高效又幹燥。

相關問題