hubert
41 уровень

Говнокод #2

Статья из группы Архив info.javarush
участников
public boolean foo(...){ ... try{ ... } finally{ if(expr_1){ return false; } if(expr_2){ return false; } ... if(expr_n){ return false; } } ... return true; }
Комментарии (9)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Cawich
Уровень 18
24 декабря 2015, 03:52
эм… а я правильно понимаю, что этот код всегда (ВСЕГДА) будет выдавать false? соответственно, говнокод тут сводится скорее к вопросу надобности данного метода…
mrserfr
Уровень 33
24 декабря 2015, 10:50
ты неправильно понимаешь
Cawich
Уровень 18
24 декабря 2015, 12:19
ну давай подумаем вместе. блок finally будет выполняться всегда. даже если return встретился ранее. внутри блока try везде return false стоит… если не согласен с этой логикой, то опиши свой вариант поведения программы.
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
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;
}