2012-05-17 2 views
0

Я пишу метод, и хотел бы знать, если приложенный код эффективен в зависимости от того, как написано:Эффективные методы программирования

public boolean isThreeOfKind(PlayingCard[] hand) 
    { 
//   if(hand[0].getRank() == hand[2].getRank()) 
//    return true; 
//   else if(hand[1].getRank() == hand[3].getRank()) 
//    return true; 
//   else if(hand[2].getRank() == hand[4].getRank()) 
//    return true; 

     return (hand[0].getRank() == hand[2].getRank() || 
       hand[1].getRank() == hand[3].getRank() || 
       hand[2].getRank() == hand[4].getRank()); 
    } 

Так как вы можете видеть, у меня есть, если еще, если заявление прокомментировал и заявление о возврате, делающее то же самое в основном, что было бы более эффективным и в соответствии со стандартами кодирования?

+7

Читаемость является гораздо более ценным в этом случае, чем эффективность. Используйте то, что вам легче понять. – Jeffrey

+3

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

+0

Хммм похоже, что 'PlayingCard' '' '' лучше сортироваться по значению. Потребовал мне минуту, чтобы понять, как это будет «три в одном». Just sayin ' –

ответ

9

Отсутствие разницы в эффективности, но определенная разница в стиле, вторая - намного лучше. Тем не менее, эта конкретная логика действительно просто

for (int i = 0; i < 3; i++) 
    if (hand[i].getRank() == hand[i+2].getRank()) return true; 
return false; 
+0

. Эта реализация также будет уменьшаться в прошлом [0 ... 4]. +1 –

+0

Мне особенно нравится, потому что гораздо более ясно, что делает код - сравнивая i-й член восходящей серии с (i + 2) nd-членом, чтобы подтвердить три в своем роде. Подразумевается возрастающая серия (карты сортируются), иначе это не сработало бы - это еще одна очевидная вещь (любая ошибка будет намного легче распознать). –

3

Этот тип вопроса может быть лучше на CodeReview, потому что это больше мнение. Но, на мой взгляд, гораздо легче читать часть без комментариев, и производительность не должна волноваться, пока она не станет проблемой (особенно в чем-то подобном). Более подробно об этом см. Статью по оптимизации программы в Википедии, в частности раздел When to Optimize.

0

Как сказал Джеффри, я бы сказал, что читаемость более ценна, чем эффективность в этом случае (я бы не сказал, что это универсальное правило).

Возможно, вас заинтересовала бы концепция под названием Short-Circuit Evaluation. Обратите внимание, что || является оператором короткого замыкания в Java. Таким образом, вы получите тот же эффект, что и операторы if, если первое утверждение истинно (другие два не будут оцениваться).

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

+0

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

+0

Это точка оценки короткого замыкания. Java не будет оценивать два вторых элемента во второй реализации, если первая истинна, как и с операторами if. Редактировать: Причина, по которой я сказал, что это может быть медленнее, - это то, что я не уверен, что скомпилировать в машинных кодах инструкции «если». Я предполагаю, что оба утверждения будут скомпилированы одинаково, но я не уверен. – user986122

0

Или, если вы предпочитаете только одну точку выхода в метод и массив граничной проверки:

boolean found = false; 
for (int i = 0; !found && i < hand.length - 2; i++) 
    found = (hand[i].getRank() == hand[i + 2].getRank()); 
return found;