Evitar dublicação de código

Enviada por Paulo Freitas Nobrega 
Paulo Freitas Nobrega
Evitar dublicação de código
01 de June de 2015 às 04:59PM
Boa Tarde Pessoal!

Estou com uma dúvida e gostaria da opinião de vocês. Possuo um código pessoal com o mesmo problema, porém vou utilizar duas class do próprio Doctrine DBAL como exemplo:

Doctrine\DBAL\Driver\PDOMySql
<?php
namespace Doctrine\DBAL\Driver\PDOMySql;

use Doctrine\DBAL\Connection;

/**
* PDO MySql driver.
*
* @since 2.0
*/
class Driver implements \Doctrine\DBAL\Driver
{
/**
* Attempts to establish a connection with the underlying driver.
*
* @param array $params
* @param string $username
* @param string $password
* @param array $driverOptions
* @return Doctrine\DBAL\Driver\Connection
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = array())
{
$conn = new \Doctrine\DBAL\Driver\PDOConnection(
$this->_constructPdoDsn($params),
$username,
$password,
$driverOptions
);
return $conn;
}

/**
* Constructs the MySql PDO DSN.
*
* @return string The DSN.
*/
private function _constructPdoDsn(array $params)
{
$dsn = 'mysql:';
if (isset($params['host']) && $params['host'] != '') {
$dsn .= 'host=' . $params['host'] . ';';
}
if (isset($params['port'])) {
$dsn .= 'port=' . $params['port'] . ';';
}
if (isset($params['dbname'])) {
$dsn .= 'dbname=' . $params['dbname'] . ';';
}
if (isset($params['unix_socket'])) {
$dsn .= 'unix_socket=' . $params['unix_socket'] . ';';
}
if (isset($params['charset'])) {
$dsn .= 'charset=' . $params['charset'] . ';';
}

return $dsn;
}

public function getDatabasePlatform()
{
return new \Doctrine\DBAL\Platforms\MySqlPlatform();
}

public function getSchemaManager(\Doctrine\DBAL\Connection $conn)
{
return new \Doctrine\DBAL\Schema\MySqlSchemaManager($conn);
}

public function getName()
{
return 'pdo_mysql';
}

public function getDatabase(\Doctrine\DBAL\Connection $conn)
{
$params = $conn->getParams();

if (isset($params['dbname'])) {
return $params['dbname'];
}
return $conn->query('SELECT DATABASE()')->fetchColumn();
}
}


Doctrine\DBAL\Driver\PDOPgSql
<?php

namespace Doctrine\DBAL\Driver\PDOPgSql;

use Doctrine\DBAL\Platforms;

/**
* Driver that connects through pdo_pgsql.
*
* @since 2.0
*/
class Driver implements \Doctrine\DBAL\Driver
{
/**
* Attempts to connect to the database and returns a driver connection on success.
*
* @return Doctrine\DBAL\Driver\Connection
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = array())
{
return new \Doctrine\DBAL\Driver\PDOConnection(
$this->_constructPdoDsn($params),
$username,
$password,
$driverOptions
);
}

/**
* Constructs the Postgres PDO DSN.
*
* @return string The DSN.
*/
private function _constructPdoDsn(array $params)
{
$dsn = 'pgsql:';
if (isset($params['host']) && $params['host'] != '') {
$dsn .= 'host=' . $params['host'] . ' ';
}
if (isset($params['port']) && $params['port'] != '') {
$dsn .= 'port=' . $params['port'] . ' ';
}
if (isset($params['dbname'])) {
$dsn .= 'dbname=' . $params['dbname'] . ' ';
}

return $dsn;
}

public function getDatabasePlatform()
{
return new \Doctrine\DBAL\Platforms\PostgreSqlPlatform();
}

public function getSchemaManager(\Doctrine\DBAL\Connection $conn)
{
return new \Doctrine\DBAL\Schema\PostgreSqlSchemaManager($conn);
}

public function getName()
{
return 'pdo_pgsql';
}

public function getDatabase(\Doctrine\DBAL\Connection $conn)
{
$params = $conn->getParams();
return $params['dbname'];
}
}

Há uma maneira de evitar a duplicação de código existente em ambos métodos _constructPdoDsn() ?

Fico no aguardo pessoal, por enquanto obrigado.
Lucas Tiago de Moraes
Re: Evitar dublicação de código
17 de June de 2015 às 05:25AM
Eu não vejo problema seu código ser assim, mas como você quer evitar duplicação de código, você deveria fazer tudo numa classe mais genérica, a classe PDO já é genérica então fica mais fácil de fazer, os parâmetros já estão sendo testados com isset().

Sei que agente as vezes se empolga em querer criar códigos o mais perfeito possível, mas devemos pensar se vai ser útil, se vai ser fácil dar manutenção, se o código vai melhorar no desempenho. Se você fizer uma classe mais genérica vai ser mais fácil entrar outro banco de dados no sistema, mas se seguir essa metodologia, você terá que criar uma classe para cada banco de dados.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.