Dire che ho questo codice:
if ($this->ship == "e") {
$this->price->addLine($this->price->base * $this->price->e, 0, "Export");
$this->price->total += $this->price->base * $this->price->e;
} elseif ($this->ship == "d") {
$this->price->addLine($this->price->base * $this->price->d, 0, "Domestic");
$this->price->total += $this->price->base * $this->price->d;
}
Ho più blocchi identici di codice come sopra. Ho anche un altro codice (diverso da $this->ship
) che è simile nella struttura. Fondamentalmente, questo codice aggiunge Line
a un PDF, dove la riga dice "Domestico" o "Esporta" insieme ad altre opzioni. Il codice sopra calcola anche il prezzo per quella linea e lo aggiunge al totale.
I miei pensieri su come refactoring questo:
Voglio rimuovere la duplicazione. Voglio anche rispettare i principi SOLID, cioè la separazione delle preoccupazioni. Vedo che il codice sopra fa due cose (calcola il prezzo e aggiunge un elemento pubblicitario al PDF). Posso sicuramente suddividere questo codice in due funzioni separate, ma poi mi ritrovo ancora con codice duplicato - Devo controllare se $this->ship
equivale a e
o d
in entrambe le posizioni. Non va bene. Se devo aggiungere una terza opzione, devo cambiare il codice in due punti.
Quindi posso spostare il mio controllo per e
o d
nel corpo principale del codice, ma ho ancora la duplicazione perché avrò
switch($this->ship)
{
case 'd': $cost = $this->getShippingCost($this->price->base, $this->price->d);break;
case 'e': $cost = $this->getShippingCost($this->price->base, $this->price->e);break;
}
Ottengo queste due lunghe code di codice praticamente per un singolo cambiamento di carattere. Mentre forse è abbastanza accettabile, non mi piace molto. Se devo cambiare il numero di parametri per esempio, o il parametro di base o ecc, dovrò cambiarlo in più di un posto.
Fondamentalmente, finora non importa in che modo faccio girare questo codice, finisco con qualche duplicazione da qualche parte. Voglio dire se è inevitabile, immagino sia okay. Ma qui vengo per un consiglio su come vedere se c'è un modo per separare le preoccupazioni e rimuovere la duplicazione e avere un numero minimo di posti (idealmente one
) quando devo cambiare qualcosa. può essere fatto?