簡體   English   中英

在調用私有方法的層次結構時,哪種方法應該改變字段?

[英]Which method should change the field, when calling a hierarcy of private methods?

當類的公共方法需要調用導致字段被更改的私有方法時,哪個方法應該更改字段? 對此有什么共同的約定嗎? 一種方法優於另一種方法嗎?

請考慮以下兩個代碼段:

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;
    }
}

VS

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;
    }
}

這兩個剪輯當然是一個非常簡單的案例,但我確信我不是唯一一個以公共方法調用私有方法的大樹的人。 字段應該設置在分支的末尾,還是應該傳回一個值?

我認為更有意義的是,只有一個地方會設置字段的值,它應該是被調用的最后一個方法。 它使代碼更容易理解。 你的第一個代碼片段對我來說看起來更具可讀性。

這是我認為支持這個約定的另一個片段:

假設我們有一個帶有兩個setter的int成員 - 一個接受一個int而另一個接受該int的String表示(例如,如果我們從XML String反序列化一個實例)。

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;
}

除了將theBoolsetBool重命名為更容易理解的東西(我將假設你在實際應用程序中做了),我會選擇第一個。 具有單詞set方法應該是設置者,並且沒有多少人期望返回值。

它沒有太大變化,但你可以嘗試為你的方法使用更好的命名:我不喜歡你命名你的第二個方法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,則內部的值設置會更緊湊,但另一個更明確的是它的作用。 所以我傾向於這樣做:為你的操作返回一個結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM