[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 в одном месте = полный трэш.
|
|
| |
|