在设计功能样式的程序时,我考虑设计一个对单个对象进行操作的基础层。然后,如果我需要操作这些对象的集合,我开始使用传统的功能性胶水(如映射,过滤,缩小等)在该基础层之上构建。
例如,假设我有一个拥有用户和任务的数据库支持的应用程序,其中为用户分配了任务。
我可能有一个定义为
的函数def doesUserPerformTask?(taskId, userId)
// Go to DB to see if this userId does this taskId
// return userid if success or else nil
end
稍后,我会获得一个用户ID列表,并想知道哪些用户ID执行任务X.完美,我已经拥有了doesUserPerformTask?
功能,并且已经在其他地方进行了战斗测试代码,所以我可以映射用户ID列表并为每个代码调用该函数,然后过滤结果。
虽然这是功能设计的一大好处,但我有一个效率问题,即传递给地图的每个元素(即用户ID)都需要数据库命中。我现在需要创建一个在userId列表上运行的全新函数。
在设计功能样式的DB支持的程序时,我一直遇到这个问题,我不得不编写新的函数,这些函数不构建基本的函数层,最后是大量专门为这两个函数编写的函数。关于单件物品和物品集合。
有没有更好的方法来组织以功能样式编写的DB支持的程序?
答案 0 :(得分: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
然后再说一遍,除非你打算将那个用户集合用于其他东西,否则最好依靠数据库查询来获取你需要的用户(通过任何查询语言)?似乎有一些选项可以使它既高效又干燥。