2016-02-13 2 views
1

я должен написать функцию, чтобы удалить элемент из LinkedList (шахты, не то, что в рамках коллекций), так вот моя первая попытка:Возвращение в середине цикла

public void remove(E element) { 
    Cell<E> cell = sentinel; 
    int i = 0; 
    while (i < count) { 
     if (cell.getElement().equals(element)) { 
      cell.getPrevious().setNext(cell.getNext()); 
      --count; 
      return; 
     } 
     ++i; 
     cell = cell.getNext(); 
    } 
} 

Мой вопрос : использует return, как это хорошо? В более общем плане, когда проверяется условие, и нет никакого смысла, выполнив следующие инструкции, то это имело смысл для меня, чтобы использовать return:

void func() { 
    while (condition) { 
     if (something) { 
      instructions; 
      return; 
     } 
     more instructions; 
    } 
} 

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

public void remove(E element) { 
    boolean found = false; 
    Cell<E> cell = sentinel; 
    int i = 0; 
    while (!found && i < count) { 
     if (cell.getElement().equals(element)) 
      found = true; 
     else { 
      ++i; 
      cell = cell.getNext(); 
     } 
    } 
    if (found) { 
     cell.getPrevious().setNext(cell.getNext()); 
     --count; 
    } 
} 

Таким образом, нет странно return и инструкции выполняются только тогда, когда они должны быть. Если я снова столкнусь с этим, я думаю, что мне придется переписать цикл таким образом. Возможно, я совершенно неправ, и первый подход лучше. Что ты думаешь об этом ?

+2

'return' совершен в первом методе – fantaghirocco

+1

Это, прежде всего, на основе мнения. Я предпочитаю возвращаться в середине цикла, так как я думаю, что дополнительные переменные (т. Е. Логические 'found') не учитывают читаемость. Кроме того, обратите внимание, что ваш второй подход не совпадает с вашим первым логическим вы вызываете 'cell = cell.next()' одно дополнительное время. –

+0

_Но так как это было не очень читаемо .. Ну, кто сказал, что это невозможно прочитать? Думаю, это более читаемо, чем второе. – Hackerdarshi

ответ

5

По моему мнению, возвращение рано - это прекрасно, если оно не слишком сложное. Подобно использованию инструкции break для выхода из цикла раньше.

Вы можете посмотреть на этот вопрос о программистах, каждый из них поднимет действительные баллы. https://softwareengineering.stackexchange.com/questions/18454/should-i-return-from-a-function-early-or-use-an-if-statement

0

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

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

булево true or false можно использовать, когда вы не хотите больше, чтобы выполнить цикл , но вы все еще хотите продолжить с остальной частью коды в этого метода.

1

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

Например

public void remove(E element) { 
    Cell<E> cell = FindCell(element); 
    if (cell != null) 
     RemoveCell(cell); 
} 

private <E> FindCell(E element) { 
    <E> cell = sentinel; 
    int i = 0; 
    while (i < count) { 
     if (cell.getElement().equals(element)) { 
      return cell; 
     } 
     ++i; 
     cell = cell.getNext(); 
    } 

    return null; 
} 

private void RemoveCell(<E> cell) { 
    cell.getPrevious().setNext(cell.getNext()); 
    --count; 
} 

Это разделение даст вам некоторые преимущества. Вы можете вызывать функции только для чтения столько раз, сколько хотите (может быть в параллельных потоках), и вы точно знаете, что ничего не происходит. C++, например, имеет константную-функцию

И возвращение очень удобно, когда вам нужно разбить два или более вложенные циклы

Смежные вопросы