Come dividere una classe che è un'implementazione dell'interfaccia?

0

Diciamo che c'è una classe chiamata AccountingService . Usando questa classe, prendo tutti i tipi di record di e-commerce come products , customers , ecc. Il recupero avviene all'interno di un'azione del controller. Una volta recuperato, dovrei elaborare e salvare questi record in qualche tipo di negozio di e-commerce.

Quello che voglio fare è creare un'implementazione di Shop

namespace PrestaShop;

use Shop\ShopInterface;

class Shop implements ShopInterface
{
    public function saveProduct(array $products)
    public function saveProductQuantities(array $productQuantities)
    public function saveCustomers(array $customers)
    public function getOrder($orderReference)
}

Il problema è che i metodi sono incredibilmente lunghi, poiché molte chiavi esterne, tabelle pivot e relazioni devono essere salvate nelle tabelle MySQL. Vorrei estrarre product , customer , quantitiy metodi in classi / componenti separati che funzionano come dipendenze per questa classe.

Sto usando array perché i record recuperati sono in blocco (diciamo 10k), quindi non posso creare un'istanza di un oggetto per ogni record e salvarlo tramite record attivo.

L'uso di oggetti pattern separati Repository non ha senso per me, perché tutti questi oggetti product , customer , quantity sono correlati e hanno tabelle collegate.

Sto cercando consigli su come suddividere l'implementazione PrestaShop\Shop in classi più piccole.

Qualsiasi altro consiglio su hwo per strutturare questa logica dell'app è ben accetto.

    
posta gskema 23.10.2015 - 13:40
fonte

1 risposta

2

Dovresti dividere l'interfaccia. I clienti e i prodotti non sono correlati quindi avere un'interfaccia con i metodi saveProduct e uno con saveCustomer-metodi ridurranno la quantità di codice nelle implementazioni.

Se non puoi dividere l'interfaccia (perché non è sotto il tuo controllo, per esempio), crea semplicemente un paio di classi che contengono le diverse implementazioni divise, inietta queste classi nella classe che implementa l'interfaccia e instradare le chiamate verso quelle classi. Questi possono di nuovo avere classi con ruoli specifici inseriti in essi (se un cliente contiene prodotti, un CustomerSaver può iniettare un ProductSaver in modo che possa usare i metodi su quella classe).

Tutto il codice che è generico (cioè comune a quelle classi) può essere inserito in una classe base da cui derivano tutte le classi sotto-risparmio.

namespace PrestaShop;

use Shop\ShopInterface;

class ProductSaver
{
    public function saveProduct(array $products)
    {
         //implement here
    }
}

class Shop implements ShopInterface
{
    function __construct($productSaver, $customerSaver)
    {
        $this->productSaver = $productSaver;
        $this->customerSaver = $customerSaver;
    }

    public funtion saveProduct(array $products)
    {
        $this->productSaver->saveProduct($products);
    }

    //and so on...
}
    
risposta data 23.10.2015 - 14:17
fonte

Leggi altre domande sui tag