Melhores Práticas - PHPOO
Fala pessoal! Gostaria da opinião/sugestão de vocês sobre o seguinte caso:
(obs: apenas estudo)
Considere a Interface
<?php
/**
* @author Paulo Freitas Nobrega
* @brief Interface relacionada ao Adaptador PDO
* @package Db\Adapter\Pdo\Driver
*/
namespace Db\Adapter\Pdo\Driver;
/**
* @brief Interface de Driver
* @interface Driver
*/
interface Driver
{
/**
* Cria o DNS referente ao Driver
* @param array $elements Fornece os elementos necessarios para criacao do DNS
* @return string
*/
public function createDNS(array $elements);
}
E também sua implementação:
<?php
/**
* @author Paulo Freitas Nobrega
* @brief Driver relacionado ao Adaptador PDO
* @package Db\Adapter\Pdo\Driver
*/
namespace Db\Adapter\Pdo\Driver;
use Db\Adapter\Pdo\Driver\Driver;
use Db\Adapter\Pdo\Driver\ElementLabels;
/**
* @brief Driver MySQL
* @details Implementa o PDO para o acesso do PHP ao MySQL 3.x, 4.x e 5.x
* @class MySQL
*/
class MySQL implements Driver
{
/**
* Prefixo do Driver
*/
const PREFIX = 'mysql';
/**
* Cria o DNS referente ao Driver
* @param array $elements Fornece os elementos necessarios para criacao do DNS
* @return string
*/
public function createDNS(array $elements)
{
if(!array_key_exists(ElementLabels::HOST,$elements))
{
throw new InvalidArgumentException( 'Servidor não informado' );
}
if(!array_key_exists(ElementLabels::DBNAME, $elements))
{
throw new InvalidArgumentException( 'Banco de dados não informado' );
}
$dns = self::PREFIX . ':' . ElementLabels::HOST . '=' . $elements[ElementLabels::HOST] . ';';
$dns .= ElementLabels::DBNAME . '=' . $elements[ElementLabels::DBNAME] . ';';
$dns .= array_key_exists(ElementLabels::PORT, $elements) ? ElementLabels::PORT . '=' . $elements[ElementLabels::PORT] . ';' : '';
return $dns;
}
}Por fim ElementLabels:
<?php
/**
* @author Paulo Freitas Nobrega
* @brief Classe relacionada ao Adaptador PDO
* @package Db\Adapter\Pdo\Driver
*/
namespace Db\Adapter\Pdo\Driver;
/**
* @brief Etiquetas dos elementos
* @details Os elementos fornecem a base para criação dos DNS's de cada Driver. Suas etiquetas possíveis são:
* @li host - Servidor
* @li dbname - Nome do banco de dados
* @li port - Porta de acesso
* @li charset - Codificação de caracteres
* @class ElementLabels
*/
class ElementLabels
{
/**
* Servidor
*/
const HOST = 'host';
/**
* Nome do banco de dados
*/
const DBNAME = 'dbname';
/**
* Porta de acesso
*/
const PORT = 'port';
}
Minha dúvida:
Um Driver PostgreSQL, por exemplo, possuí exatamente os mesmos elementos para gerar o DNS do Driver MySQL, exceto o valor de seu prefixo. Porém um Driver MS SQL Server possuí elementos não comuns a estes citados. O dilema é que a grande maioria dos Driver utilizam os mesmos elementos, porém há exceções.
Então segue a pergunta: Como evitar, neste caso, a duplicação de código. Mantendo a flexíbilidade, um código elegante e respeitando a OO?
Discussão (3)
Carregando comentários...