2017-06-17 95 views
-1

例如,請考慮以下兩個setter方法:讓一個setter返回一個bool是否是一個好習慣?

bool setMonth(int month) { 
    bool valid = false; 
    if (month > 0 && month < 12) { 
     this->month = month; 
     valid = true; 
    } 
    return valid; 
} 

void setMonth(int month) { 
    if (month > 0 && month < 12) { 
     this->month = month; 
    } 
} 

第一個讓類的客戶端明確知道集是否失敗。這被認爲是良好的做法?

+3

是根本不是一個好習慣嗎? – 2017-06-17 16:54:11

+2

請僅使用語言標記來表示您實際編程的語言。 –

+3

這是一個二傳手的非慣用用法,所以沒有人會期待/期待。拋出IllegalArgumentException異常會更好。 –

回答

5

我不這麼認爲。這意味着,無論何時你設置了一些東西,你都必須檢查操作是否成功。
我認爲引發一個異常將是一個更好的主意,可讀性和邏輯。
我發現:

/*program stuff*/ 
try{ 
    YourObject.setMonth(0); 
    /* other stuff*/ 
}catch YourException{ 
/* recovery*/ 
} 

是清潔劑:

/*program stuff*/ 
if(!YourObject.setMonth(0)){ 
    /*recovery*/ 
}else{ 
    /*stuff*/ 
} 

在邏輯上(我要說哲學)和可讀性。

+0

我不會說它更乾淨,但它絕對更有用,因爲'Exception'對象可以爲您提供關於該問題的信息,或者甚至在需要時傳遞其他數據。它還顯示了錯誤處理的意圖,而不是普通的控制流分支。 –

+0

「清潔」我的意思是避免控制流分支,我的壞。是的,'Exception'對象可以提供很多有用的信息! – magicleon

1

如果是java(你標記了兩種語言),那麼最好的做法是從setter中返回void。如果未能設置值,則拋出異常。對於你的情況,你應該丟棄月份設置器的IllegalArgumentException

2

當您想要追蹤插入到它們的無效數據時,更好地在setter中使用異常。在方法的這種情況下,簽名是:

//throw exception when month is out of range 
    void setMonth(int month) throws InvalidMonthNumberException; 

如果你想設置默認數據時的月份是出在Javadoc範圍discribe這一點。

/* 
* If month < 1 or month > 12 default month (1) accepted 
*/ 
void setMonth(int month); 
3

有人會認爲使用boolean作爲返回類型不受到傷害。在最壞的情況下,你只是忽略檢查。

另外一個可以說,拋出異常是更優雅,更翔實的太(如Java的IllegalArgumentException或Python的ValueError),然而,這可能會導致更多的「麻煩」例外必須處理來自客戶端的代碼或那種方式。

如果您需要確保插入的值絕對正確,第三種方法是將允許的值封裝在結構實體中,例如類,枚舉或命名空間。
在Java中的一個例子是:

public void setMonth(Month month){ 
    this.month = month;  // member month is now of type Month 
} 


public enum Month{ 

    JANUARY(1), 
    FEBRUARY(2), 
    MARCH(3), 
    APRIL(4), 
    MAY(5), 
    JUNE(6), 
    JULY(7), 
    AUGUST(8), 
    SEPTEMBER(9), 
    OCTOBER(10), 
    NOVEMBER(11), 
    DECEMBER(12) 


    private int n; 
    private Month(int n){ 
     this.n = n; 
    } 
} 

和使用,這將是的方式:(可以實現在C命名空間++一樣的東西)

someObject.setMonth(Month.FEBRUARY); 

相關問題