是用while来做这个好的

本文关键字:while 是用 | 更新日期: 2023-09-27 17:49:53

        while(player.CloseMenu(menuType))
        {
        }

player.CloseMenu(menuType)将关闭所选类型的一个菜单,如果没有该类型的菜单则返回false。

是否可以使用像这样的空循环来关闭给定类型的所有菜单?

是用while来做这个好的

在代码中想出聪明的方法时要小心。它可能会在短期内节省一些按键操作,但有一天其他人可能会看到这段代码并想知道:

    这到底是在干什么?好吧,我知道它在做什么,但为什么要这样做?
  • 是否有一个令人信服的原因,我应该避免它,以免破坏其他东西?

请记住,在你忘记了这段代码的细节后,几个月后,其他人很可能就是你。

节省几行代码并不是什么大事。任何只需要编写一次的内容都是有限的工作量。任何在未来的支持中造成混乱的事情都会产生未知的、更少的工作量。

我将使用更多的自我文档,以防其他人需要阅读。

问题是你必须从调用被推断为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());