Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Таким образом, за счёт шаблонов производится унификация терминологии, названий модулей и элементов проекта. Однако есть мнение, что слепое применение шаблонов из справочника, без осмысления причин и предпосылок выделения шаблона, замедляет профессиональный рост программиста, так как подменяет творческую работу механической подстановкой.
Что бы программист ни разрабатывал, на каком бы языке он ни писал, если он стремится к хорошему коду, он будет использовать шаблоны проектирования. Он стремится повторно воспользоваться решениями, которые оказались удачливыми ранее.
Паттерны проектирования представляют наилучшие решения часто встречаемых задач и упрощают повторное использование удачных решений. Шаблоны проектирования не должны ограничивать.
В зависимости от назначения выделяют:
1 Структурные шаблоны (structural patterns) – показывают, как объекты и классы объединяются для образования сложных структур.
2 Порождающие шаблоны (creational patterns) – контролируют процесс создания и жизненный цикл объектов.
3 Шаблоны поведения (behavioral patterns) – используются для организации, управления и объединения различных вариантов поведения объектов.
Каждый шаблон проектирования описывает задачи, с которыми программисту часто приходится сталкиваться. И затем описывает основу решения этой задачи таким образом, что вы можете воплотить это решение при разработке других программ, ни разу не повторившись.
Практические решения, в свою очередь, подразделяются на порождающие паттерны, структурные паттерны и паттерны поведения.
1 Порождающие паттерны или паттерны создания объектов: абстрактная фабрика, одиночка, прототип, строитель, фабричный метод.
Первая группа – это creational паттерны. Они в той или иной степени работают с механизмами создания объектов.
Singleton – обеспечиваем существование в системе ровно одного экземпляра некоторого класса;
Factory Method – делегируем процесс создания объектов классам-наследникам;
Prototype – клонируем объекты на основании некоторого базового объекта;
Builder – отделяем процесс создания комплексного объекта от его представления;
Abstract Factory – описываем сущность для создания целых семейств взаимосвязанных объектов.
2 Структурные паттерны: адаптер, декоратор, заместитель, компоновщик, мост, приспособленец, фасад. Они описывают создание более сложных объектов, либо упрощают работу с другими объектами системы.
Adapter – на основании некоторого класса создаем необходимый клиенту интерфейс;
Facade – описываем унифицированный интерфейс для облегчения работы с набором подсистем;
Composite – работаем с базовыми и составными объектами единым образом;
Decorator – динамически добавляем новую функциональность некоторому объекту, сохраняя его интерфейс;
Proxy – создаем объект, который перехватывает вызовы к другому объекту;
Bridge – разделяем абстракцию от интерфейса, позволяя им меняться независимо;
Flyweight – эффективно работаем с огромным количеством схожих объектов.
3 Паттерны поведения: интерпретатор, итератор, команда, наблюдатель, посетитель, посредник, состояние, стратегия, хранитель, цепочка обязанностей, шаблонный метод.
Они определяют эффективные способы взаимодействия различных объектов в системе.
Strategy – описываем набор взаимозаменяемых алгоритмов с единым интерфейсом;
Iterator – обеспечиваем доступ к коллекциям объектов без раскрытия внутреннего устройства этих коллекций;
Observer – создаем объект для отслеживания изменений в подсистеме и нотификации других подсистем;
Memento – сохраняем внутреннее состояние объекта для последующего использования без нарушения инкапсуляции;
Command - описываем объект, представляющий собой некоторое действие, которое можно выполнить в необходимый момент;
Interpreter - определяем способ вычисления выражений некоторого языка;
Mediator - создаем объект, которые регулирует взаимодействие между набором подсистем;
State - позволяем объекту менять свое поведение при изменении его внутреннего состояния;
Template method - описываем алгоритм, возлагая реализацию некоторых частей алгоритма на подклассы;
Visitor - отделяем алгоритм от структуры, с которыми алгоритм работает;
Chain of responsibility - пропускаем некоторый запрос через набор обработчиков событий, до тех пор, пока запрос не будет обработан.
В PHP, Java и других объектно-ориентированных языках программирования программистами всего мира уже реализованы и описаны эти практические решения.
Сразу же стоит указать на ограничения по их применению.
Во-первых, шаблоны группы практических решений необходимо применять только тогда, когда имеется четкое понимание необходимости их использования и дополнительная гибкость действительно необходима. Если за гибкость приходится платить усложнением дизайна либо ухудшением производительности, либо подгоном решения под выбранный паттерн, тогда применение паттернов практических решений необоснованно. Необоснованное применение сложных паттернов при решении простых задач усложняет задачу. Поэтому дальнейшее проектирование системы зависит от ответа на этот важный вопрос: использовать или не использовать при решении конкретной задачи готовое практическое решение.
Шаблоны проектирования нужны для того, чтобы помочь реализовать какую-то идею, а не для того, чтобы уместить идею в рамки некоторого паттерна.
Во-вторых, использовать шаблоны практических решений рационально только после изучение конкретного языка программирования.
Create, Read, Update and Delete (создание, чтение, обновление и удаление).
Рассмотрим разработку CRUD по пунктам.
1 Маршрутизация (Get-данные)
Прописан маршрут в роутах (web.php):
Route::get('/News', 'NewsController@index');
2 Создание форм
Создана форма в news.create.php (в папке views).
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-4 well well-sm">
<legend>
<?php echo validation_errors(); ?>
</legend>
<?php echo form_open('news/create') ?>
<input class="form-control" name="title" placeholder="…" type="text" /><br />
<textarea name="shorttext" id="shorttext" class="form-control" rows="4" cols="15" required="required"
placeholder="…"></textarea><br/>
<textarea name="text" id="text" class="form-control" rows="7" cols="25" required="required"
placeholder="…"></textarea>
<button class="btn btn-lg btn-primary btn-block" type="submit">
…
</button>
</form>
</div>
</div>
Сформированы необходимые массивы переменных в create.php:
$_POST[‘name’];
$_POST[‘email’];
$_POST[‘send’];
3 Маршрутизация (POST-данные)
Для перехвата POST-данных использован метод Route::post
Прописан маршрут в роутах (view.php):
Route::post ('/home', view @index');
4 Создание экшена POSTINDEX в контроллере view
Код экшена PostIndex в view.
<?php echo $news_item['title']; ?>
<?php echo $news_item['text']; ?>
5 Создание миграции, модели, auth
Миграция, модель и auth созданы в разделе 4.
Подключение request в контроллере HomeController:
use App\Http\Requests;
use Auth;
use Application\Product;
Для перехвата данных из request-запроса, прописана функция postIndex в HomeController.php. Данный контроллер будет помещать request-запросы в таблицу works через модель, с помощью множественной вставки (метод create()).
public function postIndex(Requests\RequestProduct $r)
{
$r['id'] = Auth::post()->id;
$r['autor_id'] = '-';
$r['title'] = '-';
$r['excerpt'] = '-';
$r['body'] = '-';
$r['image'] = '-';
$r['slug'] = '-';
$r['meta_description'] = '-';
$r['meta_keywords'] = '-';
$r['status'] = '-';
$r['created_at'] = '-';
$r['updated_at'] = '-';
Product::create($r->all());
return redirect('news');
Добавление в таблицу нового поля:
$r['post_id'] = Auth::post()->id;
Рисунок 13 – Поле id в базе данных
Демонстрация работы
Добавление новости:
Рисунок 14 – Добавление новости
В базе добавился данный товар с id=1.
Рисунок 15 – База данных
Рисунок 16 – Добавленная новость
В 4 разделе рассмотрено применение шаблона проектирования практических решений, показано на примерах создания CRUD.
Дата | Выполнено, % |
---|---|
2020-06-24 08:35:49 | 10 |
2020-04-08 08:17:44 | 1 |
2020-04-19 00:43:51 | 30 |
2020-05-20 18:19:39 | 50 |
2020-05-28 12:41:34 | 50 |
2020-05-28 12:41:42 | 70 |
2020-05-28 14:19:34 | 94 |
2020-05-31 08:57:48 | 100 |