Разделы
Теги | RSS © 2008 – 2017
Контакты
email: igor@veselov.sumy.ua
skype: utz0r2

14. Коротко ООП PHP - Что осталось


Тестирование - тесты дают уверенность, что ваша программа работает как задумано. Такие тесты можно запускать многократно. Успешное выполнение тестов покажет разработчику, что его изменения не сломали ничего, что ломать не планировалось
Тесты делят на:

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

функциональные — проверяют почти то же самое, но на более низком уровне. Зачастую используют эмуляторы браузеров.
Инструменты
Selenium
Mink
Codeception

интеграционные — отдельные модули, комбинируются и тестируются, как группа
Инструменты аналогичны модульным

модульные (юнит) — позволяет удостовериться, что функции, классы и методы работают, как ожидается с момента начала и до конца разработки
Инструменты
SimpleTest
Enhance PHP
PUnit
atoum

Тестирование происходит снизу вверх от модульных и заканчиваются приемочными.

Рефакторинг — это контролируемый процесс улучшения кода, без написания новой функциональности. Результатом рефакторинга является чистый код и простой дизайн
https://refactoring.guru/ru/refactoring

13. Коротко ООП PHP - Пишем фреймверк MVC
















12. Коротко ООП PHP - Примеры


Шаблон фасад
12. Коротко ООП PHP - Примеры
Паттерн фасад определяет интерфейс более высокого уровня, который упрощает использование подсистем.
<?php
class Stringify {

 	public function __construct($str)
 	{
 		$this->str = $str;
 		$this->_AddText();
 		$this->_AddDigits();
 		$this->_AddObject(new Stuff);
 		echo $this->str;
 	}

 	private function _AddText()
 	{
		$this->str .= ' | Adding Text';
 	}

 	private function _AddDigits()
 	{
		$this->str .= ' | Adding Ditgits: 402 ';
 	}

 	private function _AddObject(Stuff $stuff)
 	{
		$this->str .= $stuff->WriteCrap();
 	}

}

class Stuff
{
	public function WriteCrap()
	{
		return __CLASS__ . ' Writing Stuff';
	}
}

new Stringify('Intro Text');

Шаблон декоратор
12. Коротко ООП PHP - Примеры

Сущность работы паттерна декоратор заключается в "оборачивании" готового объекта новым функционалом, при этом весь оригинальный интерфейс объекта остается доступным (декоратор переадресует все запросы объекту).
<?php

class Player
{

	public $Data = array();

	public function __construct(array $info)
	{
		$this->Data = $info;
	}

}

abstract class Player_Decorater
{
	abstract public function Add($int);
}

class Player_Str_Decorate extends Player_Decorater
{
	public function __construct(Player $p)
	{
		$this->Player = $p;
		$this->Player->Data['str'] += 5;
	}
	public function Add($int)
	{
		$this->Player->Data['str'] += $int;
	}
}

class Player_Dex_Decorate extends Player_Decorater
{
	public function __construct(Player $p)
	{
		$this->Player = $p;
		$this->Player->Data['dex'] += 25;
	}
	public function Add($int)
	{
		$this->Player->Data['dex'] += $int;
	}
}

$P = new Player(array('str' => 10, 'dex' => 20));
echo $P->Data['str'];
echo $P->Data['dex'];

echo '<hr/>';

$Str = new Player_Str_Decorate($P);
echo $Str->Player->Data['str'];

$Dex = new Player_Dex_Decorate($P);
$Dex->Add(55);
echo $Dex->Player->Data['dex'];

Цепочка методов
class Cupcake
{

	public $Cupcake = array();

	public function Frosting($str)
	{
		$this->Cupcake['Frosting'] = $str;
		return $this;
	}

	public function Nuts($int)
	{
		$this->Cupcake['Nuts'] = (int)$int;
		return $this;
	}

	public function Sprinkles($int)
	{
		$this->Cupcake['Sprinkles'] = (int)$int;
		return $this;
	}

}

$cupcake = new Cupcake();

$cupcake->Nuts('10')->Frosting('chocolate')->Sprinkles('200');

print_r($cupcake->Cupcake);

11. Коротко ООП PHP - Инструменты


IDE: PhpStorm, Visual Studio Code, Notepad++, Eclipse, Atom, Sublime Text и много других

Composer - менеджер зависимостей для PHP
- Список композер пакетов по популярности: https://packagist.org/explore/popular

