Метод, который возвращает bool, но загружает несколько объектов - PullRequest
2 голосов
/ 12 января 2010

У меня есть простой метод, который возвращает bool, но он внутренне загружает различные объекты.

Я проверяю ноль для каждого, но это становится очень уродливым.

Есть ли лучший способ?

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 ]

15 голосов
/ 12 января 2010

Нужно ли что-либо делать, кроме проверки, существует ли сущность? Я предполагаю, что нет.

Первый шаг: игнорировать правило «одной точки выхода» и уменьшить вложенность:

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 # обладает большей языковой гибкостью (лямбда-выражения, оператор слияния нуля и тому подобное), что может быть полезно в этой ситуации.

5 голосов
/ 12 января 2010

Если вы ничего не можете сделать для восстановления, вы можете просто вернуться, как только получите нулевое значение:

User user = UserDAO.GetById(id1);

if(user == null) return false;

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

if(blah == null) return false;

Возможно, вы также захотите взглянуть на шаблон нулевого объекта

2 голосов
/ 12 января 2010

серьезно

Blah blah = GetBlah();
if (blah == null) return false;
1 голос
/ 12 января 2010

Чтобы добавить ко всем остальным ответам, если у вас был интерфейс IDao, например

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

Затем вы можете передать Список DAO, созданный где-то еще.

public bool SomeTest(int id1, IEnumerable<IDao> daoList)
{
   return daoList.Any( dao => dao.CanGetUser(id1) );
}
1 голос
/ 12 января 2010

Возможно:

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
}
...