F#实例方法。。。它们是否应该返回一个新实例,而不是更改当前对象?
问题在于实例方法究竟应该改变包含该方法的对象,还是应该返回一个新实例?我对F#和为F#建议的完全可交换性的概念是陌生的 现在只使用psuedo代码,除非我需要更具体一些 第一个想法是将消息添加到对象上的消息列表中:F#实例方法。。。它们是否应该返回一个新实例,而不是更改当前对象?,f#,immutability,F#,Immutability,问题在于实例方法究竟应该改变包含该方法的对象,还是应该返回一个新实例?我对F#和为F#建议的完全可交换性的概念是陌生的 现在只使用psuedo代码,除非我需要更具体一些 第一个想法是将消息添加到对象上的消息列表中: class Something ctr(messages) _messages.Add(messages) AddMessage(message) _messages.Add(message) 第二种方法是构造一个新列表,将旧列表和新消息连接起来。然后,我
class Something
ctr(messages)
_messages.Add(messages)
AddMessage(message)
_messages.Add(message)
第二种方法是构造一个新列表,将旧列表和新消息连接起来。然后,我将创建一个新的实例altogther并发回
class Something
ctr(messages)
_messages.Add(messages)
AddMessage(message)
newMessageList = _messages.Join(message)
return new Something(newMessageList)
我是否过度考虑了不变性?在我看来,答案取决于您的需求。不可变样式可能更为惯用,是一种合理的默认样式。然而,F#的一个好处是,你可以根据自己的需要选择做什么;使用变异的代码本身并没有什么问题。以下是一些需要考虑的事项:
- 有时,可变方法会带来更好的性能,特别是在单线程环境中使用时(但一定要测量现实场景以确保!)
- 有时,不可变方法更适合在多线程场景中使用
- 有时,您希望与更易于与非必需代码一起使用的库进行接口(例如,采用
的API)System.Action
- 你在一个团队工作吗?如果是,他们是否有经验的C#开发者?有经验的F#开发者?他们认为哪种代码最容易阅读(可能是可变风格)?您认为哪种代码最容易维护(可能是不可变的样式)
- 你只是在练习吗?那么,练习不变的风格可能是值得的
- 你真的需要一个实例方法吗?通常,在模块中使用let绑定函数更为惯用
- 你真的需要一个新的命名类型吗?如果它只是一个薄薄的包装器,你可以直接考虑使用<代码>清单>代码> s。
- 在我看来,答案取决于您的要求。不可变样式可能更为惯用,是一种合理的默认样式。然而,F#的一个好处是,你可以根据自己的需要选择做什么;使用变异的代码本身并没有什么问题。以下是一些需要考虑的事项:
- 有时,可变方法会带来更好的性能,特别是在单线程环境中使用时(但一定要测量现实场景以确保!)
- 有时,不可变方法更适合在多线程场景中使用
- 有时,您希望与更易于与非必需代码一起使用的库进行接口(例如,采用
的API)System.Action
- 你在一个团队工作吗?如果是,他们是否有经验的C#开发者?有经验的F#开发者?他们认为哪种代码最容易阅读(可能是可变风格)?您认为哪种代码最容易维护(可能是不可变的样式)
- 你只是在练习吗?那么,练习不变的风格可能是值得的
- 你真的需要一个实例方法吗?通常,在模块中使用let绑定函数更为惯用
- 你真的需要一个新的命名类型吗?如果它只是一个薄薄的包装器,你可以直接考虑使用<代码>清单>代码> s。