PHP Code Similarity Analyzer - инструмент анализа сходства php кода
PHP Code Sniffer - инструмент обнаруживает нарушения определенного набора стандартов кодирования
PHP CS Fixer - инструмент автоматически исправит код под стандарт
PHP Parallel Lint - проверка синтаксиса
PHP Mess Detector - (обнаружитель беспорядков), пытается выявить ошибки, которые не находит компилятор, не оптимальные алгоритмы, переусложнённый код, не используемые выражения и другие подобные проблемы.
PHPLOC - инструмент для быстрого измерения размера и анализируя структуру PHP проекта
PHPDCD - инструмент для определения мертвого кода ( declared функции и методы )
PHPCPD - инструмент для определения дубликатов кода
PHPUnit - фреймворк для юнит тестирования
CodeCeption - фреймвор для тестирования на базе BDD
Security Advisories Checker - инструмент для проверки ваших библиотек на уязвимости
Gulp - сборщик пакетов можно использовать и для php нужд https://www.npmjs.com/search?q=php
phpqa https://github.com/jmolivas/phpqa - библиотека собирающая в кучу большинство из этих инструментов.
XDebug - отладчик позволяет вам отследить исполнение вашего кода и контролировать содержимое вашего стека.

Запуск окружения: virtualbox, vagrant, контейнеры docker, openserver, denver, xampp.

Конечно инструментов намного больше их просто тьма, но тот кто захочет начать этого предостаточно.

10. Коротко ООП PHP - Шаблоны (паттерны) ООП. Типы шаблонов


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

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

Порождающие шаблоны
- Abstract Factory (Абстрактная фабрика) - позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение.
- Builder (Строитель) - используется для отделения процесса конструирования сложного объекта от его представления, так что в результате одного и того же конструирования могут получаться различные объекты. Этот паттерн очень похож на абстрактную фабрику, но в нем акцентируется пошаговое конструирование объекта - в отличие от фабрики, где конструируется семейство классов.
- Factory Method (Фабричный метод) - предоставляет подклассам интерфейс для создания экземпляров некоторого класса.
- Prototype (Прототип) - используется для задания вида создаваемых объектов на основе объекта прототипа, от которого происходит передача внутреннего состояния (создаёт новые объекты путём копирования прототипа).

Структурные шаблоны
- Adapter (Адаптер) - предназначен для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.
- Bridge (Мост) - используется для отделения абстракции от ее реализации так, чтобы и то и другое можно было изменять независимо.
- Composite (Компоновщик) - используется для компоновки объектов в древовидные структуры для представления иерархий, позволяя одинаково трактовать индивидуальные и составные объекты.
- Decorator (Декоратор) - используется для динамического расширения функциональности объекта. Является гибкой альтернативой наследованию.
- Facade (Фасад) - представляет собой унифицированный интерфейс вместо набора интерфейсов некоторой подсистемы. Паттерн фасад определяет интерфейс более высокого уровня, который упрощает использование подсистем.
- Flyweight (Приспособленец) - используется для уменьшения затрат при работе с большим количеством мелких объектов.
- Proxy (Прокси) - который предоставляет объект, который контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию контейнера).

Поведенческие шаблоны
- Chain of responsibility (Цепочка обязанностей) - служит для ослабления связи между отправителем и получателем запроса. При этом сам по себе запрос может быть произвольным.
- Command (Команда) - представляет собой действие. Объект команды заключает в себе само действие и его параметры.
- Interpreter (Интерпретатор) - решает часто встречающуюся, но подверженную изменениям, задачу.
- Iterator (Итератор) - представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из агрегированных объектов.
- Mediator (Медиатор) - обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.
- Memento (Хранитель) - позволяет, не нарушая инкапсуляцию, зафиксировать и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние.
- Observer (Наблюдатель) - создает механизм у класса, который позволяет получать экземпляру объекта этого класса оповещения от других объектов об изменении их состояния, тем самым наблюдая за ними.
- State (Состояние) - используется в тех случаях, когда во время выполнения программы объект должен менять свое поведение в зависимости от своего состояния.
- Strategy (Стратегия) - предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.
- Template Method (Шаблонный метод) - определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
- Visitor (Посетитель) - описывает операцию, которая должна быть выполнена над каждым объектом из некоторой произвольной структуры.

Подробно о каждом шаблоне с примерами UML диаграммами и тестами, можно прочитать здесь:
https://nixsolutions.github.io/design-patterns/
http://designpatternsphp.readthedocs.io/ru/latest/
https://github.com/kamranahmedse/design-patterns-for-humans

9. Коротко ООП PHP - Создание комментариев documentor


