重构时是否应该删除F#类型注释?
如果我在函数被用于任何地方之前编写函数,我会发现在其参数中添加类型注释很有用。这意味着我可以自动完成它的值,并且(特别是作为一个F#新手)不会被意外的类型推断弄糊涂 但是,一旦函数完成,我就会删除参数的类型注释,因为它们很难看。这样做听起来合理吗重构时是否应该删除F#类型注释?,f#,refactoring,type-inference,F#,Refactoring,Type Inference,如果我在函数被用于任何地方之前编写函数,我会发现在其参数中添加类型注释很有用。这意味着我可以自动完成它的值,并且(特别是作为一个F#新手)不会被意外的类型推断弄糊涂 但是,一旦函数完成,我就会删除参数的类型注释,因为它们很难看。这样做听起来合理吗 我想这可能取决于我所说的函数类型。例如,它可能对私有函数有意义,但对公共函数没有意义。不。它没有任何优势。你可以说它使程序更容易在事后更改,或者看起来更好,但实际上它永远不会成功 最有可能的是,你最终还是会重新键入注释,原因与你当初添加注释的原因完全相
我想这可能取决于我所说的函数类型。例如,它可能对私有函数有意义,但对公共函数没有意义。不。它没有任何优势。你可以说它使程序更容易在事后更改,或者看起来更好,但实际上它永远不会成功
最有可能的是,你最终还是会重新键入注释,原因与你当初添加注释的原因完全相同。这是个人风格的问题;我会把它们拿出来。随着F#编码技术的提高,你可能会发现你不得不减少注释阶段的次数。我认为这取决于很多因素。以下是一些支持保留注释的论点:
值得一提的是,我的个人风格是使用fsi文件维护公共模块接口的注释,并删除fs模块实现文件中的大多数注释(除非从左到右类型推断需要注释)。使用此方案,更改模块接口是一件大事,更改其实现则是一件小事。我认为,这里的一个重要论点是,删除类型注释会更改源代码的含义 实际上,让我们假设有一个源代码:
let f(arg:MyType)=arg.ToString()
源限制
arg
的类型为MyType
。如果任何客户端代码试图传递另一种类型的参数,它将无法编译。这也适用于单元测试。通过类型注释,很容易看出所有单元测试只使用类型为
MyType
的参数调用f
如果删除了类型注释,则类型推断工作不受限制,但测试尚未准备就绪,它们仍然只使用MyType
对其进行测试
因此,删除类型注释必须与更改单元测试相关联,与任何其他重构一样。如果你已经准备好改进测试,那就去做吧。否则,您可能会自找麻烦,尤其是对于大型代码库。这是一个非常有趣的观点,我没有从TDD的角度考虑这一点。首先编写测试将意味着当我只想帮助自己时,我不需要注释。