Лучший способ express конструкция "if false return false" - PullRequest
1 голос
/ 09 мая 2020

Во многих случаях у вас есть такой код (используется псевдокод в стиле C):

bool checkCondition();

bool doSomething(){
   if (checkCondition() == false)
      return false;

   // do something
   return true;
}

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

Иногда проверка условия может быть оставлена ​​для вызывающей стороны или подтверждена, но часто проверка условий должна выполняться внутри функции.

Вы можете придумать и использовать исключения, но результат будет почти такой же код.

Ответы [ 4 ]

2 голосов
/ 09 мая 2020

Сначала я бы сделал express такое отрицание:

 if (!checkCondition())
     return false;

Также я бы предпочел иметь положительное условие в операторе if, когда это применимо (в зависимости от длины блоков):

bool doSomething(){
      if (checkCondition()) {
         // do something
         return true;
      } else {
        return false;
     }
}

Здесь также можно опустить else из-за возврата в операторе if.

bool doSomething(){
      if (checkCondition()) {
         // do something
         return true;
      }
      return false;
}
0 голосов
/ 24 мая 2020

Вы можете удалить условие if, как показано ниже:

return checkCondition();

Достаточно. Этот код достаточно прост, но если функция checkCondition() не слишком велика, вы можете определить ее как «встроенную» для повышения производительности:

inline bool checkCondition() {//your code;}
0 голосов
/ 09 мая 2020

В большинстве случаев я предпочитаю следующий подход

bool doSomething()
{
    bool success = checkCondition();

    if ( success )
    {
        // do something
    }

    return success;
}

Например, рассмотрим функцию, которая добавляет узел в односвязный список в C.

struct Node
{
    int data;
    struct Node *next;
};

int append( struct Node **head, int data )
{
    struct Node *new_node = malloc( sizeof( struct Node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data = data;
        new_node->next = NULL;

        while ( *head != NULL ) head = &( *head )->next;

        *head = new_node;        
    }

    return success;
}
0 голосов
/ 09 мая 2020

Ваш код прост и понятен. Но ниже - еще один чистый вариант (без явного истины / ложи)

bool doSomething(){
   var isConditionTrue = checkCondition();

   if (isConditionTrue) 
   {
       // if executes only in case of 'isConditionTrue = true'
       // do something
   }
   return isConditionTrue; 
}
...