F#实例方法。。。它们是否应该返回一个新实例,而不是更改当前对象?

F#实例方法。。。它们是否应该返回一个新实例,而不是更改当前对象?,f#,immutability,F#,Immutability,问题在于实例方法究竟应该改变包含该方法的对象,还是应该返回一个新实例?我对F#和为F#建议的完全可交换性的概念是陌生的 现在只使用psuedo代码,除非我需要更具体一些 第一个想法是将消息添加到对象上的消息列表中: class Something ctr(messages) _messages.Add(messages) AddMessage(message) _messages.Add(message) 第二种方法是构造一个新列表,将旧列表和新消息连接起来。然后,我

问题在于实例方法究竟应该改变包含该方法的对象,还是应该返回一个新实例?我对F#和为F#建议的完全可交换性的概念是陌生的

现在只使用psuedo代码,除非我需要更具体一些

第一个想法是将消息添加到对象上的消息列表中:

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#的一个好处是,你可以根据自己的需要选择做什么;使用变异的代码本身并没有什么问题。以下是一些需要考虑的事项:

  • 有时,可变方法会带来更好的性能,特别是在单线程环境中使用时(但一定要测量现实场景以确保!)
  • 有时,不可变方法更适合在多线程场景中使用
  • 有时,您希望与更易于与非必需代码一起使用的库进行接口(例如,采用
    System.Action
    的API)
  • 你在一个团队工作吗?如果是,他们是否有经验的C#开发者?有经验的F#开发者?他们认为哪种代码最容易阅读(可能是可变风格)?您认为哪种代码最容易维护(可能是不可变的样式)
  • 你只是在练习吗?那么,练习不变的风格可能是值得的
退一步说,还有其他几点需要考虑:

  • 你真的需要一个实例方法吗?通常,在模块中使用let绑定函数更为惯用
  • 你真的需要一个新的命名类型吗?如果它只是一个薄薄的包装器,你可以直接考虑使用<代码>清单>代码> s。
      在我看来,答案取决于您的要求。不可变样式可能更为惯用,是一种合理的默认样式。然而,F#的一个好处是,你可以根据自己的需要选择做什么;使用变异的代码本身并没有什么问题。以下是一些需要考虑的事项:

      • 有时,可变方法会带来更好的性能,特别是在单线程环境中使用时(但一定要测量现实场景以确保!)
      • 有时,不可变方法更适合在多线程场景中使用
      • 有时,您希望与更易于与非必需代码一起使用的库进行接口(例如,采用
        System.Action
        的API)
      • 你在一个团队工作吗?如果是,他们是否有经验的C#开发者?有经验的F#开发者?他们认为哪种代码最容易阅读(可能是可变风格)?您认为哪种代码最容易维护(可能是不可变的样式)
      • 你只是在练习吗?那么,练习不变的风格可能是值得的
      退一步说,还有其他几点需要考虑:

      • 你真的需要一个实例方法吗?通常,在模块中使用let绑定函数更为惯用
      • 你真的需要一个新的命名类型吗?如果它只是一个薄薄的包装器,你可以直接考虑使用<代码>清单>代码> s。
      当您进行“基于类”的编程时,这是进行面向对象编程的一种方式(非常不幸),您将进行就地状态修改,而不是返回新状态(这是在进行OO时所期望的)

      如果您真的想实现不变性,那么我建议您需要使用更多的FP概念,如模块、函数(而不是基于类的编程中的方法)、递归数据类型等

      我的答案太笼统了,恰当的答案在于这样一个事实,即您的这个类将如何适应您的应用程序设计的大局。

      当您正在进行“基于类”的编程时,这是进行面向对象编程的一种方式(非常不幸),您将执行就地状态修改,而不是返回一个新状态(这是您在执行OO时所期望的)

      如果您真的想实现不变性,那么我建议您需要使用更多的FP概念,如模块、函数(而不是基于类的编程中的方法)、递归数据类型等

      我的答案太笼统了,恰当的答案在于这样一个事实:您的这个类将如何适应您的应用程序设计的大局