Qual è il design preferibile per il mio Gateway? [chiuso]

6

Sto scrivendo una classe Gateway che estrae le informazioni da un documento HTML. Una delle responsabilità della classe è quella di attraversare una tabella nel documento ed estrarre i dati dalle sue righe. Sto cercando di decidere come rappresentare al meglio una riga, e ho trovato due soluzioni (in semi-pseudo codice).

Potrei rappresentare ciascuna riga come un array associativo:

class Gateway
{

    private $crawler;

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

    public function getRows()
    {
        $this->crawler->xpath('...')->each(function($node, $i)
        {
            return [
                'someInfo'      => $node->xpath('...'),
                'someOtherInfo' => $node->xpath('...')
            ];
        });
    }

}

Potrei alternativamente avvolgere ogni riga nel suo stesso Gateway (tuttavia, non so se è una buona pratica essere un'istanziazione hard-coding come questa):

class Gateway
{

    private $crawler;

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

    public function getRows()
    {
        $this->crawler->xpath('...')->each(function($node, $i)
        {
            return new RowGateway($node);
        });
    }

}

class RowGateway
{

    private $crawler;

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

    public function getSomeInfo()
    {
        return $node->xpath('...');
    }

    public function getSomeOtherInfo()
    {
        return $node->xpath('...');
    }

}

Qual è l'approccio preferibile qui? Sono aperto anche ad altri progetti.

    
posta user3124380 29.07.2015 - 01:47
fonte

1 risposta

0

Penso che dipenda dalla frequenza con cui RowGateway verrà usato nella tua applicazione: se molte parti dell'applicazione hanno bisogno di leggere tali informazioni, la creazione di una rappresentazione di dizionario ti lascia aperta a molti nomi di campo che dovranno essere manualmente cambiato se cambi vuoi implementare quell'oggetto, e una vera classe avrebbe più senso. Tuttavia, se tali informazioni verranno incapsulate da un'altra classe, o se il resto dell'applicazione rischia di chiamare direttamente Gateway->getRows() , allora è probabile che si ottenga un dizionario purché la documentazione per getRows() descriva chiaramente il dizionario in cui verrà restituita ogni riga.

Un altro cambiamento che farei è che RowGateway analizzi le righe sulla costruzione - altrimenti, una riga malformata non genererebbe un errore finché qualcuno non tenta di leggere quella riga, mentre penso che sarebbe meglio segnalarlo quando caricamento del file.

    
risposta data 20.10.2015 - 00:44
fonte

Leggi altre domande sui tag