| 
				
				[PHP] Давайте писать хороший код
				 |   |  
| cougraAcc | Дата: Среда, 22 Января 2014, 04:19 | Сообщение # 1 |  
 
Яркая личность GD 
Сейчас нет на сайте 
 
 | Мало кто из создающих статьи "Создание браузерной игры на примере XXX (вставить актуальное)" имеет представление об альтернативном синтаксисе и стандарте стиля программирования. И в итоге говнокод: отсутствие читаемости, внятных комментариев ("а тут мы прибавим к силе 15" - говно и не в тему). Поэтому я попробую донести до Вас некоторые трюки, которые сэкономят десяток строчек кода.   p.s. Кульный веб девелоперам здесь делать нечего, на Ваши "умные" слова и грамотные советы обращать внимания не буду. Делитесь своими знаниями на уроках информатики. 
   1. Альтернативный синтаксис 
   Альтернативный синтаксис для управляющих структур в пхп предлагает замену стандартных логических операторов на их упрощенный аналог. К таким структурам относятся: if, while, for, foreach, switch. 
   Как это выглядит и в чем разница? 
   FOREACH/FOR/WHILE   Код    <?php   <ul>   ?>   <?php   foreach($array as $value)   {      echo "<li>".$value."</li>";   }   ?>   </ul>      
   Теперь альтернативный синтаксис:   Код    <ul>   <?foreach($array as $value):?>   <li><?=$value?></li>   <?endforeach;?>   </ul>      
   IF ELSE   Код    <?php   if ($a == 1) {     echo "yo";   } else {     echo "hi!";   }   ?>      
   Альтернативный синтаксис:   Код    <?if($a == 1):?>   yo   <?else:?>   hi   <?endif;?>      
   <?=$var?> - тоже является альтернативным синтаксисом, в данном случае выражение будет однозначно <?php echo $var; ?> 
   Теперь давайте попробуем повысить читаемость кода и уменьшить количество строк в несколько раз. 
   Для примера я взял говнокод из соседней темы: http://gcup.ru/forum/51-28125-1 
   Шаблон:   Код    <?php          if (isset($_POST['login'])) { $login = $_POST['login']; } //Забиваем введённый логин в переменную     if (isset($_POST['password'])) { $password=$_POST['password']; }//Забиваем введённый пароль в переменную   
   if (empty($login) or empty($password)) //Если юзер не ввёл логин либо пароль выдаём ошибку            {            echo "<script>alert('Заполните поля логина и пароля!'); location.href='reg.php';</script>"; exit;           }                             if    (!preg_match("|^[a-z_-]+$|i", $login)) //Проверяем логин на корректность           {echo "<script>alert('Запрещённые симбволы в логине!!'); location.href='reg.php';</script>"; exit;}         if    (!preg_match("|^[a-z 0-9]+$|i", $password)) //проверка пароля           {echo "<script>alert('Запрещено использовать русские буквы в пароле!!'); location.href='reg.php';</script>"; exit;}             $ip= $_SERVER["REMOTE_ADDR"]; //Узнаём ip-адресс           $gender = $_POST['gender']; //Забиваем в переменную пол 1-мальчик 2-девочка           $poke = $_POST['poke']; //Выбраный покемон         if ($poke=='1'){$pok = '1';} //Дальше ставим условие например: если покемон = 1 значит в переменную забиваем 1 таким образом узнаём выбранного покемона           if ($poke=='4'){$pok = '4';}           if ($poke=='7'){$pok = '7';}           if ($poke=='152'){$pok = '152';}            if ($poke=='155'){$pok = '155';}           if ($poke=='158'){$pok = '158';}           if ($poke=='252'){$pok = '252';}            if ($poke=='255'){$pok = '255';}           if ($poke=='258'){$pok = '258';}           if ($poke=='387'){$pok = '387';}           if ($poke=='390'){$pok = '390';}           if ($poke=='393'){$pok = '393';}            if ($poke=='495'){$pok = '495';}            if ($poke=='498'){$pok = '498';}            if ($poke=='501'){$pok = '501';}         $lvl = "5"; //Уровень по умолчанию 5     $gen = "25"; // Гены по умолчанию 25     $ev = "6"; //Количество ev      $sex = ''.mt_rand(1,2); //Рандомный пол     $har = ''.mt_rand(1,26); //Рандомный характер     $datee = date('Y:m:G'); //Дата получения     include('cone.php'); //Подключаем соединение     $poks = "SELECT * FROM pokedex WHERE nom='$pok'"; //Вытаскиваем данные из покедекса   $hp = (($gen+($poks['hp']*2)+($ev/4)+100)*($lvl/100))+10; //Подсчитываем статы по формуле     $atk = ((($gen+($poks['atk']*2)+($ev/4))*($lvl/100))+5)*1;     $def = ((($gen+($poks['def']*2)+($ev/4))*($lvl/100))+5)*1;     $sa = ((($gen+($poks['sp_a']*2)+($ev/4))*($lvl/100))+5)*1;     $sd = ((($gen+($poks['sd_d']*2)+($ev/4))*($lvl/100))+5)*1;     $speed = ((($hen+($poks['spd']*2)+($ev/4))*($lvl/100))+5)*1;     $name = $poks['name']; //Имя покемона берём из декса     $query = "SELECT * from users where login = '$login'"; //Вытаскиваем данные с введённым логином     $result = mysql_query($query) or die("Query failed : " . mysql_error());     $query22 = "SELECT * from users where ip = '$ip'"; //Вытаскиваем данные с полученным айпи     $result2 = mysql_query($query22) or die("Query failed : " . mysql_error());     $num_rows2 = mysql_num_rows($result2);      $num_rows = mysql_num_rows($result);     if( $num_rows == 0 && $num_rows2 == 0){ //Проверяем есть ли пользователи с таким же логином или айпи     $query56 = "INSERT INTO users(login,password,gender,ip)"; //Если нет забиваем пользователя!     $query56.= "Values ('$login','$password','$gender','$ip')";     $result56 = mysql_query($query56,$link) or die("Query failed : " . mysql_error());     $query2 = "INSERT INTO pok_use(user,nom,name,lvl,hp_m,hp,hp_g,atk,atk_g,def,def_g,spd,spd_g,sp_a,sp_a_g,sp_d,sp_d_g,ev,poimka,har,pol,aktiv,start)";     $query2 .= "Values ('$login','$pok','$name','$lvl','$hp','$hp','$gen','$atk','$gen','$def','$gen','$speed','$gen','$sa','$gen','$sd','$gen','$ev','$datee','$ha   r','$sex','1','1')";     $result34 = mysql_query($query2,$link) or die("Query failed : " . mysql_error());     print("Юзер: $login, добавлен в базу!");     } else {     //Если такой юзер есть либо такой айпи выдаём ошибку     print("<script>alert('Данный логин занят, либо с вашего ip-адреса была произведена регистрация!'); location.href='reg.php';</script>");        }     mysql_close($link); //Обрываем соединение с базой               ?>      
   Код    <?   $v = $_POST:   include("cone.php");   if (isset($v) && !empty($v)):     if ( isset($v["login"]) && !empty($v["login"]) && preg_match("|^[a-z_-]+$|i", $v["login"]) ) $login = $v["login"];     else error("Login is incorrect"); 
     if ( isset($v["password"]) && !empty($v["password"]) && preg_match("|^[a-z_-]+$|i", $v["password"]) ) $password = $v["password"];     else error("Login is incorrect"); 
     $pokeList = Array(1, 4, 152, 155, 158); // etc     if ( isset($v["poke"]) && !empty($v["poke"]) && is_numeric($v["poke"]) && in_array($v["poke"], $pokeList)) $poke = $v["poke"];     else $poke = 1; 
     if ( isset($v["gender"]) && !empty($v["gender"]) && is_numeric($v["gender"]) && in_array($v["gender"], Array(1, 2))) $gender = $v["gender"];     else $gender = 1; 
     $poks = "SELECT hp, atk, def, sp_a, sd_d, spd FROM pokedex WHERE nom='$pok'"; // сделаем вид, что тут есть запрос     $hp = ((25+($poks['hp']*2)+(6/4)+100)*(5/100))+10;     foreach ($poks as $arg=>$val):      $$arg = calc($val);     endforeach;       $name = $poks['name']; //Имя покемона берём из декса       $query = "SELECT * from users where login = '$login'"; //Вытаскиваем данные с введённым логином       $result = mysql_query($query) or die("Query failed : " . mysql_error());       $query22 = "SELECT * from users where ip = '$ip'"; //Вытаскиваем данные с полученным айпи       $result2 = mysql_query($query22) or die("Query failed : " . mysql_error());       $num_rows2 = mysql_num_rows($result2);        $num_rows = mysql_num_rows($result);       if( $num_rows == 0 && $num_rows2 == 0):      $query56 = "INSERT INTO users(login,password,gender,ip)"; //Если нет забиваем пользователя!        $query56.= 'Values ($login,$password, $gender, '.$_SERVER["REMOTE_ADDR"].')';        $result56 = mysql_query($query56,$link) or die("Query failed : " . mysql_error());        $query2 = "INSERT INTO pok_use(user,nom,name,lvl,hp_m,hp,hp_g,atk,atk_g,def,def_g,spd,spd_g,sp_a,sp_a_g,sp_d,sp_d_g,ev,poimka,har,pol,aktiv,start)";        $query2 .= "Values (       $login, $pok, $name,       5, $hp, $hp,       25, $atk, 25,       $def, 25, $speed,       25, $sa, 25,       $sd, 25, $ev,       $datee, $ha r , $sex,       1,1)";        $result34 = mysql_query($query2,$link) or die("Query failed : " . mysql_error());        print("Юзер: $login, добавлен в базу!");       else:      print("<script>alert('Данный логин занят, либо с вашего ip-адреса была произведена регистрация!'); location.href='reg.php';</script>");       endif;   else:     /*template here*/   endif; 
   function error($str="")   {     return ( !empty($str) ) ? die("<script>alert(".$str.")</script>") : "";   } 
   function calc($val, $gen = 25, $ev = 6, $lvl = 5)   {     return ((($get+($val*2)+($ev/4))*($lvl/100))+5)*1   } 
   ?>      
   Это только пример, я мог опечататься в переменных, мог что-то пропустить. Но оригинальный код действительно невообразимый отстой, поэтому мне простительно.   Мораль этого треда в том, что можно написать меньше, но сильнее. + Спустя год Вам проще будет читать код. 
   И да, не забывайте комментировать код. Стандарты комментирования, стиля программирования можно найти с помощью гугла  
 
 Сообщение отредактировал cougraAcc - Среда, 22 Января 2014, 04:21  |  
