Привет всем! Работаю я в одной компании по написанию различных web систем, к нам довольно часто приходят на собеседование, и оказалось, что довольно трудно найти человека которые знает что такое паттерны, а еще сложнее того, кто умеет ими пользоваться. А ведь паттерны, это ничто иное как решение тривиальных задач. По идеи это то, что начинающий программист должен сразу изучить и понять. В интернете довольно много статей на эту тему с примерами, но не все понятны и прозрачны. Я хотел бы рассказать о них по своему. В каждом посте я буду рассказывать об одном паттерне. Для кого эта статья, для тех кто знает что такое ООП (наследование, полиморфизм, инкапсуляция и т.д), также знает какие виды паттернов бывают. Я буду рассматривать их в произвольном порядке. Сегодня хотелось бы поговорить о Strategy Pattern.
Основная задача:
Главная идея в том, что бы у вас на каждый случай был класс. Ниже, мы рассмотрим пример с валидацией юзера. То есть, для валидации каждого поля мы создадим отдельный класс. Немножко громозко для случая с валидацией, но для примера, самое оно. Ну вот получили кучу классов, и что??? Правильно у нас еще будет и связующий абстрактный класс. Если говорить совсем просто то Strategy Pattern — это полиморфизм в чистом виде). Итак, что нам надо:
1. Один абстрактный класс, содержащий одинаковые для каждого случая методы
2. По классу на каждый случай, которые наследуют абстрактный класс и предназначены для конкретного случая
Классы буду содержать реализацию поставленной задачи.
Абстрактный класс:
<?php
class Validations {
public $error;
// конструктор
function Validations ()
{
$this->validate();
}
// абстрактный метод, который вызывается здесь в конструкторе, но будет определен в дочерних классах.
abstract function validate() {}
function setError ($msg)
{
$this->errorMsg[]=$msg;
}
function getError ()
{
return array_pop($this->errorMsg);
}
// проверяет вилидно ли наше значение
function isValid ()
{
if ( isset ($this->errorMsg) )
{
return false;
}
else
{
return true;
}
}
}
?>
Ну все готово, теперь клепаем классики наследники на каждый случай, приставим что случая всего 2, проверка пароля и логина
Класс-наследник для проверки логина
<?php
class ValidateLogin extends Validations {
private $user;
//конструктор
function ValidateUser ($user)
{
$this->user=$user;
$valid=new Validations();
}
// Проверяет, корректно ли заполнено поле login,
// если нет - пишем сообщение о ошибке в $error
function validate()
{
if (!preg_match('/^[a-zA-Z0-9_]+$/',$this->user ))
{
$this->setError('Логин содержит заприщенные символы');
}
if (strlen($this->user) < 6 )
{
$this->setError('Логин слишком короткий');
}
if (strlen($this->user) > 20 )
{
$this->setError('Логин слишком длинные');
}
}
}
?>
Проверяем пароль:
<?php
class ValidatePassword extends Validations {
//Private $pass содержимое поля password
var $password;
//конструктор
function ValidatePassword ($pass)
{
$this->pass=$pass;
$valid=new Validations();
}
function validate()
{
if (strlen($this->pass) < 6 )
{
$this->setError('Парль слишко короткий');
}
}
}
?>
Все, испытываем
<?
$checkLogin=new ValidateLogin('mylogin');
$checkPassword=new ValidatePassword('пароль');
if(!$checkLogin->isValid() || !checkPassword->isValid())
{
тут пишем то, что должна сделать программа если логин и пароль не верен.
}
?>
Вот и все! В реальной программе для проверки логин и пароля, конечно делать не стоит. P.S Я понимаю, что тут много есть людей которые считают такое детским садом, поэтому предупреждаю что это для новичков. Спасибо за внимание.
Автор: vov4ik08