Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пять моих «граблей» в разработке на PHP

Anna | 31.05.2014 | нет комментариев

Здравствуйте, уважаемые пользователи! В этом посте хотел бы поделиться своим личным навыком «наступания на грабли» во время разработки веб-приложений на языке программирования PHP. Текст будет увлекателен тем, кто хочет посмотреть на путь девелопера от «зеленого самоучки» до «профессионального разработчика», а также начинающим программистам, которые не вопреки узнать о том, «как не необходимо делать» и отчего. Допустимо даже кто-то припомнит себя и улыбнётся. Допустимо, кто-то легко улыбнётся с моего ветхого кода.

image

Все мое ознакомление с веб-разработкой начиналось в дальнем 2009-м году с распечатанных непонятных и трудных справочников и начальств, а также ковыряния кода (дюже плохого, кстати) open source CMS. Позднее я начал применять ООП и заботиться о «правильности», а ещё позднее — восхитительный фреймворк Yii, следственно каждый «отличный» код в посте будет демонстрироваться именно с применением этого фреймворка.

1. Дублирование кода. Теперь, смотря на свой код минувшых лет, я понимаю, что это были подлинно жуткие времена. У меня дублировалось фактически всё. Функции писались редко, а один и тот же код дозволено было увидеть в 3-четырех (ато и огромнее) местах. Отчего я так делал? Ну безусловно потому что я был неопытным. Это раз. И потому что считал (неумно считал), что написание функции — это трата времени и что значительно проще легко покопировать одно и тоже несколько раз.

Что было прежде:

$sql = 'SELECT `id` FROM `days` WHERE `sta`=1';
$r=mysql_query($sql,$conn);
$row=mysql_fetch_row($r);

$curday=$row[0];

if (($curday>=3 && $curday<=15) || ($curday>=45 && $curday<=55) || ($curday>=90 && $curday<=105))
	{
           $on_off=1;
	}else{
           $on_off=0;
	}

Что есть теперь:

            $curDay = BasicFunctions::getCurrentDay();
            $transferStatus = BasicFunctions::getTransferStatus($curDay);

            if ($transferStatus == 1) {
               ...
            }

Позднее я осознал, для чего делать «отлично»:

Самая значимая повод создания способа — снижение трудности программы. Способы создаются для того, Дабы дозволено было спрятать информацию и не думать о ней. Другие поводы создания способов — минимизация объема кода, упрощение сопровождения программы и снижение числа ошибок.

Ну и безусловно же, способы разрешают исполнять оптимизацию кода в одном месте, а не в нескольких. Они облегчают профилирование кода, направленное на определение неэффективных фрагментов. Если код централизован в способе, его оптимизация повысит быстродействие всех фрагментов, в которых данный способ вызывается как непринужденно, так и неявно.

2. Пересекание PHP и HTML. Да, я не применял патернов проектирования. Да, я не применял знаменитогоMVC. И это было 2-й моей неизбежной оплошностью. Отчего я так делал? Я отчего-то не думал о том, что код когда-то может быть переписан/дописан/изменен. Всё «хардкорилось» чисто с расчетом на сиюминутную выгоду.

Что было прежде:

echo '<br /><br /><center><img src="img/cap.jpeg" alt="Капитан" title="Капитан"> <b>Капитан</b></center>';

              $sql = 'SELECT * FROM `capitans` WHERE `club`='.$_SESSION['my_club'];
               $r=mysql_query($sql,$conn);
               $row=mysql_fetch_row($r);    $idp=$row[2];

if (!isset($row[2]) || $row[2]=="")
   {
   echo '<center>Капитан команды не назначен</center><br>';
   }else{

              $sql = 'SELECT * FROM `players` WHERE `id`='.$idp;
               $r=mysql_query($sql,$conn);
	       $row=mysql_fetch_row($r);

     ....

}

Что есть теперь:

$capitan = Capitans::model()->findByAttributes(array('club' => $user->club));

            $this->render('team', array(
                ...
                'capitan' => $capitan,
                ...
            ));

----------------------------------------

<?php if ($capitan == $item->pl_id) {  ?>
   <i title="Капитан" alt="Капитан"></i>
<?php } ?>

Позднее я осознал, для чего делать «отлично»:

Применения паттерна проектирования (при веб-разработке Почаще каждого это MVC) снижает трудность разработки за счёт готовых абстракций для решения целого ряда задач. Скажем, логические части приложения разделяются на самостоятельные области. Скажем, в том же MVC модель данных, пользовательский интерфейс и взаимодействие с пользователем поделены на три отдельных компонента. Для чего? После этого, Дабы модификация одного из компонентов оказывала минимальное влияние на остальные.

3. Не применение фреймворка. Я года два писал всё сам и не применял фреймворков. Я считал, что это что-то дюже трудное и на постижение «этого» у меня нет времени. Есть люди, которые твердо не применяют фреймворки, скажем, потому что они считают, что фреймворк — это open source, тот, что доступен всякому (т. е. всякий может просмотреть его код и обнаружить тесные места). Эти люди, которые так считают, пишут свои фреймворки, которые применяют в подальших планах. Лично я считаю, что теперь есть TOP-3 (либо TOP-5) тех фреймворков, которые проверены на знаменитых планах и отточены до максимума, следственно резон писать что-то свое тяготится к нулю. Если вы так не считаете, проголосуйте в конце поста.

Что было прежде (авторизация):

