代码之家  ›  专栏  ›  技术社区  ›  Alex Gordon

神殿中神父服务的领域建模

f#
  •  1
  • Alex Gordon  · 技术社区  · 6 年前

    我试图通过尝试建模来实践我的领域建模 this 事件。

    把酒和细面粉一起 产品称为随附产品。只有细面粉 称为随餐供应。随餐供应 不必挥手,也不必被带到祭坛的角上,也不必被献上。 加上乳香。它需要盐,而且在外面燃烧 整个祭坛。

    酒倒在祭坛上。它不是倒在火上的。 相反,牧师应该举起手来,把它倒在 祭坛的底部,从那里,它降到什亭。

    我试图通过表达我们要处理的记录类型来简化:

    type AlterLocations = 
        | Outer
        | Corner
        | Base
    
    type AccompanyingOfferings = 
        | Wine
        | Flour
    
    type AccompanyingMealOfferings = 
        | FineFlour
    
    type Auxilary = 
        | Salt
        | Frankinsense
    
    type Offering =
        {
            Name: string
        }
    

    但是,我一直在为实际情况建模 事件 :

    type MealOffering = 
        {
            Offering:Offering
            Flour:AccompanyingMealOfferings
            Waved: bool
            RequiresSalt: bool
            OfferedWithFrankinse: bool
            ShouldBeBroughtToCorner: bool
            EntirelyBurnt: bool
        }
    

    我们如何表示可能具有多个标记/标志的类型?

    1 回复  |  直到 6 年前
        1
  •  3
  •   rmunn    6 年前

    你可以从 Argu 处理命令行参数并执行如下操作:

    type OfferingFlags =
        | Waved
        | RequiresSalt
        | OfferedWithFrankincense
        | ShouldBeBroughtToCorner
        | EntirelyBurnt
    

    然后 MealOffering 类型可能如下所示:

    type MealOffering = 
        {
            Offering: Offering
            Flour: AccompanyingMealOfferings
            Flags: OfferingFlags list
        }
    

    出现在列表中表示 false 值,列表中的标志表示 true 该标志的值。也就是说,要检查一个产品是否需要盐,您需要:

    offering.Flags |> List.contains RequiresSalt
    

    同献的素祭清单(需要盐,完全烧掉了,但确实烧掉了) 需要挥挥手,带到角落,或提供乳香),看起来像:

    [ RequiresSalt; EntirelyBurnt ]
    

    这种建模方法的优点是,无论有多少个标志,都可以添加一个新标志,而不必编辑 美食家 类型。这也可能是一个缺点,因为当您将每个标志单独建模为 bool ,任何时候添加一个新标志,编译器都会强制您在任何地方考虑它——而通过将其建模为一个du值列表,编译器不会强制您检查新标志 RequiresSomethingElse 在需要进行标记的地方标记。但是如果您认为已经添加了新标志,或者您添加的任何新标志也应该默认为 在大多数地方,然后 OfferingFlags list 方法通常是一个好方法。