【问题标题】:Does the `replace()` method of the String class violates Command-Query Separation?String 类的 `replace()` 方法是否违反命令-查询分离?
【发布时间】:2012-01-23 23:19:18
【问题描述】:

命令查询分离建议每个方法要么是执行操作的命令,要么是向调用者返回数据的查询:

但是例如 String 类的 replace() 方法呢?

它的签名是:String replace(String str);

这违反了CQS,不是吗?

承认它违反了,我不明白我们如何修复它,以便作为命令的 replace() 可以通知调用者最新的字符串。实际上,根据 CQS 的命令必须有一个 void 作为返回类型。

【问题讨论】:

  • 您有疑问,还是只是在观察?见stackoverflow.com/faq#dontask
  • 谁说 Java 甚至远程遵循 CQS?无论哪种方式,replace 都不会更改它被调用的字符串。

标签: java coding-style design-patterns


【解决方案1】:

我看不出它是如何违规的——肯定是一个查询,因为它提出了一个关于数据的问题:如果我们有原始字符串,但每次都用 X 而不是 Y,我们会得到什么?

就副作用而言,这显然不是一个命令——不可能,因为字符串是不可变的。

我不会声称自己是接近 CQS 方面的专家,但 String.replace 对我来说更像是一个查询而不是命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多