Come posso essere sicuro che la sottoclasse abbia impostato una proprietà (obbligatoria) nel suo costruttore?

3

Ho una classe base chiamata ProductRepository e ci sono altre classi che la estendono; come PushProductRepository o SocialProductRepository.

class ProductRepository implements ProductRepositoryInterface
{
    private $product;

    public function __construct(Product $product)
    {
        $this->product = $product;
    }

    public function create($name, $language, $type)
    {
        $this->product->create([
            'name' => $name,
            'language' => $language,
            'type' => $type
        ]);
    }
}

Come puoi vedere, esiste un parametro tipo nella funzione di creazione. Potrebbero essere i valori come "push" o "social". Prenderà il valore dalle classi che lo estendono. Invece di inviarlo come parametro; Voglio avere un approccio diverso. Creerò una proprietà in ProductRepository come type e userò $ this- > type nella funzione create.

Ma voglio essere sicuro che ogni classe che estende ProductRepository dovrebbe impostare questa proprietà nella sua classe (probabilmente nel suo costruttore)

Come posso essere sicuro che ogni classe che estende ProductRepository imposterà type nel suo costruttore? C'è un modo migliore per raggiungere questo obiettivo? Questo viola qualcosa? Se è così, come posso prevenirlo?

    
posta Bold P. 27.12.2017 - 15:38
fonte

1 risposta

3

Senza approfondire se è un approccio buono o cattivo e solo rispondendo alla domanda how? , vorrei fare ProductRepository abstract, con il metodo getType() astratto. Quindi sembrerebbe il seguente:

abstract class ProductRepository
{
    private $product;

    public function __construct(Product $product)
    {
        $this->product = $product;
    }

    public function create($name, $language, $type)
    {
        $this->product->create([
            'name' => $name,
            'language' => $language,
            'type' => $this->getType()
        ]);
    }

    abstract protected function getType();
}

Per quanto ne so, type ha qualcosa a che fare con un prodotto stesso, cioè con dominio, quindi scoraggerei la costruzione di questa logica nel repository. Che ne dici di creare un prodotto con una specifica proprietà type ? Sembra molto più pulito per me - almeno la logica di dominio risiede nel dominio. E non capisco perché il metodo create appartiene a product . Probabilmente dovresti avere ProductRepository in questo modo:

class ProductRepository
{
    private $dataStorage;

    public function __construct(DataStorage $dataStorage)
    {
        $this->dataStorage = $dataStorage;
    }

    public function add(Product $product)
    {
        $this->dataStorage
            ->insert(
                $product->getName(),
                $product->getLanguage(),
                $product->getType()
            )
        ;
    }
}
    
risposta data 27.12.2017 - 15:59
fonte