是用while来做这个好的
本文关键字:while 是用 | 更新日期: 2023-09-27 17:49:53
while(player.CloseMenu(menuType))
{
}
player.CloseMenu(menuType)
将关闭所选类型的一个菜单,如果没有该类型的菜单则返回false。
是否可以使用像这样的空循环来关闭给定类型的所有菜单?
在代码中想出聪明的方法时要小心。它可能会在短期内节省一些按键操作,但有一天其他人可能会看到这段代码并想知道:
- 这到底是在干什么?好吧,我知道它在做什么,但为什么要这样做?
- 是否有一个令人信服的原因,我应该避免它,以免破坏其他东西?
请记住,在你忘记了这段代码的细节后,几个月后,其他人很可能就是你。
节省几行代码并不是什么大事。任何只需要编写一次的内容都是有限的工作量。任何在未来的支持中造成混乱的事情都会产生未知的、更少的工作量。
我将使用更多的自我文档,以防其他人需要阅读。
问题是你必须从调用被推断为bool的事实中推断出来才能理解。
也许你可以把它命名为player.IsMoreAfterClose()。
或
while(true)
{
bool b = player.CloseMenu(menuType);
if(!b) break;
}
或
bool b = true;
while(b)
{
b = player.CloseMenu(menuType);
}
我将扩展所有这些答案并创建一个名为CloseAllMenus(MenuType menuType)
的方法。然后你可以把任何丑陋的实现放进去,当你调用它的时候,它在做什么就很明显了。当前的代码无法解释到底发生了什么,除非您已经知道可以打开多个特定类型的菜单,并且该调用只会关闭其中一个。
显然它可以工作,但它使代码难以阅读/维护。您最好使用循环条件来检查是否有打开的菜单,并使用循环结束符
这样做是可以的,因为它意味着do something until certain condition is met
。但是最好将它合并到CloseMenu
函数中,这样您就不必多次重复这个指令,实际上它是关闭菜单的一个变体,您想要关闭所有菜单。您可以向该函数添加一个布尔参数,以指示是否要关闭所有菜单。
bool CloseMenu(type, closeAll){
if(closeAll)
while(exists(type))
{ close...
else
if(exists(type)
{ close...
}
也许"正确"的事情是从没有正文的While/Close转换为正文做关闭操作的For/Open。
foreach(var menu in player.OpenMenus)
menu.Close();
或:
player.OpenMenus.ForEach(c => c.Close());