代码之家  ›  专栏  ›  技术社区  ›  Jarmund

调用私有方法的层次结构时,哪个方法应该更改字段?

  •  3
  • Jarmund  · 技术社区  · 10 年前

    当类的公共方法需要调用导致字段被更改的私有方法时,哪个方法应该更改字段?对此有什么共同的约定吗?一种方法优于另一种方法吗?

    考虑以下两个代码片段:

    public class boolHolder {
        private boolean theBool = false;
    
        public void doYourThing() {
            // Do a lot of other stuff
            setBool();
        }
    
        private void setBool() {
            // Do a lot of other stuff, justifying a private method for this
            this.theBool = true;
        }
    }
    

    public class boolHolder {
        private boolean theBool = false;
    
        public void doYourThing() {
            // Do a lot of other stuff
            theBool = setBool();
        }
    
        private boolean setBool() {
            // Do a lot of other stuff, justifying a private method for this
            return true;
        }
    }
    

    这两个片段当然是一个非常简单的例子,但我确信我不是唯一一个以公共方法调用私有方法树结尾的人。该字段应该设置在分支的末尾,还是应该传回一个值?

    3 回复  |  直到 10 年前
        1
  •  3
  •   Eran    10 年前

    我认为,只有一个地方可以设置字段的值,而且它应该是最后一个被调用的方法。它使代码更容易理解。您的第一段代码对我来说可读性更强。

    我认为,这是另一个支持这一约定的片段:

    假设我们有一个带有两个setter的int成员,一个接受int,另一个接受该int的String表示(例如,如果我们从XML字符串反序列化实例,则使用该表示)。

    int value;
    
    public void setIntField (String value) 
      throws SomeException
    {
        if (value == null)
            throw new SomeException();
        try {
            int val = Integer.parseInt (value);
            setIntField (val);
        }
        catch (NumberFormatException ex) {
            throw new SomeException();
        }
    }
    
    public void setIntField (int value)
        throws SomeException ()
    {
        if (value < MIN_ALLOWED || value > MAX_ALLOWED)
            throw new SomeException ();
        this.value = value;
    }
    
        2
  •  0
  •   John    10 年前

    除了重命名 theBool setBool 到了更容易理解的地方(我假设你在实际应用程序中是这样做的),我会选择第一个。使用单词的方法 set 预计将成为设定者,并没有多少人会期望返回值。

        3
  •  0
  •   user1708042    10 年前

    它变化不大,但可以尝试为方法使用更好的命名:我不喜欢将第二个方法命名为setBool()。

    如果你写“做很多其他的事情,证明一个私人方法是正确的”,你可以尝试将 动词 你做的那些事。 假设您更新了一个帐户状态,并且在完成后想要用布尔值表示状态,那么可以使用类似于您所做的操作,但要以有意义的方式调用它,例如updateAccount(),如果更新顺利,则返回true,或者将其设置在内部:

    public class boolHolder {
        private boolean accountUpdated = false;
    
        public void doYourThing() {
           // Do a lot of preliminary stuff
           updateAccount();
        }
    
       private void updateAccount() {
           // try to update account
           // if update went fine
           this.accountUpdated = true;
       }
    }
    

    public class boolHolder {
        private boolean accountUpdated = false;
    
        public void doYourThing() {
           // Do a lot of preliminary stuff
           this.accountUpdated = updateAccount();
        }
    
       private boolean updateAccount() {
           // try to update account
           // if error happens, rollback change and set
           return false;
           // else (update went fine)
           return true;
       }
    }
    

    两者都很好,但让你的方法告诉他们做什么,因为更新bool并不是主要的动作,因为你“做了很多其他的事情,证明这是一个私人方法”。

    如果像以前那样使用默认值为false,则内部的值设置会更加紧凑,但另一个值设置的作用更加明确。所以我倾向于这样:为你的操作返回一个结果。