Понедельник, 23 Декабря 2024, 20:21

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[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
}

?>


Это только пример, я мог опечататься в переменных, мог что-то пропустить. Но оригинальный код действительно невообразимый отстой, поэтому мне простительно.
Мораль этого треда в том, что можно написать меньше, но сильнее. + Спустя год Вам проще будет читать код.

И да, не забывайте комментировать код. Стандарты комментирования, стиля программирования можно найти с помощью гугла smile


Сообщение отредактировал cougraAcc - Среда, 22 Января 2014, 04:21
-l33t-h4xx-Дата: Среда, 22 Января 2014, 07:52 | Сообщение # 2
участник
Сейчас нет на сайте
В твоих альтернативных примерах читаемость ещё хуже, чем в оригинальных фрагментах, если не считать последний, где она, в принципе, лучше, но тоже не сахар. Это так и должно быть? Насколько я знаю, стандарты стиля изобретают, чтобы код меньше напоминал макароны, а не наоборот.
Я, конечно, слышал, что у РНР-программистов выражение "хороший код" трактуется очень свободно, но чтобы вот так.


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Среда, 22 Января 2014, 08:05
AevienДата: Среда, 22 Января 2014, 08:29 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
Вообще лучше уметь пользоваться двумя стилями. Иногда без обоих стилей трудно. smile
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 в одном месте = полный трэш.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг