2015-07-05 5 views
-2

Я читаю исходный код XposedBridge.Является ли это лучшей практикой в ​​java?

Я смущен, когда я читаю следующие коды

do { 
    label65: { 
     try { 
      ((XC_MethodHook)callbacksSnapshot[beforeIdx]).beforeHookedMethod(param); 
     } catch (Throwable var18) { 
      log(var18); 
      param.setResult((Object)null); 
      param.returnEarly = false; 
      break label65; 
     } 

     if(param.returnEarly) { 
      ++beforeIdx; 
      break; 
     } 
    } 

} while(beforeIdx < callbacksLength); 

Насколько я знаю, код break label65 означает, что он сломается из while области, но это то же самое с label165 области , Какова функция метки lable165? Это лучшая практика в отношении Java, о которой я не знаю.

+1

Ваш вопрос довольно неясен, пожалуйста, отредактируйте его – UnknownOctopus

+0

Я не думаю, что здесь необходим ярлык ... – texasbruce

+0

Звучит для меня как другой вопрос, основанный на мнениях .. –

ответ

1

Это считается плохой практикой в ​​Java и часто считается похожим на заявления GOTO, которые печально известны при создании кода спагетти.

Если вам нужно использовать инструкции с надписью break в Java, это обычно означает, что существует лучший способ структурирования вашей логики/петель, чтобы избежать их. Я лично считаю их запутанными, особенно когда они подвергаются насилию.

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

+0

Утверждения 'GOTO' являются печально известными, да, но у них есть незаслуженно плохая репутация. Вы можете написать crummy code без единого 'goto', и вы можете написать с ними совершенно отличный код. Написание этого слова «break» или «continue» очень в моде, но не меняет его фундаментальной природы. Я согласен, что этот конкретный код попадает на мутную сторону. –

+0

Это правда @JohnBollinger, но с заявлениями GOTO очень легко использовать их неправильно и злоупотреблять ими. Код в исходном вопросе очень запутан из-за помеченного блока, поэтому он является примером плохого кода. Однако, если вы используете маркированный цикл для выхода из внешнего цикла из вложенного внутреннего цикла, это может быть намного легче читать/понимать, чем дополнительная логика, которую потребуется для этого без них. –

0

Это похоже на заявление GOTO и функционирование как призывный вызов. Однако это не очень хорошая практика.

0

Насколько мне известно, ярлык разрыва кода 65 означает, что он вырвется из области while, но это то же самое с областью label165.

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

++beforeIdx; 

в конце цикла.

Что такое функция label lable165?

См. Выше.

Это лучшая практика в отношении Java, о которой я не знаю.

Это не лучшая практика. Способ использования этого ярлыка делает код трудным для понимания, и это практическая практика.


Фактически, если это рукописный код, то я подозреваю, что он не делает то, что автор считает. Если вы посмотрите на материал с флагом returnEarly, он устанавливается в обработчике исключений, а затем проверяется в инструкции после try ... catch. Но обработчик также разбивается на ярлык, который пропускает утверждение if!

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


@cryslis писал:

Примечание мой ответ. Я думаю, что это декомпилировалось.

Я также подозреваю, что это был декомпилированный код. Странные локальные имена (label65 и var18) - еще одна подсказка.

Однако, вы сказали, что нашли исходный код репозитория Github. Эти две вещи не являются взаимоисключающими ... но если кто-то декомпилирует код и загружает его в Github, это довольно шонки и, возможно, незаконно. Я не хотел указывать пальцем без очевидных доказательств. И я не могу найти исходный код с label65 и var18 в репо.

Конечно, это не «лучшая практика» для декомпиляции кода и загрузки его в Github.

И если вы получаете байт-коды и пытаетесь понять их путем декомпиляции, то это тоже не «лучшая практика».

+1

Обратите внимание на мой ответ. Я думаю, что это декомпилированный 'continue'. – chrylis

+0

Посмотрите внимательно: ярлык украшает блок, который окружает операторы 'try' /' catch' и 'if', поэтому нарушение этого утверждения помещает вас в нижнюю часть цикла. Поэтому утверждение 'continue' будет служить той же цели. –

+0

@JohnBollinger - В этом случае это неясный способ «написать» «продолжить» ... и очень плохую практику. –

2

Это не считается хорошей практикой.

Оказывается, что этот код был получен с помощью декомпилятора, и я подозреваю, что лейбл и break были фактически continue заявлением, которое является прекрасно, если вам нужно выйти из цикла раньше и вернуться к началу.

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