Vuoi implementare un'interfaccia per connettersi a un database?

0

Ho trovato in un libro ( Learning PHP Design Patterns , Capitolo 2, pagina 25) un testo che spiega l'importanza delle interfacce nella progettazione OOP. L'autore ha concluso dando questo esempio:

<?php
interface IConnectInfo
{
    const HOST ="localhost";
    const UNAME ="phpWorker";
    const DBNAME = "dpPatt";
    const PW ="easyWay";
    function testConnection();
}
?>

Quindi implementa la suddetta interfaccia:

<?php
include_once('IConnectInfoMethod.php');
class ConSQL implements IConnectInfo
{
    //Passing values using scope resolution operator
    private $server=IConnectInfo::HOST;
    private $currentDB= IConnectInfo::DBNAME;
    private $user= IConnectInfo::UNAME;
    private $pass= IConnectInfo::PW;
    public function testConnection()
    {
        $hookup=new mysqli($this->server, $this->user, $this->pass, $this->currentDB);
        if (mysqli_connect_error())
        {
            die('bad mojo');
        }
        print "You're hooked up Ace! <br />" . $hookup->host_info;
        $hookup->close();
   }
}

$useConstant = new ConSQL();
$useConstant->testConnection();
?>

Domanda :

In questo caso (collegandoti a DB ...) lo faresti davvero nella pratica? Voglio dire, rende anche sens per progettare un'interfaccia ( IConnectInfo ) per questo scopo?
Concettualmente, penso che questa interfaccia non abbia un senso in quanto lo scopo di un'interfaccia è di condividere il codice tra diverse classi non correlate; e d'altra parte, potremmo progettare perfettamente una classe semplice invece di salvare digitando tutto quel codice non necessario.

Se mi sbaglio, per favore dimmi i vantaggi dell'interfaccia in questo scenario.

    
posta Billal Begueradj 18.08.2018 - 09:32
fonte

1 risposta

1

Oh, evviva, più cattivo consiglio che è stato stampato . Avendo comprato molti dei primi titoli di O'Reilly, è deludente.

...I think this interface does not make a sens as the purpose of an interface is to share code among several unrelated classes...

Le classi che implementano la stessa interfaccia non sono del tutto estranee; condividono uno standard per il modo in cui interagiscono con i loro consumatori. L'equivalente nel mondo reale direbbe che le auto prodotte da Ferrari e Tesla implementano la stessa interfaccia di base (volante, acceleratore e pedali dei freni) anche se i meccanismi interni delle auto sono molto diversi (benzina contro propulsione elettrica).

In questo caso, non è possibile separare le preoccupazioni e l'uso improprio delle interfacce in generale includendo un'implementazione parziale (le costanti cablate).

La prima preoccupazione è una struttura per conservare le informazioni di connessione (scritte in pseudocodice generico perché PHP non è il mio bailiwick):

class ConnectInfo {
    public host
    public uname
    public dbname
    public pw
}

Questo è uno scopo abbastanza compatto per meritare una classe che può essere istanziata e testata da sola. Un ConnectInfo potrebbe essere l'output di una classe che legge un file di configurazione o è istanziato con valori cablati durante lo sviluppo.

...and on the other hand, we could perfectly design a simple class instead to save typing all that unnecessary code.

Potresti, ma non usare la quantità di digitazione implicata come metrica per decidere se qualcosa debba essere fatto, specialmente se deve essere fatto una sola volta.

Una semplice classe funzionerebbe bene se si è certi che l'unico database a cui il programma avrà sempre bisogno di accedere è MySQL. Quelle garanzie sono raramente a prova di futuro, e la piccola quantità di sforzi aggiuntivi necessari per astrarre il concetto non è affatto affatto:

interface DatabaseConnection {
    public construct(ConnectInfo info)
    public testConnection()
    public runQuery(...)
      ...etc...
    public destroy()
}

// First implementation
class MySQLConnection implements DatabaseConnection { ... }

Ancora una volta, si noti che l'interfaccia offre esattamente una preoccupazione, ovvero la connessione a un'interazione con il database.

L'astrazione potrebbe ripagare durante lo sviluppo quando è necessario estrapolare un'implementazione per testare qualcosa quando il vero database non è ancora pronto o quando si deve confrontare con l'interrogazione di MySQL e qualcos'altro allo stesso tempo. Queste implementazioni aggiuntive funzioneranno con il tuo codice se sono testabilmente conformi all'interfaccia:

// Later implementations
class StubbedFakeConnection implements DatabaseConnection { ... }
class PostgreSQLConnection implements DatabaseConnection { ... }

Si noti che questa potrebbe essere stata semplicemente una classe astratta, ma nelle lingue che non supportano quelle o l'ereditarietà multipla, le interfacce spesso servono da sostituto.

Se desideri vedere le implementazioni del mondo reale di ciò che l'esempio nel libro potrebbe provare a trasmettere, consulta la documentazione per qualsiasi esistenti pacchetti di astrazione del database PHP , in particolare DOP .

    
risposta data 18.08.2018 - 15:38
fonte

Leggi altre domande sui tag