Sto imparando l'OOD e le buone pratiche in OOP e mi trovo alle prese con alcuni concetti chiave. Come pratica sto riscrivendo il mio livello di astrazione del database PDO personalizzato che era una singola classe di file con > 2000 linee di codice.
I imparato si dovrebbe usare l'ereditarietà se le classi si trovano in una relazione "è un" e una composizione se hanno una relazione "ha una". La composizione può essere implementata in questo modo, dato che eviterei php's traits
(esempio da qui ):
<?php
class Head {
}
class Human {
private $head;
public function __construct(Head $head) {
$this->head = $head;
}
}
$bob = new Human(new Head);
Buona. Tuttavia, nel mio caso voglio comporre una classe da B ad A, mentre ci possono essere più istanze di B. Precisamente, la classe database
principale (A) ha una o più classi table
(B). L'inserimento di un oggetto table
simile all'oggetto head
dell'esempio precedente potrebbe non essere quello che voglio. Successivamente, potrebbe esserci anche una classe select o una insert . Lo faccio solo per esercitarmi e imparo come posso mantenere le mie classi piccole nella dimensione del file. Devo iniettare tutte le dipendenze durante la costruzione e ricomporle? O dovrei istanziarli all'interno della classe database
principale e iniettare la connessione alle sottoclassi. La classe del database principale contiene l'oggetto PDO in '$ _connection'.
Q1: qual è il modo migliore per comporre le classi database
e table
.
Posso pensare a queste strategie.
Strategia n. 1
<?php
class db extends PDO{
private $_connection;
public function __construct($dsn){
$this->_connection = new parent::__construct($dsn);
}
public function createTable($def){
$table = new Table(this->_connection, $def);
}
}
Contro:
- Ho l'operatore
new
in un metodo che presumo in genere non è l'ideale. Meglio, dovrei iniettare tutte le istanze. - Devo dichiarare un metodo
createTable
nella classe base. Questo spam la mia classe base. Se la funzionalità aumenta, la classe base sarà sempre più grande, il che è ciò che volevo aggirare in primo luogo. Mi piacerebbe essere in grado di chiamarecreate
sull'oggetto tabella come inTable->create()
. - Non sono sicuro dell'iniezione della connessione alla classe del tavolo. È una buona pratica?
Strategia n. 2
<?php
class db extends PDO{
private $_connection;
public $table;
public function __construct($dsn, $table){
$this->_connection = new parent::__construct($dsn);
$this->table = $table;
}
}
$db = new db($dsn, new $Table)
$db->table->create($def);
Contro:
- Non ho il
connection
disponibile nella classe Tabella poiché non è né un bambino né la connessione viene iniettata manualmente.
Non penso che le classi db e Table siano in una relazione "è una" e quindi non dovrebbero essere ereditate l'una dall'altra. Ma attualmente mi manca una buona implementazione di composizione.
responsabilità
Ho provato a lavorare per una soluzione, ma ho bisogno di aiuto su quale potrebbe essere la migliore pratica per questo. La composizione, come postata con l'esempio (umano, testa), non sembra proprio qui nel caso di database e tabella. Spero di ricevere risposte utili, anche i link o le parole utili sono i benvenuti, mentre sto imparando e mi sembra difficile avere un momento per entrare nel livello successivo.