hubert
41 уровень

Говнокод #2

Пост из группы Архив info.javarush.ru
3681 участников
public boolean foo(...){ ... try{ ... } finally{ if(expr_1){ return false; } if(expr_2){ return false; } ... if(expr_n){ return false; } } ... return true; }
Комментарии (10)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизироваться
Cawich 18 уровень, Самара
24 декабря 2015, 03:52
эм… а я правильно понимаю, что этот код всегда (ВСЕГДА) будет выдавать false? соответственно, говнокод тут сводится скорее к вопросу надобности данного метода…
mrserfr 33 уровень, Киев
24 декабря 2015, 10:50
ты неправильно понимаешь
Cawich 18 уровень, Самара
24 декабря 2015, 12:19
ну давай подумаем вместе. блок finally будет выполняться всегда. даже если return встретился ранее. внутри блока try везде return false стоит… если не согласен с этой логикой, то опиши свой вариант поведения программы.
Biohazard 0 уровень, Пермь
20 июня 2016, 20:30
Если ни одно из условных выражений не будет true, то метод будет исполняться до последнего return, который возвращает true. Else-блока ведь ни у одного if нету.
L2CCCP 9 уровень, Калининград
19 апреля 2014, 02:10
<code>public boolean foo(...)
	{
		//do something...
		try
		{
			//do something...
		}
		finally
		{
			//Если при условиях необходимо выдать дополнительный результат
			if(expr_1)
			{
				object.sendResult("Result 1");
				return false;
			}
			else if(expr_2)
			{
				object.sendResult("Result 2");
				return false;
			}

			//Если результат единый для всех
			if(expr_1 || expr_2)
				return false;
			
			//do something...

			if(expr_n)
				return false;
		}
		//do something...
		return true;
	}</code>
Небольшой совет начинающим, если Ваш метод выполняет возвраты по разным условиям то лучше использовать перечисление через 'else if' так как оно выполняется быстрее вместо простыни 'if'.
Anton_n 33 уровень, Москва
19 апреля 2014, 00:32
Очень хочется так написать:
finally{
    return !(expr_1||expr_2||...||expr_n);
}

Но тогда код будет по-другому работать. А чтобы работал точно также как исходный, то, мне кажется, можно сделать только как люди выше предложили.
phashik 28 уровень
19 апреля 2014, 01:56
таки именно это я шмякнул, не подумав, а потом в спешке прятал от чужих глаз))
но можно, раз уж такие дела, обсудить читаемость кода. мне с if'ом читается лучше.
если переменные осмысленно названы, то как будто чуть-чуть легче становится, но все равно лишний if позволяет не проделывать в голове операцию отрицания:
public boolean isForward() {
    return !(isLeft || isRight || isBackward);
}

public boolean isForward() {
if (isLeft || isRight || isBackward)
    return false;
}


UPDATE:
подумал тут… если написать вот так, то становится читабельно, но такой код сделает больше операций во многих случаях:
public boolean isForward() {
    return (!isLeft && !isRight && !isBackward);
}
phashik 28 уровень
18 апреля 2014, 22:30
нет, плохо получилось :(
terranum 28 уровень, Milan
18 апреля 2014, 16:57
public boolean foo(...){
    ...
    try{
    ...
    }
    finally{
        if(expr_1||expr_2||...||expr_n)
        return false;
    }
    ...
    return true;
}
SergeyKandalintsev 32 уровень, Днепр
18 апреля 2014, 13:38
public boolean foo(...){
  ...
  try{
  ...
  }
  finally{
    if(expr_1 || expr_2 || ... || expr_n){
      return false;
    }
  }
  ...
  return true;
}