猿问

什么时候重用函数?

我的程序中有一个生成随机字符串的函数。

func randString(s []rune, l int) string

s是包含字符串中可能字符的符文切片。我传入了大写和小写字母字符的符文切片。l 确定字符串的长度。这很好用。但我还需要为 html 颜色代码生成随机的十六进制字符串。

似乎所有消息来源都说重用代码是一种很好的编程习惯。所以我做了另一个[]rune持有[1-9a-f]并将其输入到randString. 那是在我意识到 stdlib 已经包含非常适合我的 int 类型的格式化动词之前。

在实践中,是重用我的randString函数还是编写一个单独的(更有效的)函数更好?我会生成一个随机整数和 Sprintf 它,而不必循环并生成 6 个随机整数randString


饮歌长啸
浏览 190回答 2
2回答

绝地无双

1) 如果标准库中有一个精确的解决方案,你应该总是选择使用它。因为:测试标准库。所以它做它所说的(或我们期望它做的)。即使其中存在错误,它也会被(您或其他人)发现并且无需您的工作/努力即可修复。标准库是用惯用的 Go 编写的。与您可以编写的解决方案相比,即使它比您需要的多一点,它也有可能更快。标准库正在(或可能)随着时间的推移而改进。您的程序可能会变得更快,因为在新的 Go 版本中改进了实现,而无需您的任何努力。提供了解决方案(这意味着它已准备就绪,不需要您花时间)。标准库是众所周知的,因此您的代码将更容易被其他人和您以后理解。如果您已经导入了包(或将在不久的将来导入),这意味着由于库是静态链接的,因此开销为零或最小,因此您需要的函数已经链接到您的程序(到编译后的可执行二进制文件)。2)如果标准库提供了解决方案,但它是类似问题的通用解决方案和/或提供的超出您的需要:这意味着它更有可能不是您的最佳解决方案,因为它可能会像您的解决方案一样使用更多内存和/或工作得更慢。您需要决定是否愿意为了上面列出的收益而牺牲一点性能损失。这也取决于您需要使用它的方式和次数(例如,如果它是一次性的,则无关紧要,如果它处于非常频繁调用的无限循环中,则应仔细检查)。3)另一方面:如果标准库提供的解决方案不是为解决您的问题而设计的,则应避免使用该解决方案...如果碰巧它的“副作用”解决了你的问题:即使当前的实现是可以接受的,如果它是为其他东西设计的,未来的改进可能会使你对它的使用完全无用,甚至可能会破坏它。更不用说它会使其他试图阅读、改进或使用您的代码的开发人员感到困惑(经过一段时间后,您也包括在内)。

DIEA

这是相当主观的而不是特定于 go 的,但我认为您不应该仅仅为了重用而重用代码。您重用的代码越多,您在应用程序的不同部分之间创建的依赖关系就越多,因此维护和修改变得更加困难。易于理解和修改代码更为重要,尤其是如果您在团队中工作。对于您的特定示例,我将执行以下操作。如果在您的包/应用程序中只生成一次随机颜色,则使用fmt.Sprintf("#%06x", rand.Intn(256*256*256))非常好(如 Dave C 所建议的)。如果在多个地方生成随机颜色,我会创建函数func randColor() string并调用它。请注意,现在您可以根据randColor自己的喜好优化实现,而无需更改其余代码。例如,您可以先randColor使用 using实现randString,然后再切换到更高效的实现。
随时随地看视频慕课网APP

相关分类

Go
我要回答