2011-04-11 59 views
0
 while(player.CloseMenu(menuType)) 
     { 
     } 

player.CloseMenu(menuType)將關閉所選類型的一個菜單,或者如果沒有剩下的類型,則返回false。正在使用,而這個好嗎?

是否可以使用這樣的空循環關閉給定類型的所有菜單?

+0

這似乎有點標新立異。 – 2011-04-11 23:35:40

+0

是的,這正是我的觀點。我還能做什麼,而不能觸摸功能的身體? – bevacqua 2011-04-11 23:38:05

+0

你正在使用什麼樣的框架? – 2011-04-11 23:38:19

回答

1

我會擴展所有這些答案並創建一個名爲CloseAllMenus(MenuType menuType)的方法。然後你可以把任何一種醜陋的實現放在那裏,當你打電話時它會明白它在做什麼。您當前的代碼無法解釋究竟發生了什麼,除非您已經知道可以有多個特定類型的菜單處於打開狀態,並且此調用僅會關閉其中的一個。

+0

實際上,這是在播放器的擴展方法,'void CloseAllMenues(this Player player,Type menuType)' – bevacqua 2011-04-12 00:41:42

+0

@Nico這改變了一點。如果這是函數中唯一的東西,我會說你可能只需要添加一個註釋就好像'// CloseMenu在找不到該類型的菜單要關閉時返回false,那就沒問題了 – 2011-04-12 04:28:32

2

如果其他人需要閱讀它,我會提供更多的自我文檔。

問題是你必須從調用被推斷爲一個bool來理解的事實推斷。

也許如果你把它命名爲player.IsMoreAfterClose()。

while(true) 
{ 
    bool b = player.CloseMenu(menuType); 
    if(!b) break; 
} 

bool b = true; 
while(b) 
{ 
    b = player.CloseMenu(menuType); 
} 
+1

while(true){/ * blah */break; }是不好的形式 - 什麼可能會更好是while(player.HasMenusOpen(menuType)){player.CloseMenu(menuType); } - 這裏的破壞條件應該是 – fusi 2011-04-11 23:44:34

+0

imho,我不同意它在循環中的不良形式(whos體有相對較低的行數)。 'while(true)'和'break'的組合形成了一個(對我來說)清晰的'heres發生了什麼'和'heres是什麼使它停止'的圖像。 – 2011-04-12 00:39:40

1

它會工作,很明顯,但它使代碼有點難以閱讀/維護。循環條件可以檢查任何打開的菜單,循環體可以關閉一個。

3

當想出巧妙的代碼處理方式時要小心。在短期內它可以節省幾個按鍵,但有一天別人可能會看到這個代碼,並想知道:

  • 甚至這樣做是什麼?
  • 好的,我看到它在做什麼,但爲什麼這樣做呢?
  • 這是否有一個令人信服的理由,我應該避免它,以免破壞別的東西?

請記住,在忘記此代碼的詳細信息後的幾個月內,別人可能會很好。

保存幾行代碼並不是什麼大不了的事。任何必須只寫一次的東西都是有限的工作量。任何混淆支持未來的事物都會產生一個未知數量較少的工作量。

0

可以這樣做,因爲這意味着do something until certain condition is met。但最好將其納入CloseMenu函數中,以便您不必多次重複此指令,實際上它是關閉菜單的一種變體,您要關閉所有菜單。您可以向函數添加布爾參數以指示是否要關閉所有菜單。

bool CloseMenu(type, closeAll){ 
    if(closeAll) 
     while(exists(type)) 
     { close... 
    else 
     if(exists(type) 
     { close... 
} 
+0

布爾參數不直觀。很難理解什麼方法在做什麼,例如CloseMenu('type',false)和CloseMenu('type',true)之間的區別並不明顯。我建議使用有意義的名稱添加兩個不同的公共方法,如CloseAllMenus。 – 2011-04-11 23:58:33

+0

很明顯,如果你閱讀API(甚至函數簽名就足夠了,因爲(正確選擇的)參數名稱可以表明它的用途),這是開發人員應該做的。 – manji 2011-04-12 00:25:07

+0

如果代碼在閱讀API時很容易理解,那就好多了。爲什麼開發人員應該浪費時間閱讀API? :) – 2011-04-12 00:33:19

0

也許「正確的」事情是從While/Close轉換到沒有主體進行For/Open與身體進行關閉操作。

foreach(var menu in player.OpenMenus) 
    menu.Close(); 

或:

player.OpenMenus.ForEach(c => c.Close()); 
相關問題