Сегодня мы поговорим о базовом паттерне проектирования - шлюзе. Данный паттерн поможет нам избежать всех издержек, которые мы получаем при использовании внешних, не объектных ресурсов.
Описание
Почти всегда при написании программ нам приходится учитывать внешние ресурсы без которых нам не обойтись. Примером таких ресурсов может быть реляционная база данных или API какого-либо интернет-сервиса. Т.к. мы зачастую не контролируем программный код используемый для доступа к данным ресурсам мы не можем быть уверены в том, что он будет оставаться неизменным. Также часто API данных ресурсов не является объектно-ориентированным и соответственно такое смешивание не добавляет "чистоты" архитектуре приложения.
Также серьёзной проблемой, является то что код становится не очевидным. Тесная связанность, создаваемая при использовании API внешних ресурсов, делает любые изменения сложными и порождает скрытые ошибки.
Так как одной из главных проблем является именно не объектно-ориентированная структура интерфейса этих ресурсов, то очевидным решением является создание объектной обёртки для доступа к этим ресурсам. При этом нужно создавать объекты структура которых будет такой же как у любого другого объекта вашей системы, т.е. она должна максимально естественно отображать внешний ресурс. Каждый запрос к таким объектам приводит к вызову методов внешнего API. Такая инкапсуляция приводит к значительным улучшениям, теперь доступ к внешним ресурсам во-первых сосредоточено в одном месте, во-вторых скрывает изменчивый не объектный интерфейс. Адаптеры должны значительно улучшить архитектуру системы и сделать её более приспособленной к поддержке, расширению и рефакторингу.
Реализация
И по традиции рассмотрим пример на php:
<?php
class DBSimpleGateway{
protected $connection;
public function __construct($db_host, $db_user_name, $db_password, $db_name) {
//Устанавливаем соединение с сервером MySQL
}
public function query($query){
//Выполняем запрос
}
public function reConnect($db_host, $db_user_name, $db_password, $db_name){
//Выполняем пересоединение
}
public function disconnect(){
//Разрываем соединение
}
public function getError(){
//Возвращаем ошибку
}
public function getLastInsertId(){
//ID последней вставленной записи
}
}
Этот простой пример показывает, как можно создать шлюз для реляционной базы данных. Я не стал приводить реализацию методов, т.к. пример довольно тривиальный да и реализация в данном контексте нас не очень волнует. Главное преимущество такого рода абстракций над API ресурсов в более прозрачном интерфейсе, теперь при необходимости мы можем передавать объект класса DBSimpleGateway методам и функциям, которые работают с базой данных и при этом не боятся сильного связывания. При каких-либо изменениях API или при необходимости оптимизировать код доступа к БД (например при добавлении кэширования) мы можем без проблем переписать реализацию класса при этом сохранив интерфейс и соответственно работоспособность системы.
На этом всё, спасибо за внимание! Подписывайтесь на RSS-канал и не забывайте оставлять свои комментарии ;)