La domanda riguarda la typehinting delle interfacce di ruolo .
L' esempio di codice ha due DataMappers che digitano l'interfaccia di cui hanno bisogno nel costruttore,
Il tipo FooDataMapper suggerisce l'interfaccia Preparable. Perché dipende da esso e nessun altro metodo dalla dipendenza.
Nell'altro mapper, BarDataMapper ho sostituito il suggerimento tipo con ??? in quanto richiede sia l'interfaccia Preparable che Queryable.
Come gestisco questo (cosa dovrebbe sostituire ???), typehinting uno di essi non sarebbe sufficiente, dovrei creare una nuova interfaccia (forse una che estenda il precedente accennato) e suggerire questa nuova interfaccia?
L'esempio di codice è un esempio ridotto in PHP e il tipo hint (???) si trova nell'ultima classe dichiarata.
<?php
// TWO ROLE INTERFACES, SMALL SEGREGATED PART OF A DBAL
Interface Preparable {
public function prepare( .. );
}
Interface Queryable {
public function query( ... );
}
// ADAPTER IMPLEMENTS SEGREGATION
class DbalAdapter implements Preparable, Queryable {
private $dbal;
public function __construct($dbal)
{
private $this->dbal = $dbal;
}
public function prepare( .. )
{
..
return $this->dbal->prepare( .. );
}
public function query( .. )
{
..
return $this->dbal->query( .. );
}
}
// DATAMAPPER CTOR HINTS FOR METHODS IT NEEDS TO USE
class FooDataMapper implements DataMapper {
private $dbal;
public function __construct(Preparable $dbal)
{
$this->dbal = $dbal;
}
public function create(Foo $Foo)
{
..
$this->dbal->prepare( .. )
}
}
// DATAMAPPER CTOR HINTS FOR METHODS IT NEEDS TO USE
// BUT THIS TIME NONE OF THE ROLE INTERFACES MATCH, BUILD A NEW INTERFACE?
class BarDataMapper implements DataMapper {
private $dbal;
public function __construct(??? $dbal)
{
$this->dbal = $dbal;
}
public function SomeMethodThatNeedsBothPrepareNQuery(Bar $Bar)
{
..
$this->dbal->query( .. )
$this->dbal->prepare( .. )
}
}
La soluzione iniziale a cui sto lavorando è una nuova interfaccia che estende quelle necessarie.
Attenzione la denominazione delle classi nel codice sono solo per la visualizzazione, potrebbe anche essere Fooable, BarAble ...