Лучший способ проверить нулевое значение для комбинации двух объектов - PullRequest
0 голосов
/ 16 ноября 2018

Я давно хотел задать этот вопрос. Потратив некоторое время, я чувствую, что не могу должным образом проверить два объекта на наличие нулей вместе, поэтому я спрашиваю об этом.

Например: у меня есть одна такая функция

int Function(Object* obj1, Object* obj2) 
{
   if(obj1 == null && obj2 == null)
   { 
       // Do someting........
   }
   else if(obj1 == null && obj2 != null)
   { 
       // Do something.....
   }
   else if(obj1 != null && obj2 == null)
   {
       // Do something......
   }
   else
   {
       // Do something........
   }
   return 0;

Как мы видим, у нас слишком много условий if, чтобы проверить комбинацию двух объектов на ноль.

Есть ли другой способ сделать это более эффективно, чтобы читабельность была хорошей?

Примечание: объект является классом, и ни один оператор не перегружен.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вам нужно выполнить не более двух сравнений. Вот как бы я это сделал:

if( obj1 )
{
    if( obj2 )
    {
        // obj1 and obj2 are both valid.
    }
    else
    {
        // obj1 is valid, obj2 is nullptr.
    }
}
else
{
    if( obj2 )
    {
        // obj1 is nullptr, obj2 is valid.
    }
    else
    {
        // Both are nullptr.
    }
}
0 голосов
/ 16 ноября 2018

Основная идея заключается в уменьшении количества , если ... еще ответвлений.Может быть, какой-то диспетчер, что-то вроде этого:

int ptr_pair_state(const obj1 *p1, const obj1 *p2)
{
    return (p1 ? 1 : 0) | (p2 ? 2 : 0);
}

int Function(Object* obj1, Object* obj2)
{
    std::map<int, std::function<void()>> disp{ { 0, f1 }, { 1, f2 }, { 2, f3 }, {3, f4 } };
    int state = ptr_pair_state(obj1, obj2);
    disp[state]();
}

, где f1 - f4 - некоторые функции, например

void f1()
{
    std::cout << "f1";
}

Однако это может показатьсякак ненужное усложнение, так что еще одна простая альтернатива - использовать оператор переключателя:

int Function(Object* obj1, Object* obj2)
{    
    int v = (p1 ? 1 : 0) | (p2 ? 2 : 0);
    switch(v)
    {
    case 0: // both nullptr
        break;
    case 1: // p1 not nullptr
        break;
    case 2: // p2 not nullptr
        break;
    case 3: // both not nullptr
        break;
    }
}

, который намного элегантнее бесконечного если ... еще если

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...