【问题标题】:A method that returns bool, but loads multiple objects返回 bool 的方法,但会加载多个对象
【发布时间】:2010-01-11 21:57:00
【问题描述】:

我有一个返回 bool 的简单方法,但它在内部加载了各种对象。

我为每个检查 null,但它变得非常难看。

有没有更好的办法?

public bool SomeTest(int id1)
{
   bool result = false;

   User user = userDao.GetById(id1);

   if(user != null)
   {
      Blah blah = blahDao.GetById(user.BlahId);


     if(blah != null)
     {
         FooBar fb = fbDao.GetById(blah.FooBarId);

         if(fb != null)
         {
           // you_get_the_idea!

         }


     }
   }


   return result;
}

有没有一种模式可以使它更内联而不是嵌套的 if?

【问题讨论】:

  • 我总是将 VS 更改为使用 2 个空格而不是 4 个用于制表符。这使得嵌套不那么烦人。我个人认为你所拥有的最接近你在概念上的意思。即,如果成功了,那么试试这个,如果成功了。到处都有“return false”的另一个选项意味着实际上隐含的“else”嵌套了以下每个 if,如果稍后由另一个开发人员维护/编辑,它可能更容易出现问题。不过,这实际上取决于您所做工作的背景和复杂性,因此请对我的评论持保留态度。

标签: c# java oop coding-style


【解决方案1】:

除了检查实体是否存在之外,它还需要做其他事情吗?我假设不会。

第一步:忽略“一个出口点”规则,减少嵌套:

public bool SomeTest(int id1)
{
   User user = userDao.GetById(id1);    
   if (user == null)
   {
      return false;
   }

   Blah blah = blahDao.GetById(user.BlahId);
   if (blah == null)
   {
       return false;
   }

   FooBar fb = fbDao.GetById(blah.FooBarId);
   if (fb == null)
   {
       return false;
   }

   return true;
}

接下来的内容可能是特定于语言的...您使用的是什么语言,以及平台的哪个版本?你能改变你的 DAO 吗? C# 具有更多的语言灵活性(lambda 表达式、null 合并运算符等),在这种情况下可能会很方便。

【讨论】:

  • +1 for '第一步:忽略“一个出口点”规则并减少嵌套' 我见过的一些最不可读的代码是以一个出口点规则的名义完成的 :)
【解决方案2】:

假设你无法恢复,你可以在得到 null 后立即返回:

User user = UserDAO.GetById(id1);

if(user == null) return false;

Blah blah = blahDao.GetById(user.BlahId);

if(blah == null) return false;

您可能还想查看Null object pattern

【讨论】:

  • +1 用于空对象模式参考。根据问题的具体情况,这可能会很有帮助。
【解决方案3】:

真的吗?

Blah blah = GetBlah();
if (blah == null) return false;

【讨论】:

  • 这个答案在 -1 和 Jon 的 +7 之间没有技术差异。来自我的 +1。
【解决方案4】:

添加到所有其他答案,例如,如果您有一个 IDao 界面

public interface IDao
{
   bool CanGetUser(int id);
}

然后你可以传入在其他地方创建的 DAO 列表。

public bool SomeTest(int id1, IEnumerable<IDao> daoList)
{
   return daoList.Any( dao => dao.CanGetUser(id1) );
}

【讨论】:

    【解决方案5】:

    也许:

    User user;
    Blah blah;
    FooBar fb;
    if( (user = userDao.GetById(id1)) != null
     && (blah = blahDao.GetById(user.BlahId)) != null
     && (fb   = fbDao.GetById(blah.FooBarId)) != null)
    {
        // set flag, manipulate user/blah/fb, etc
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 2010-10-02
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2012-03-02
      相关资源
      最近更新 更多