【问题标题】:Do if statements that call methods on an object modify the object?调用对象方法的 if 语句会修改对象吗?
【发布时间】:2017-11-11 14:42:36
【问题描述】:

我正在尝试对我的对象执行操作,但只有在某些事情为真时才这样做。我有几种被认为是“动作”方法的方法,它们执行一些尝试修改对象的动作,如果可以完成该动作,则返回真/假。

示例 1

Thing thing = new Thing();
if (thing.changeSomething()){
    if (thing.shouldDoSomething()){
        //do more things
    }
}

我知道复合布尔表达式,例如检查数字是否在有效值范围内

if(number>0 && number<=10)
    //number is valid

但是当子表达式是方法调用时并没有真正做太多

示例 2

if ( thing.changeSomething() && (thing.shouldDoSomething() ){
    //do more things
}

示例 2 是否与 示例 1 相同?
示例 2 会调用shouldDoSomething() 方法吗?因为我不希望这种情况发生,因为有时shouldDoSomething() 实际上会产生其他影响并改变对象的其他方面。

【问题讨论】:

  • 那么您说的是哪种语言?你标记了java和c#?我不知道 java 是否相同,但在 C# 中,if (a &amp;&amp; b) 中的表达式 b 仅在 atrue 时才被评估。因此,示例 2 中的 thing.shouldDoSomething() 只有在 thing.changeSomething() 返回 true 时才会被调用。
  • 由于欺诈,我投票决定将此问题作为题外话结束
  • 如果您打算根据对象的状态执行条件逻辑,您通常希望以一种不首先更改状态的方式公开该状态。确定是否应该执行某事的方法不必为了确定是否需要执行操作而更改其上下文对象的状态。我已经看到许多程序员在他们继承的代码中对此感到厌烦。这是一个应该避免的反模式。

标签: java c# if-statement methods conditional


【解决方案1】:

打电话

if (thing.changeSomething()){
    if (thing.shouldDoSomething()){

本质上等同于

if (thing.changeSomething() && thing.shouldDoSomething()){

我猜它们被翻译成完全相同的 IL。

然而,正如 cmets 中提到的,第二个方法只有在第一个计算结果为 true 时才会执行。如果&amp;&amp;-operator 的第一个操作数已经是false,则无需执行第二个操作数,因此如果changeSomething 已经返回false,则不会执行您的shouldDoSomething-方法。

顺便说一句。这适用于 Java 和 C#。

【讨论】:

    【解决方案2】:

    简单的答案及其归结为,这取决于 thing.changeSomething() 方法是否返回布尔值。如果不这样做,就会产生问题。很有可能定义这个方法来做某事并在它完成它应该做的事情后返回 true。在这种情况下,第二个示例将起作用。

    如果它不返回布尔值,您应该会看到一个错误,或者它可能不符合您的喜好。

    它应该在示例 2 中以这种方式调用该方法。我建议您这样做,因为您不希望这样创建用于获取对象信息的 getter() 和 checker() 方法不得不改变它。这也可以通过数据字段完成,具体取决于类结构。

    希望这更容易消化并有所帮助!

    【讨论】:

      【解决方案3】:

      在 Java 中,逻辑与运算符&amp;&amp; 是一个短路运算符,这意味着如果表达式的结果可以仅从左侧操作数确定,则不会计算右侧。具体来说,如果左侧计算结果为假,则整个表达式为假,不需要计算右侧来确定。

      在你的函数调用的情况下:

      if ( thing.changeSomething() && (thing.shouldDoSomething() ){
          //do more things
      }
      

      如果 thing.changeSomething() 返回 false,则不会调用 thing.shouldDoSomething(),因为无论此函数可能返回什么,表达式的计算结果都为 false。所以是的,以上等价于:

      if ( thing.changeSomething() ) {
          if (thing.shouldDoSomething() ){
              //do more things
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-03
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 2016-10-19
        相关资源
        最近更新 更多