if (!isset($_POST['login']) || strlen($_POST['login'])<3)
{
    $errorsArray[] = 'Не введён логин либо он слишком короткий';
    $sum=$sum 1;
}
if (!isset($_POST['pass']) || strlen($_POST['pass'])<3)
{
    $errorsArray[] = 'Не введён пароль либо он слишком короткий';
    $sum=$sum 1;
}
if (!preg_match("/^([a-zA-Z0-9] )$/", $_POST['login']))
{
    $errorsArray[] = 'В поле "логин" присутствуют недопустимые символы';
    $sum=$sum 1;
}
if (!preg_match("/^([a-zA-Z0-9] )$/", $_POST['pass']))
{
    $errorsArray[] = 'В поле "пароль" присутствуют недопустимые символы';
    $sum=$sum 1;
}

$sql = 'SELECT * FROM `users` WHERE `login`="'.$_POST['login'].'"';
$r=mysql_query($sql,$conn);
$row=mysql_fetch_row($r);

if ($row[1]!==$_POST['login'] || $row[2]!==md5($_POST['pass']))
{
    $errorsArray[] = 'Неверный логин либо пароль';
    $sum=$sum 1;
}

Что есть теперь (авторизация):

	public function actionLogin()
	{
		$model=new LoginForm;

		if(isset($_POST['LoginForm']))
		{
			$model->attributes=$_POST['LoginForm'];
			// validate user input and redirect to the previous page if valid
			if($model->validate() && $model->login())
				$this->redirect(Yii::app()->user->returnUrl);
		}
		// render form
		$this->render('login',array('model'=>$model));
	}

Позднее я осознал, для чего необходимо применять фреймворк:

Всякий фреймворк — это, в первую очередь, комплект теснее готовых к применению эталонов, которые применяют, тратя гораздо поменьше времени, разработчики. Помимо этого, вокруг знаменитых open sourse фреймворков собирается солидное сообщество разработчиков. Что это значит? А это значит то, что будет легко подключить либо заменить человека в команде работающей над планом. Плюс, комьюнити создает массу готовых сторонних решений.

4. Классы? Не, не слышал. Классы не применялись вообще. Правда, при описанных выше «ляпах», о каких классах может идти речь :)

Что было прежде:

include_once("inc.php");
include_once("head.php");
include_once("system.php");

if (isset($_SESSION['login']) && isset($_SESSION['password']))
   {

  if (!isset($_GET['id']) || $_GET['id']=="")
     {

       ...

     }
   }

Что есть теперь (класс с комплектом базовых функций, которые применяются по каждому приложению):

/**
 * Class BasicFunctions
 * Same functions for all controllers
 */
class BasicFunctions {
   ...

    /**
     * Get info about last registered users
     * @ param type $limit - limit
     * @ return array - users
     */
    public static function getLastRegUsers ($limit) {
           $criteria=new CDbCriteria;
           $criteria->limit = $limit;
           $criteria->order = 'user_id DESC';
           $users = Users::model()->findAll($criteria);

           return $users;        
    }

   ...

}

Позднее я осознал, для чего делать «отлично»:

Самая значимая повод создания класса — это снижение трудности. Класс создается для сокрытия информации, Дабы о ней дозволено было не думать (да, верно так же не думать, как и в случае с способом). Вы сумеете позабыть о деталях и применять класс, не зная о его внутренней работе. Другие поводы создания классов — минимизация объема кода, упрощение сопровождения программы и снижение числа ошибок (да, верно так же, как и в случае с способом).

5. Не применение LIMIT’ов, JOIN’ов, запросы в циклах. Если бы теперь существавала инквизиция, то на огонь попадали бы все начинающие программисты, которые занимаются такой ересью :) Это, вероятно, самый бренный проступок программиста. Такими действиями я легко убивал быстродействие своих приложений. А, как вы знаете, быстродействие — это один из основных факторов, которые влияют на то, вернется ли 2-й раз к вам пользователь либо нет.

Что было прежде (беспричинный код):

              $sqlo = 'SELECT `id`, `pos` FROM `players`';
               $ro=mysql_query($sqlo);
	       while($rowo=mysql_fetch_row($ro))
		{
if ((int)$rowo[0]==(int)$ex2[0]){

$r_tmp_2 = mysql_query("SELECT `pos` FROM `pos` WHERE `id`=".$rowo[1]."");
$row_tmp_2=mysql_fetch_row($r_tmp_2);

            ...

				}
		}

Что есть теперь (беспричинный код):

            if ($addNewBuild = Yii::app()->request->getQuery('addNewBuild')) {
                $building = Buildings::model()->findByPk($addNewBuild); // Ищем первую запись по Primary Key и возвращаем её, если она обнаружена
                if ($building) {
                   ...
                }else{
                  ...
                }
           }

Позднее я осознал, для чего делать «отлично»:

Вы обязаны заботиться о быстродействии своих приложений. Вы обязаны заботиться о правильности написания SQL-запросов. Именно SQL-запросы составляют огромную часть приложения и именно они в основном влияют на быстродействие. Применение LIMIT’ов помогает избежать проходов по каждому записям таблицы, а применение JOIN’ов помогает избежать циклических запросов.

Вот такая вот история. Каждому спасибо за интерес, внимание, и улыбки (верю, они у вас были). Если вам данный пост понравился, в дальнейшем расскажу о том, как я «вышел» на фреймворки и на Yii в частности.

P. S. Про именование переменных теснее не стал писать (вы вероятно подметили $rowo, $r_tmp_2, $sqlo), как нибудь в иной раз непременно напишу.

Как вы относитесь к применению open sourse frameworks?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 47 человек. Воздержалось 15 человек.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB