模块或类?

时间:2013-12-27 14:59:41

标签: f# functional-programming

鉴于这两种方法:

方法1

module DomainCRUD =
   let getWhere collection cond = ...

module DomainService =
   let getByCustomerId f customerId = 
      f(fun z -> z.CustomerId = customerId) 

// USAGE:  
let customerDomains = DomainCRUD.getWhere collection 
   |> DomainService.getByCustomerId customerId

方法2

type DomainCRUD(collection) =
   member x.GetWhere cond = ...

type DomainService(CRUD) =
   member x.GetByCustomerId customerId =
      CRUD.GetWhere(fun z -> z.CustomerId = customerId)

// USAGE:
let domainService = new DomainService(new DomainCRUD(collection))
let customerDomains = _domainService.GetByCustomerId(customerId)

哪种功能最适合函数式编程?我假设approach 1会,但每次调用DomainCRUD.GetWhere collection感觉有点多余。

哪个最灵活,最“可读”?

1 个答案:

答案 0 :(得分:3)

方法1,原因如下:

  1. 与类关联的函数不是curried,而是与模块关联的函数。这意味着您可以在模块中部分应用函数,以获得通常在OO代码中使用DI框架完成的操作。 (见丹尼尔的评论)
  2. 您只需DomainCRUD.GetWhere
  3. 即可省略模块资格open DomainCrud
  4. 除了打开模块外,您还可以使用[<AutoOpen>]或(相反)[<RequireQualifiedAccess>]进行标记,这样可以提供课程无法提供的额外灵活性。
  5. 基于模块的方法不那么冗长。