2013-03-13 4 views
1

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

(Примечание: Я знаю, что только один из четырех условий будет справедливо, потому что дал любой поток, существует только один «следующий маркер», не так ли?)

foo getFoo() 
{ 
     Bar bar; 
     if ((bar = peekAndGet('x')) != null 
       || (bar = peekAndGet('y')) != null 
       || (bar = peekAndGet('z')) != null 
       || (bar = peekAndGet('t')) != null) 
      return produce(bar); 
     else 
      return null; 
} 

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

+1

Если он работает должным образом, обрабатывает граничные случаи, легко понимается и легко расширяется, это хороший код. «Хорошая практика» поможет вам добраться туда, но важны критерии, которые я изложил. –

+0

Можете ли вы предоставить метод peekAndGet? – Foredoomed

+1

Я думаю, что грубо делать назначение и сравнение в одной строке ... Но это только я (и много других людей). – jahroy

ответ

7

Я бы реорганизовать и написать это так:

char[] values = {'x', 'y', 'z', 't'}; 
for (char c : values) { 
    Bar bar = peekAndGet(c); 
    if (bar != null) return produce(bar); 
} 
return null; 

Примечание: одна хорошая причина, чтобы сделать это, является то, что первый раз, когда я прочитал ваш код, я думал, что он выглядел багги, пока я не прочитал ваш вопрос. Вы хотите, чтобы эти моменты «Что-то не так» выглядели для вещей, которые действительно ошибаются.

+0

Hah, это на самом деле выглядит хорошо, спасибо! (Strage это никогда не приходило мне в голову ... Возможно, так оно и было, но я автоматически отклонил его, потому что я всегда, хотя циклы добавили много накладных расходов) –

+2

@OneTwoThree Это микрооптимизация, которая может не обязательно быть оправданным. (Даже при синтаксическом анализе вы, вероятно, потратите больше времени на семантический анализ более высокого уровня позже.) И, насколько вам известно, JVM JIT способен развернуть этот цикл, чтобы оптимизировать его для вас. – millimoose

1

Вы инициализируете свой объект Bar внутри оператора if, попробуйте инициализировать его вне оператора if.

+0

Я не могу этого сделать. Как мне его инициализировать? –

+0

Ум ... 'peekAndGet ('x')' приходит на ум. – jahroy

1

Это не проблема короткого замыкания. Это короткое замыкание плюс побочные эффекты, вероятно, цель. Его широко осуждают, потому что он делает код сложнее понять и легче сломать. В вашем случае, это немного менее обременительным, но взять этот пример:

if ((b && c++ > 1) || (c++ < 10)) { ... } 

Кто может возможно отслеживать, что происходит с c в таком случае, как это?

1

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

Наличие нескольких побочных эффектов, особенно нескольких присвоений одной и той же переменной, может сделать код менее читаемым и не рекомендуется в JLS.