一种返回bool但加载多个对象的方法

时间:2010-01-11 21:57:00

标签: c# java oop coding-style

我有一个返回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?

5 个答案:

答案 0 :(得分:15)

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

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

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表达式,空合并运算符,类似的东西),在这种情况下可能很方便。

答案 1 :(得分:5)

假设你无法恢复,只要你得到一个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

答案 2 :(得分:2)

严重?

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

答案 3 :(得分:1)

也许:

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
}

答案 4 :(得分:1)

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

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

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

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