C# 返回bool但加载多个对象的方法

C# 返回bool但加载多个对象的方法,c#,java,oop,coding-style,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)

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

严重吗

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

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

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

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

也许:

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
}

假设您无法进行任何恢复,您可以在获得空值后立即返回:

User user = UserDAO.GetById(id1);

if(user == null) return false;

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

if(blah == null) return false;

例如,如果您有一个IDao接口,您可能还需要查看添加到所有其他答案中的

public interface IDao
{
   bool CanGetUser(int id);
}
然后您可以将DAO的列表传递到其他地方

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

我总是将VS更改为使用2个空格,而不是4个空格作为选项卡。这使得筑巢不再那么烦人。我个人认为你所拥有的最接近你概念上的意思。也就是说,如果成功了,那么试试这个,如果成功了。另一个选项是“return false”无处不在,这意味着实际上有隐含的“else”嵌套了以下每个if,如果以后由其他开发人员维护/编辑,则更容易出现问题。这实际上取决于你所做的事情的上下文和复杂性,所以请恕我直言。+1表示“第一步:忽略“一个出口点”规则并减少嵌套”,我见过的一些最不可读的代码是以一个出口点规则的名义完成的:)+1表示空对象模式引用。这可能非常有用,取决于问题的背景。这个答案在-1和Jon的+7之间没有技术上的区别+从我这里得到1。