| 
 | 
 |    |  
| -l33t-h4xx- | Дата: Среда, 22 Января 2014, 07:52 | Сообщение # 2 |  
 
участник 
Сейчас нет на сайте 
 
 | В твоих альтернативных примерах читаемость ещё хуже, чем в оригинальных фрагментах, если не считать последний, где она, в принципе, лучше, но тоже не сахар. Это так и должно быть? Насколько я знаю, стандарты стиля изобретают, чтобы код меньше напоминал макароны, а не наоборот.   Я, конечно, слышал, что у РНР-программистов выражение "хороший код" трактуется очень свободно, но чтобы вот так.
  Как правильно задавать вопросы
 
 Сообщение отредактировал -l33t-h4xx- - Среда, 22 Января 2014, 08:05  |  
| 
 | 
 |    |  
| Aevien | Дата: Среда, 22 Января 2014, 08:29 | Сообщение # 3 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Вообще лучше уметь пользоваться двумя стилями. Иногда без обоих стилей трудно.  
 |  
| 
 | 
 |    |  
| mbit | Дата: Среда, 22 Января 2014, 12:14 | Сообщение # 4 |  
| 
 частый гость 
Сейчас нет на сайте 
 
 | Цитата -l33t-h4xx- (  )  В твоих альтернативных примерах читаемость ещё хуже, чем в оригинальных фрагментах, если не считать последний, где она, в принципе, лучше, но тоже не сахар. Это так и должно быть?     На самом деле альтернативный синтаксис юзается повсюду профессионалами php и читается в разы лучше. Щас например мне режит глаз если не используется альтернативный метод. ) А вообще призываю всех использовать MVC и какой нить фреймворк. Самый лучший из всех что я юзал - Fuel Php. Поистине мощный фрейм и очень простой в освоении. Плюс у него сексуальная документация )))
 |  
