我有一个返回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?
答案 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) );
}