什么时候重用功能?

时间:2015-08-03 20:31:53

标签: go

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

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

s是包含字符串中可能字符的符文片。我通过 在大写和小写字母字符的符文切片中。 l 确定字符串的长度。这非常有效。但我也需要 为html颜色代码生成随机十六进制字符串。

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

实际上,重用我的randString函数或单独编写代码是否更好 (效率更高)功能?我会生成一个随机int和Sprintf它 而不是必须循环并生成randString所做的6个随机整数。

2 个答案:

答案 0 :(得分:3)

1)如果标准库中有确切的解决方案,您应该总是选择使用它。

由于:

  • 测试标准库。所以它做了它所说的(或我们期望它做的)。即使它有一个错误,它也会被你或他人发现,并且会在没有你的工作/努力的情况下得到修复。
  • 标准库被写成惯用的Go。即使它比您所能提供的解决方案所需的更多,它的速度也会更快。
  • 标准库是(或可能)随着时间的推移而改进。您的程序可能会变得更快,因为新的Go版本中的实现得到了改进,而您没有任何努力。
  • 提供了解决方案(这意味着它已经准备就绪,您不需要时间)。
  • 标准库已广为人知,因此您的代码将更容易被其他人理解,稍后您也可以理解。
  • 如果您已经导入了包(或将在不久的将来),这意味着零或最小的开销,因为库是静态链接的,所以您需要的功能已经链接到您的程序(编译后的可执行文件)二进制)。

2)如果标准库提供了解决方案,但它是类似问题的一般解决方案和/或提供的不仅仅是您需要的解决方案:

  • 这意味着它可能不是您的最佳解决方案,因为它可能会使用更多内存和/或工作速度更慢,因为您的解决方案可能会如此。
  • 你需要决定是否愿意为上面列出的收益牺牲那么小的性能损失。这也取决于你需要使用它的次数和次数(例如,如果它是一次性的,它不应该是重要的,如果它在非常频繁的无限循环中,它应该是仔细检查)。

3)另一方面:如果没有设计解决方案来解决您的问题,您应该避免使用标准库提供的解决方案......

  • 如果它恰好发生了它的副作用"解决你的问题:即使当前的实现是可以接受的,如果它是为其他东西设计的,未来的改进可能会使你的使用完全无用甚至可能破坏它。
  • 更不用说它会让其他想要阅读,改进或使用您的代码的开发人员感到困惑(包括在一段时间后)。

作为旁注:这个问题正是您尝试创建的功能:How to generate a random string of a fixed length in golang?我提出了多种非常有效的解决方案。

答案 1 :(得分:1)

这是相当主观的,而不是特定的,但我认为你不应该仅仅为了重用而重用代码。您重用的代码越多,您在应用程序的不同部分之间创建的依赖关系就越多,因此维护和修改变得更加困难。易于理解和修改代码更为重要,尤其是如果您在团队中工作。

对于您的具体示例,我会执行以下操作。

如果在包装/应用程序中只生成一次随机颜色,则使用fmt.Sprintf("#%06x", rand.Intn(256*256*256))完全没问题(正如Dave C所建议的那样)。

如果在多个地方生成随机颜色,我会创建函数func randColor() string并调用它。请注意,现在您可以根据需要优化randColor实现,而无需更改其余代码。例如,您最初可以使用randColor实施randString,然后在以后切换到更有效的实施。