Шаблон проектирования (design patterns) – это многократно используемые решения распространённых проблем, возникающих при разработке программного обеспечения.
Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Таким образом, за счёт шаблонов производится унификация терминологии, названий модулей и элементов проекта. Однако есть мнение, что слепое применение шаблонов из справочника, без осмысления причин и предпосылок выделения шаблона, замедляет профессиональный рост программиста, так как подменяет творческую работу механической подстановкой.
Что бы программист ни разрабатывал, на каком бы языке он ни писал, если он стремится к хорошему коду, он будет использовать шаблоны проектирования. Он стремится повторно воспользоваться решениями, которые оказались удачливыми ранее.
Паттерны проектирования представляют наилучшие решения часто встречаемых задач и упрощают повторное использование удачных решений. Шаблоны проектирования не должны ограничивать.
В зависимости от назначения выделяют:
1 Структурные шаблоны (structural patterns) – показывают, как объекты и классы объединяются для образования сложных структур.
2 Порождающие шаблоны (creational patterns) – контролируют процесс создания и жизненный цикл объектов.
3 Шаблоны поведения (behavioral patterns) – используются для организации, управления и объединения различных вариантов поведения объектов.
Каждый шаблон проектирования описывает задачи, с которыми программисту часто приходится сталкиваться. И затем описывает основу решения этой задачи таким образом, что вы можете воплотить это решение при разработке других программ, ни разу не повторившись.
Практические решения, в свою очередь, подразделяются на порождающие паттерны, структурные паттерны и паттерны поведения.
Порождающие паттерны или паттерны создания объектов: абстрактная фабрика, одиночка, прототип, строитель, фабричный метод.
Первая группа – это creational паттерны. Они в той или иной степени работают с механизмами создания объектов.
Singleton – обеспечиваем существование в системе ровно одного экземпляра некоторого класса.
Factory Method – делегируем процесс создания объектов классам-наследникам.
Prototype – клонируем объекты на основании некоторого базового объекта.
Builder – отделяем процесс создания комплексного объекта от его представления.
Abstract Factory – описываем сущность для создания целых семейств взаимосвязанных объектов.
Структурные паттерны: адаптер, декоратор, заместитель, компоновщик, мост, приспособленец, фасад. Они описывают создание более сложных объектов, либо упрощают работу с другими объектами системы.
Adapter – на основании некоторого класса создаём необходимый клиенту интерфейс.
Facade – описываем унифицированный интерфейс для облегчения работы с набором подсистем.
Composite – работаем с базовыми и составными объектами единым образом.
Decorator – динамически добавляем новую функциональность некоторому объекту, сохраняя его интерфейс.
Proxy – создаем объект, который перехватывает вызовы к другому объекту.
Bridge – разделяем абстракцию от интерфейса, позволяя им меняться независимо.
Flyweight – эффективно работаем с огромным количеством схожих объектов.
Паттерны поведения: интерпретатор, итератор, команда, наблюдатель, посетитель, посредник, состояние, стратегия, хранитель, цепочка обязанностей, шаблонный метод.
Они определяют эффективные способы взаимодействия различных объектов в системе.
Strategy – описываем набор взаимозаменяемых алгоритмов с единым интерфейсом.
Iterator – обеспечиваем доступ к коллекциям объектов без раскрытия внутреннего устройства этих коллекций.
Observer – создаем объект для отслеживания изменений в подсистеме и нотификации других подсистем.
Memento – сохраняем внутреннее состояние объекта для последующего использования без нарушения инкапсуляции.
Command – описываем объект, представляющий собой некоторое действие, которое можно выполнить в необходимый момент.
Interpreter – определяем способ вычисления выражений некоторого языка.
Mediator – создаем объект, которые регулирует взаимодействие между набором подсистем.
State – позволяем объекту менять свое поведение при изменении его внутреннего состояния.
Template method – описываем алгоритм, возлагая реализацию некоторых частей алгоритма на подклассы.
Visitor – отделяем алгоритм от структуры, с которыми алгоритм работает.
Chain of responsibility – пропускаем некоторый запрос через набор обработчиков событий, до тех пор пока запрос не будет обработан.
В PHP, Java и других объектно-ориентированных языках программирования программистами всего мира уже реализованы и описаны эти практические решения.
Сразу же стоит указать на ограничения по их применению.
Во-первых, шаблоны группы практических решений необходимо применять только тогда, когда имеется чёткое понимание необходимости их использования и дополнительная гибкость действительно необходима. Если за гибкость приходится платить усложнением дизайна либо ухудшением производительности, либо подгоном решения под выбранный паттерн, тогда применение паттернов практических решений необоснованно. Необоснованное применение сложных паттернов при решении простых задач усложняет задачу. Поэтому дальнейшее проектирование системы зависит от ответа на этот важный вопрос: использовать или не использовать при решении конкретной задачи готовое практическое решение.
Шаблоны проектирования нужны для того, чтобы помочь реализовать какую-то идею, а не для того, чтобы уместить идею в рамки некоторого паттерна.
Во-вторых, использовать шаблоны практических решений рационально только после изучение конкретного языка программирования.
4.1 CRUD
Create, Read, Update and Delete (создание, чтение, обновление и удаление)
Рассмотрим разработку CRUD по пунктам.
1 Маршрутизация (Get-данные)
Прописан маршрут в роутах (web.php):
Route::get('/home', 'HomeController@index');
2 Создание форм
Создана форма в home.blade.php (в папке views).
Код:
<form method='POST' action='home' enctype='multipart/form-data'>
<div class="form_inner">
</form> |
Сформированы необходимые массивы переменных в HomeController.php:
$_POST[‘name’];
$_POST[‘email’];
$_POST[‘send’];
3 Маршрутизация (POST-данные)
Для перехвата POST-данных использован метод Route::post
Прописан маршрут в роутах (web.php):
Route::post ('/home', 'HomeController@index');
4 Создание экшена POSTINDEX в контроллере HOMECONTROLLER
Код экшена PostIndex в HomeController.
PostIndex |
Public function postIndex(){ dd($_POST); // вывод на экран } |
5 Создание миграции, модели, REQUEST
Миграция, модель и request созданы в разделе 4.
Миграция: 2016_11_15_071254_Products;
Модель: Product.php;
Request: RequestProduct.php.
6 Работа с REQUEST в hoMECONTROLLER
Подключение request в контроллере HomeController:
Подключение request |
use App\Http\Requests; |
Для перехвата данных из request-запроса, прописана функция postIndex в HomeController.php. Данный контроллер будет помещать request-запросы в таблицу works через модель, с помощью множественной вставки (метод create()).
Функция postIndex в HomeController.php |
public function postIndex(Requests\RequestProduct $r) |
Добавление в таблицу нового поля user_id:
$r['user_id'] = Auth::user()->id;
Рисунок 11 – Поле user id в базе данных
Функция Index в HomeController.php |
public function index() |
7 Обработка кнопок «Удалить», «Редактировать»
7.1 Создание формы
Код HomeBlade.php |
@if(isset($all)) |
Asset() - cоздает URL для актива с использованием текущей схемы запроса (HTTP или HTTPS).
7.2 Маршрутизация
Прописаны следующие роуты в файле web.php:
Route::get('/home/delete/{id}', 'HomeController@getDelete'), Route::get('/home/edit/{id}', 'HomeController@getEdit').
7.3 Создание экшинов
Прописаны следующие функции для кнопок в HomeController.php.
Функция удаления товара по id |
public function getDelete($id=null){ |
Функция редактирования |
public function getEdit($id){ |
7.4 Создание шаблона edit.blade.php
edit.blade.php |
@if ($errors) |
7.5 Маршрутизация action postEdit
Прописан следующий route:
Route::post('/home/edit/{id}', 'HomeController@postEdit');
7.6 Создание action postEdit
HomeController |
public function postEdit(ProductRequest $r, $id){ |
8 Стиль кнопок
Код в style.css |
.menu { |
Дата | Выполнено, % |
---|---|
2020-05-29 02:37:47 | 10 |
2020-05-28 23:37:44 | 100 |
2020-05-28 23:37:56 | 100 |