• ,

Говнокод #2

public boolean foo(...){
  ...
  try{
  ...
  }
  finally{
    if(expr_1){
      return false;
    }
    if(expr_2){
      return false;
    }
    ...
    if(expr_n){
      return false;
    }
  }
  ...
  return true;
}

10 комментариев

SergeyKandalintsev



public boolean foo(...){
  ...
  try{
  ...
  }
  finally{
    if(expr_1 || expr_2 || ... || expr_n){
      return false;
    }
  }
  ...
  return true;
}


terranum
public boolean foo(...){
    ...
    try{
    ...
    }
    finally{
        if(expr_1||expr_2||...||expr_n)
        return false;
    }
    ...
    return true;
}
phashik
  • phashik
  • 0
  • Комментарий отредактирован 2014-04-18 22:30:16 пользователем phashik
нет, плохо получилось :(
Anton_n
Очень хочется так написать:

  finally{
      return !(expr_1||expr_2||...||expr_n);
  }

Но тогда код будет по-другому работать. А чтобы работал точно также как исходный, то, мне кажется, можно сделать только как люди выше предложили.
phashik
  • phashik
  • 0
  • Комментарий отредактирован 2014-04-19 01:56:26 пользователем phashik
таки именно это я шмякнул, не подумав, а потом в спешке прятал от чужих глаз))
но можно, раз уж такие дела, обсудить читаемость кода. мне с 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);
}
L2CCCP
  • L2CCCP
  • -1
  • Комментарий отредактирован 2014-04-19 02:10:57 пользователем L2CCCP
<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'.
Cawich
эм… а я правильно понимаю, что этот код всегда (ВСЕГДА) будет выдавать false? соответственно, говнокод тут сводится скорее к вопросу надобности данного метода…
mrserfr
ты неправильно понимаешь
Cawich
  • Cawich
  • 0
  • Комментарий отредактирован 2015-12-24 12:19:27 пользователем Cawich
ну давай подумаем вместе. блок finally будет выполняться всегда. даже если return встретился ранее. внутри блока try везде return false стоит… если не согласен с этой логикой, то опиши свой вариант поведения программы.
Biohazard
Если ни одно из условных выражений не будет true, то метод будет исполняться до последнего return, который возвращает true. Else-блока ведь ни у одного if нету.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.