2013-07-24 10 views
1

我有呈三角這樣的功能:一些方法提前歸還時不需要完全計算

void fillset(std::set<int>& myset) 
{ 

while(...) { 
object[i]->fillset(myset); 
} 

if(...) 
    otherfillset(myset) 

} 

現在我發現,經常使用此函數是這樣的:

bool isAllowed() { 

std::set<int> myset; 

fillset(myset); 

return !myset.empty(); 


} 

現在,在這種情況下調用整個fillset()方法是沒有用的,因爲它需要一些時間來執行。 我可以在這種情況下返回一個元素被發現。 有沒有一個簡單的方法來重構這個,而不必重複fillset的代碼? 我在想是這樣的:

template<bool return_as_soon_as_not_empty> 

void fillset(std::set<int>& myset) 
{ 

while(...) { 
object[i]->fillset(myset); 
if(return_as_soon_as_not_empty && !myset.empty()) { 
return; 
} 
} 

if(...) 
    otherfillset(myset) 

} 

你怎麼看這件事?歡迎任何其他想法

+2

你可以有一個可選的'maximum'參數來設置要填充的最大對象數量。 –

回答

3

你實際上想要做的是創建一個新功能canFillSet(),然後調用它。

「修復」fillSet()方法的所有方法都會導致它做一些從其名稱和簽名中不明顯的東西=>這些方法是災難的道路,稍後修改程序時會引發錯誤。

+0

有沒有一種方法可以實現canFillSet()而不用重新輸入fillSet()的邏輯? – lezebulon

+1

可能是的:如果'fillSet()'的實現被正確地模塊化了,你可以重用它使用的函數。您也可能首先進行復制/粘貼,然後重構代碼以減少冗餘。無論如何,我真的認爲,這兩個函數應該在源代碼中緊挨着出現,以減少它們失去同步的機會。 – cmaster

1

這樣做會改變fillset()的含義。它不再用所有元素填充集合,它只填充第一個元素。

一個更好的解決辦法是通過對象

​​
0

級聯的isAllowed()如果你能真正保證有填充組沒有副作用,你可以讓你的建議的改變。但是,如果該集合需要填補某些其他內容才能正常工作,則可能會改變該行爲。

你可以調用諸如single_fill之類的早期返回變量或者暗示你只是在尋找一個要填充的對象而不是整個可能的集合。您還應該考慮將該變量設置爲可選,並且默認爲false