| 
 | 
 |    |  
| cougraAcc | Дата: Среда, 22 Января 2014, 12:16 | Сообщение # 5 |  
 
Яркая личность GD 
Сейчас нет на сайте 
 
 | Цитата mbit (  )  А вообще призываю всех использовать MVC и какой нить фреймворк. Самый лучший из всех что я юзал - Fuel Php. Поистине мощный фрейм и очень простой в освоении. Плюс у него сексуальная документация )))     В чем связь между читабельностью и паттернами проектирования?
 |  
| 
 | 
 |    |  
| mbit | Дата: Среда, 22 Января 2014, 12:29 | Сообщение # 6 |  
| 
 частый гость 
Сейчас нет на сайте 
 
 | Цитата cougraAcc (  )  В чем связь между читабельностью и паттернами проектирования?      Читабельность всего приложения повышается в разы, чтобы не было быдлокода как Вы приводили выше (не Ваш). Да и любой серьёзный проект на нативном php не пишется ибо будет полная каша.
 |  
| 
 | 
 |    |  
| -l33t-h4xx- | Дата: Среда, 22 Января 2014, 12:48 | Сообщение # 7 |  
 
участник 
Сейчас нет на сайте 
 
 | Цитата mbit (  )  Щас например мне режит глаз если не используется альтернативный метод.     Ну это, наверное, дело привычки, хотя мне страшно представить какой-нибудь большой и сложный алгоритм, записанный в таком манере. Надеюсь, профессионалы всё-таки жалеют друг друга, и используют такой синтаксис умеренными порциями.
  Как правильно задавать вопросы
 |  
| 
 | 
 |    |  
| mbit | Дата: Среда, 22 Января 2014, 13:05 | Сообщение # 8 |  
| 
 частый гость 
Сейчас нет на сайте 
 
 | Цитата -l33t-h4xx- (  )  мне страшно представить какой-нибудь большой и сложный алгоритм, записанный в таком манере     сложные алгоритмы (например просчет чего либо) записываются без использования html кода. А вот вывод результатов уже в альтернативном методе с использованием html (Вьюхи). Мешать логику, работу с базой и html в одном месте = полный трэш.
 |  
| 
 | 
 |    |     
		
		 
 |