C# 返回bool但加载多个对象的方法
我有一个返回bool的简单方法,但它在内部加载各种对象 我为每一个都检查null,但它变得非常丑陋 有更好的办法吗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)
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。