Вторник, 14 Июля 2020, 04:44

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » [PHP] Давайте писать хороший код (Альтернативный синтаксис, минификация кода, читаемость)
[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 в одном месте = полный трэш.
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » [PHP] Давайте писать хороший код (Альтернативный синтаксис, минификация кода, читаемость)
  • Страница 1 из 1
  • 1
Поиск:

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