[英]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;
}
除了將theBool
和setBool
重命名為更容易理解的東西(我將假設你在實際應用程序中做了),我會選擇第一個。 具有單詞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.