dsi*_*cha 2 language-agnostic testing singleton encapsulation tradeoff
我经常在这里听到测试驱动的开发人员,有一个函数隐含地获取大量信息是一件坏事.我可以看到,从测试的角度来看,这会是不好的,但从封装的角度来看,它有时是不是必要吗?我想到以下问题:
使用Random和OrderBy是一个很好的shuffle算法吗?
基本上,有人想在C#中创建一个函数来随机地移动一个数组.有几个人告诉他应该将随机数生成器作为参数传入.这似乎是对我的一种严重违反封装,即使它确实使测试更容易.数组混洗算法除了数组之外是否需要任何状态,而不是调用者不应该关心的实现细节?获取此信息的正确位置是不是可能来自线程本地单例?
Jon*_*eet 10
我不认为它破坏了封装.数组中唯一的状态是数据本身 - "随机源"本质上是一种服务.为什么阵列自然会有相关的随机源?为什么那必须是一个单身人士?那些有不同要求的不同情况怎么样 - 例如速度与加密安全随机性?有一个原因是为什么java.util.Random有一个SecureRandom子类:)也许无关紧要的是,shuffle的结果是否可以通过大量的努力和观察来预测 - 或许它确实如此.这将取决于上下文,这是shuffle算法不应该关心的信息.
一旦你开始把它想象成一个服务,那么它作为一个依赖项传入是有意义的.
是的,你可以从线程本地单例中获取它(事实上我将在接下来的几天内准确地写博客),但我通常会对其进行编码,以便调用者做出决定.
"随机性即服务"概念的一个好处是它具有可重复性 - 如果您的测试失败了,您可以Random使用特定的种子传递,并且知道您将始终获得相同的结果,这使得调试更容易.
当然,总是可以选择Random使用 - 如果调用者不提供自己的,则使用线程本地单例作为默认值.