Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#-纯功能设计而非oop设计_F#_Functional Programming_Domain Driven Design - Fatal编程技术网

F#-纯功能设计而非oop设计

F#-纯功能设计而非oop设计,f#,functional-programming,domain-driven-design,F#,Functional Programming,Domain Driven Design,我想创建一个由三个代理组成的简单的“多代理”系统。对于每个代理,都会创建一个封装邮箱处理器的类型。所有代理(位置、id等)和功能(sendMessage、move)都有共同的属性,并且代理因邮箱处理器的实现(邮件的处理方式)而不同。此外,它们可能因特定代理的其他功能而有所不同。每个代理还应该包含(作为其属性之一)将向其发送消息的其他代理的列表。这是一个非常简单的模型,我计划在此基础上使用F#中的邮箱处理器 在OOP中,这意味着创建一个代理接口(或抽象类),所有特定的代理都将通过自己的实现从该接口

我想创建一个由三个代理组成的简单的“多代理”系统。对于每个代理,都会创建一个封装邮箱处理器的类型。所有代理(位置、id等)和功能(sendMessage、move)都有共同的属性,并且代理因邮箱处理器的实现(邮件的处理方式)而不同。此外,它们可能因特定代理的其他功能而有所不同。每个代理还应该包含(作为其属性之一)将向其发送消息的其他代理的列表。这是一个非常简单的模型,我计划在此基础上使用F#中的邮箱处理器

在OOP中,这意味着创建一个代理接口(或抽象类),所有特定的代理都将通过自己的实现从该接口继承


我知道OOP在F#中是可能的,但是我宁愿坚持纯功能设计。然而,在我看来,OOP是这种情况下最合适的方法。如果你能给我一些关于功能设计的想法,我会很高兴的?多谢各位

您为什么要坚持纯功能设计?F#允许函数和OOP原则的干净组合,我将利用这两种机制并利用语言的强大功能


如果您想将函数和OOP方面结合起来,我将首先使您的对象不可变。因此,您使用的是对象,但使用的是功能范例。

您提出了一个OOD,OOP解决方案看起来是最自然的,这是否令人惊讶

如果你在重写设计描述时考虑到了流程和数据转换,那么它自然会变成FP设计,而且在有很多“er类”的OO中听起来非常尴尬。事实上,对数据类型或需要进行的转换几乎没有任何描述。乍一看,我认为代理是三个参数的函数:邮箱、消息处理程序(或消息处理程序列表)和要联系的其他代理的邮箱列表。如果将来的分派基于消息,那么消息处理程序是两个参数的函数。邮件和邮箱列表。

首先,F#中的功能风格和面向对象风格实际上并不冲突

  • 函数风格包括使用不可变类型、无副作用的纯函数和F#数据类型,如有区别的联合、函数等

  • 面向对象风格更关注于如何组织代码(使用类和接口),但代码仍然可以是纯功能性的,而不使用任何可变状态

在基于代理的系统中,在代理的实现中使用函数式是很有意义的,但是使用类来组织代理。我认为这可能是F#的最佳实践(另见)

在您的示例中,您是说一个代理保留一个它向其发送消息的其他代理的列表。有几个备选方案值得考虑(如果您想避免接口):


  • 公开一个F#事件(
    event)我知道F#结合了这两种范式。然而,我的动机是找出在每种范式中可以如何做各种事情,并且给出的场景一开始就足够简单(但是是通用的,也可以用于其他场景)。我只想在本例中使用带有模式匹配的歧视联合和记录。谢谢你,托马斯。我喜欢揭露事件的想法。