2012-03-26 27 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 

的包装,除非你打算使用那个用户集合来做其他事情不是更好的依靠数据库查询来获得你需要的用户(通过任何一种查询语言)吗?似乎有几个选项可以使这个既高效又干燥。

相关问题