【问题标题】:Should F# type annotations be removed when refactoring?重构时是否应该删除 F# 类型注释?
【发布时间】:2012-09-02 09:54:12
【问题描述】:

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

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

我希望这可能取决于我正在谈论的功能类型。例如,它可能对私有函数有意义,但对公共函数没有意义。

【问题讨论】:

    标签: f# refactoring type-inference


    【解决方案1】:

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

    1. 类型注释可以说是一种经过编译器检查的文档。
    2. 不要无故修改工作代码。
    3. 编译时可能需要一些类型注释,在这种情况下,为了保持一致性,保留所有类型注释而不是仅删除不必要的注释可能更有意义。

    不过,另一方面,也有一些令人信服的理由来删除它们:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        您很可能最终还是会重新输入注释,原因与您最初添加注释的原因完全相同。

        【讨论】:

          【解决方案4】:

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

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

          如果类型注释被移除,类型推断工作不受限制,但测试还没有准备好,他们仍然只用MyType进行测试。

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

          【讨论】:

          • 这是一个非常有趣的观点,我从 TDD 的角度没有想到它。先写测试意味着当我只想帮助自己的时候不需要注释。
          【解决方案5】:

          这是个人风格的问题;我会把它们拿出来。随着您在 F# 编码方面的进步,您可能会发现您不必经常经历注释阶段。

          【讨论】:

            猜你喜欢
            • 2020-04-12
            • 2018-12-28
            • 1970-01-01
            • 2017-10-02
            • 1970-01-01
            • 2011-11-02
            • 1970-01-01
            • 2013-01-05
            • 1970-01-01
            相关资源
            最近更新 更多