重构时是否应该删除F#类型注释?

重构时是否应该删除F#类型注释?,f#,refactoring,type-inference,F#,Refactoring,Type Inference,如果我在函数被用于任何地方之前编写函数,我会发现在其参数中添加类型注释很有用。这意味着我可以自动完成它的值,并且(特别是作为一个F#新手)不会被意外的类型推断弄糊涂 但是,一旦函数完成,我就会删除参数的类型注释,因为它们很难看。这样做听起来合理吗 我想这可能取决于我所说的函数类型。例如,它可能对私有函数有意义,但对公共函数没有意义。不。它没有任何优势。你可以说它使程序更容易在事后更改,或者看起来更好,但实际上它永远不会成功 最有可能的是,你最终还是会重新键入注释,原因与你当初添加注释的原因完全相

如果我在函数被用于任何地方之前编写函数,我会发现在其参数中添加类型注释很有用。这意味着我可以自动完成它的值,并且(特别是作为一个F#新手)不会被意外的类型推断弄糊涂

但是,一旦函数完成,我就会删除参数的类型注释,因为它们很难看。这样做听起来合理吗


我想这可能取决于我所说的函数类型。例如,它可能对私有函数有意义,但对公共函数没有意义。

不。它没有任何优势。你可以说它使程序更容易在事后更改,或者看起来更好,但实际上它永远不会成功


最有可能的是,你最终还是会重新键入注释,原因与你当初添加注释的原因完全相同。

这是个人风格的问题;我会把它们拿出来。随着F#编码技术的提高,你可能会发现你不得不减少注释阶段的次数。

我认为这取决于很多因素。以下是一些支持保留注释的论点:

  • 类型注释可以作为编译器检查文档的一种形式
  • 没有充分的理由不要修改工作代码
  • 某些类型注释可能是编译所必需的,在这种情况下,为了保持一致性,最好保留所有类型注释,而不是只删除不必要的类型注释
  • 然而,另一方面,也有一些令人信服的理由删除它们:

  • 编译器实际上可能推断出更一般的类型,在这种情况下,您可以在更广泛的上下文中重用函数
  • 您的代码将更简洁,您可能会发现更可读

  • 值得一提的是,我的个人风格是使用fsi文件维护公共模块接口的注释,并删除fs模块实现文件中的大多数注释(除非从左到右类型推断需要注释)。使用此方案,更改模块接口是一件大事,更改其实现则是一件小事。

    我认为,这里的一个重要论点是,删除类型注释会更改源代码的含义

    实际上,让我们假设有一个源代码:
    let f(arg:MyType)=arg.ToString()

    源限制
    arg
    的类型为
    MyType
    。如果任何客户端代码试图传递另一种类型的参数,它将无法编译。
    这也适用于单元测试。通过类型注释,很容易看出所有单元测试只使用类型为
    MyType
    的参数调用
    f

    如果删除了类型注释,则类型推断工作不受限制,但测试尚未准备就绪,它们仍然只使用
    MyType
    对其进行测试


    因此,删除类型注释必须与更改单元测试相关联,与任何其他重构一样。如果你已经准备好改进测试,那就去做吧。否则,您可能会自找麻烦,尤其是对于大型代码库。

    这是一个非常有趣的观点,我没有从TDD的角度考虑这一点。首先编写测试将意味着当我只想帮助自己时,我不需要注释。