Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: Какая структура лучше?
Первая 4 50.00%
Вторая 4 50.00%
Голосовавшие: 8. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2012, 11:04   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию Структура if

Доброго всем! Вот возник у меня вопрос, как лучше организовывать структуру проверок. Вот так:

Код:
result = 'complete';

if(Проверка 1)
{
  result = 'Ошибка 1';
}

if(Проверка 2)
{
  result = 'Ошибка 2';
}

if(result == 'complete')
{
  //какие то действия
}

return result;
или вот так

Код:
if(Проверка 1)
{
  if(Проверка 2)
  {
      //какие то действия
  }
  else
  {
    result = 'Ошибка 2';
  }
}
else
{
  result = 'Ошибка 1';
}

return result;
понятно что во втором случае происходит меньше проверок, да и если для какой то проверки нужны какие то еще действия, например запрос, то они будут произведены только если никаких посторонних ошибок не было.

но в первом случае код имеет меньшую вложенность и более удобен к восприятию.
В планах порабощение вселенной...

Последний раз редактировалось zumm; 13.05.2012 в 11:07.
zumm вне форума Ответить с цитированием
Старый 13.05.2012, 11:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Третий (лучший на мой взгляд) вариант:
Код:

result = 'complete';

if(Проверка 1)        result = 'Ошибка 1';
else if(Проверка 2)  result = 'Ошибка 2';
else  //какие то действия


return result;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2012, 11:27   #3
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Stilet, а чем он отличается от второго?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 13.05.2012, 12:02   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Читабельнее. По крайней мере для меня
О! И я койче увидел:
Код:
if(! Проверка 1)        result = 'Ошибка 1';
else if(! Проверка 2)  result = 'Ошибка 2';
else  //какие то действия
А то получается с точностью да наоборот
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2012, 12:13   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Я бы сделал так:
Код:
result = 'complete';
switch ( true )
{
  case <Проверка 1>: result = 'Ошибка 1'; break;
  case <Проверка 2>: result = 'Ошибка 2'; break;
  default: // какие-то действия;
};
return result;
Arigato вне форума Ответить с цитированием
Старый 13.05.2012, 12:13   #6
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Stilet, вот часть функции, над которой я работаю в данный момент, она хороша для примера:

Код:
		
function initLogin($userEmail, $userPassword)
{			
	if($userEmail <> null and $userPassword <> null)
	{
		$userPassword = md5(md5($userPassword).md5(md5($userPassword).md5($userEmail)));
		$temp = mysql_fetch_array(mysql_query("SELECT * FROM `users` WHERE 
				`email` = '".$userEmail."' AND `pass` = '".$userPassword."'"));
		
		if(count($temp) <> 1)
		{
			if($temp['ban'] == 0)
			{
				if($user['status'] <> 0)
				{
				
				}
				else
				{
					$result = 'Аккаунт не активирован.';
				}
			}
			else
			{
				$result = 'Аккаунт заблокирован.';
			}
		}
		else
		{
			$result = 'Данные введены не верно.';
		}
	}
	else
	{
		$result = 'Заполните все поля.';
	}
}
разве так не более читабельно, в отличии от того, если бы заполнение "result" было бы там же, где и промежуточные действия, то бишь сверху?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 13.05.2012, 12:59   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мне вложенка по глазам бьет.
Честно, я не люблю так писать. При анализе приходится глазами водить вверх-вниз.
Но это касается только стиля написания. Если тебя это устраивает то почему бы нет
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.05.2012, 14:42   #8
flance
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 184
По умолчанию

zumm

Первый вариант не равен второму.

Во-первых, во 2 варианте результатом будет "ошибка х", если проверки НЕ пройдены, а в 1 варианте наоборот, если проверки пройдены.
Вы скажите, что в первом случае подразумевается
Цитата:
if(!Проверка 1)
но в некоторых случаях это влияет на читаемость, а ведь тема именно об этом.

Во-вторых, во 2 варианте если уже Ошибка 1, то проверок больше не будет и "какие-то действия" выполняться не будут. Это оптимальнее по скорости. В 1 варианте не так.

В-третьих, в 1 варианте Ошибка 2 перекрывает Ошибку 1, если она есть. Спрашивается - зачем мы тогда о ней узнавали? Это является ошибкой программиста.
Программист-фрилансер, готовый рассмотреть предложения на постоянную удаленную работу... Ответственный, трудолюбивый
telegram: flancejob

Последний раз редактировалось flance; 13.05.2012 в 14:45.
flance вне форума Ответить с цитированием
Старый 13.05.2012, 15:18   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
Stilet, вот часть функции, над которой я работаю в данный момент, она хороша для примера:
Тут, как минимум, можно сократить объем кода:
Код:
function initLogin($userEmail, $userPassword)
{			
	if($userEmail <> null and $userPassword <> null)
	{
		$userPassword = md5(md5($userPassword).md5(md5($userPassword).md5($userEmail)));
		$temp = mysql_fetch_array(mysql_query("SELECT * FROM `users` WHERE 
				`email` = '".$userEmail."' AND `pass` = '".$userPassword."'"));
		if(count($temp) <> 1)
		{
			if($temp['ban'] == 1) $result = 'Аккаунт заблокирован.';
                          elseif($user['status'] == 0) $result = 'Аккаунт не активирован.';
		} else $result = 'Данные введены не верно.';
	} else $result = 'Заполните все поля.';
}
Кстати, меня смущает еще это условие: (count($temp) <> 1)
Arigato вне форума Ответить с цитированием
Старый 13.05.2012, 17:29   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Мне по душе больше первый (он читабельнее, но пусть работает чуть медленне), хотя я тоже считаю, что первый код и второй - не одно и то же, хотя бы потому, что результат первого кода в случае выполнения условия <Проверка 2> будет таким:
Код:
result = 'Ошибка 2'
, в то время, как у второго кода будет результат такой
Код:
//какие то действия
. Может автор допустил какую-то ошибку, тогда можно взять свои слова обратно.

Хотя могу предложить ещё вот примерно такое
Код:
if (Result != 'Complete')
	{
	if (Проверка 1) Return 'Ошибка 1'
		
		else Return 'Ошибка 2'
	}

// Какие-то действия
Вадим Мошев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура maxim43k Помощь студентам 3 09.09.2011 12:13
структура Arthur92 Общие вопросы C/C++ 0 11.05.2011 08:19
Структура minato91 Общие вопросы C/C++ 1 11.03.2011 00:12
структура euhenia Помощь студентам 3 16.04.2010 22:25
Структура IF в С++ lebrosha Помощь студентам 3 22.05.2009 00:09