Считаеться что писать комментарии в коде, это плохо. Код должен быть понятен сам по себе. А единственные комментарии которые должны присутвовать это документирование с помощью докблоков ( всегда начинаеться с /** )
/**
 * It is
 * a PHP docblock
 */

Стандарт PHPDoc взят с языка Java. Важной составляющей докблоков являются теги и аннотации.
В PHP с помощью докблоков можно документировать такие элементы:
- функции;
- константы;
- классы;
- интерфейсы;
- трейты;
- константы классов;
- свойства;
- методы.
/**
 * Rabbit Class
 *
 * @version 0.1.0
 */
class Rabbit implements RabbitInterface
{
    const STATUS_RUNNING = 'running';
 
    /**
     * @var string $status Status
     */
    private $status;
 
    /**
     * Set `running` status for the rabbit
     *
     * @return $this
     */
    public function run()
    {
        $this->status = self::STATUS_RUNNING;
 
        return $this;
    }
}

@api (метод) — обозначает стабильные публичные методы, которые не будут менять свою семантику до следующего мажорного релиза.
@author (в любом месте) — указывает имя и имейл автора, который написал следующий код.
@copyright (в любом месте) — используется, чтоб поставить свой копирайт в коде.
@deprecated (в любом месте) — полезный тег, символизирует, что данный элемент исчезнет в будущих версиях. Обычно рядом пишут, какой код следует использовать взамен. Также большинство IDE подсвечивают использование устаревших методов отдельным стилем. Когда нужно подчистить устаревший код для нового релиза, то легко искать по этому тегу.
@example (в любом месте) — используется для размещения ссылки на файл или веб-страницу, где показан пример использования кода. На данный момент phpDocumentor заявляет о неполной поддержки возможностей этого тега.
@filesource (файл) — этот тег можно размещать только на самом начале php-файла, так как тег применим только к файлу и включит весь код файла в сгенерированную документацию.
@global (переменная) — на данный момент этот тег не поддерживается, возможно, будет реализован в следующих версиях, когда он будет переосмыслен.
@ignore (в любом месте) — докблок, где указан этот тег, не будет обрабатываться во время генерации документации, даже если в нем есть другие теги.
@internal (в любом месте) — чаще всего используется вместе с тегом @api, чтоб показать, что код предназначен для внутренней логики этой части программы. Элемент, обозначенный этим тегом, не будет включен в документацию.
@license (файл, класс) — что же он еще может делать, если не указывать тип лицензии для написанного кода.
@link (в любом месте) — используется для вставки ссылок, но, как пишет документация, полностью функциональность тега пока не поддерживается.
@method (класс) — применяется к классу и служит для описания магических методов, которые обрабатываются магической функцией __call().
@package (файл, класс) — разбиение кода на логические подгруппы. Когда вы помещаете классы в один namespace, вы тем самым показывает их функциональную схожесть. Если классы лежат в разных неймспейсах, но имеют одинаковый логический признак, их можно сгруппировать с помощью этого тега, например, если у вас классы работающие с корзиной заказа разбросаны по разным местам. Но лучше отказаться от такой практики, по код стайлу Symfony, например, этот тег не должен использоваться.
@param (метод, функция) — предназначен для описания входящих параметров функции. Важно также отметить, что если вы уже взялись описывать входящие параметры для конкретной функции через докблоки, то нужно описывать все, а не только первый или второй.
@property (класс) — так же, как и @method, этот тег размещается в докблоке для класса, но описывает свойства, доступ к которым будет обрабатываться через магические методы __get() и __set().
@property-read, @property-write (класс) — аналогично предыдущему тегу, но обрабатывают только один магический метод, __get() или __set() соответственно.
@return (метод, функция) — предназначен для описания значения, которое возвращает функция. Можно указать его тип, и PhpStorm подхватит его и будет выдавать подсказки, но об этом чуть позже.
@see (в любом месте) — с помощь этого тега можно вставлять ссылки на внешние ресурсы, как и с помощью @link, но также вставлять относительные ссылки на классы и методы.
@since (в любом месте) — можно указать версию, в которой появился кусок кода.
@source (в любом месте, кроме начала файла) — с помощью этого тега можно помещать в документацию участки исходного кода (задается строка начала и конца).
@throws (метод, функция) — используется для указания исключений, которые могут быть вызваны в данной функции.
@todo (в любом месте) — самый оптимистически тег, используется программистами, чтоб напомнить себе доделать что-то, когда-то в каком-то участке кода. IDE умеют распознавать этот тег и группируют все участки кода в отдельном окне, удобно для будущего поиска. Это общепринятый стандарт и используется очень часто.
@uses (в любом месте) — предназначен для отображения связи между разными участками кода. Он чем-то похож на @see, но разница в том, что @see создает однонаправленную ссылку, т.е. после перехода на новую страницу документации у вас не будет ссылки назад, а @uses в процессе его обработки ставит обратную ссылку, т.е. ссылку для обратной навигации.
@var (переменная) — используется для указания типа и описания переменных, как тех, что встречаются внутри функций, так и свойств класса. Следует учесть разницу между этим тегом и тегом @param. Тег @param используется только в докблоках для функций и описывает входящие параметры, а @var используется для документирования обычных переменных.
@version (в любом месте) — обозначает текущую версию программы, в которой появился данный класс, метод и т.д.
«»
Вверх