领域建模圣殿中的牧师服务

时间:2019-01-15 21:16:59

标签: f#

我正在尝试通过对this事件进行建模来练习自己的域建模。

  

将葡萄酒和上等面粉与   产品被称为伴随产品。仅面粉是   称为随餐供应。附带的用餐优惠   不需要挥手,带到[祭坛的角落],也不需要[提供]   与]乳香。它需要盐,并在外部燃烧   祭坛的全部。

     

把酒倒在坛上。它没有倒在火上。   相反,牧师应举起双手,将其倒在[   坛的基础,然后从那里下降到shittin。

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

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 个答案:

答案 0 :(得分:3)

您可以从Argu处理命令行参数的方式中浏览一个页面,然后执行以下操作:

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

然后MealOffering类型看起来像这样:

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

列表中存在的标记 not 表示false值,列表中存在的标记表示该标记的true值。也就是说,要检查商品是否需要加盐,您可以这样做:

offering.Flags |> List.contains RequiresSalt

伴随提供餐食的清单(需要加盐,被完全烧掉,但不需要需要挥手,带到角落或用乳香提供)喜欢:

[ RequiresSalt; EntirelyBurnt ]

此建模方法的优点是,无论您拥有多少个标志,都可以添加新标志而无需编辑MealOffering类型。这也可能是一个缺点,因为当您将每个标志分别建模为bool时,每次添加新标志时,编译器都会迫使您到处考虑它-而通过将其建模为DU值列表,编译器不会强迫您在需要完成的地方检查新的RequiresSomethingElse标志。但是,如果您认为已经完成添加新标志,或者在大多数情况下添加的任何新标志也应该默认为false,那么OfferingFlags list方法通常是个好方法。