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

时间:2012-09-02 09:54:13

标签: f# refactoring type-inference

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

然而,一旦函数完成,我很想删除参数的类型注释,因为它们很难看。这听起来像是一件合理的事吗?

我希望它可能取决于我所说的功能。例如,它可能对私有函数有意义,但对公共函数则没有意义。

5 个答案:

答案 0 :(得分:6)

我认为这取决于很多因素。这里有一些赞成留下注释的论据:

  1. 类型注释可以说是编译器检查文档的一种形式。
  2. 请勿在没有充分理由的情况下修改工作代码。
  3. 编译时可能需要一些类型注释,在这种情况下,保留所有类型注释可能是有意义的,而不是只删除不必要的注释以保持一致性。
  4. 然而,另一方面,还有一些令人信服的理由将其删除:

    1. 编译器实际上可能推断出更多通用类型,在这种情况下,您可以在更广泛的上下文中重用函数。
    2. 您的代码将更加简洁,您可能会发现它更具可读性。

答案 1 :(得分:4)

对于它的价值,我的个人风格是使用fsi文件维护公共模块接口的注释,并删除fs模块实现文件中的大多数注释(除非它们是从左到右类型推断所需的)。使用这种方案,改变模块接口是一个大问题,而改变其实现的成本则更低。

答案 2 :(得分:2)

没有。它没有任何优势。你可以说它使得程序之后更容易改变,或者它看起来更好,但在实践中它永远不会有效。

最有可能的是你最终还是会重新输入注释,原因与首先添加它们的原因完全相同。

答案 3 :(得分:2)

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

确实,我们假设有一个源代码:let f (arg: MyType) = arg.ToString() 来源将arg限制为MyType类型。如果任何客户端代码试图传递另一种类型的参数,则它将无法编译 这也适用于单元测试。使用类型注释,很容易看到所有单元测试仅使用类型为f的参数调用MyType

如果删除了类型注释,则类型推断工作不受限制,但测试尚未就绪,他们仅使用MyType对其进行测试。

因此,删除类型注释必须与更改单元测试相关联,与其他任何重构相同。如果您准备改进测试,那就去做吧。否则,您可能会遇到麻烦,特别是对于大型代码库。

答案 4 :(得分:0)

这是个人风格的问题;我会带他们出去。随着你在F#编码方面做得越来越好,你可能会发现你不必经常完成注释阶段。