Che cos'è un buon design pattern per un insieme di metodi che comprende un algoritmo?

1

Questa è una domanda di progettazione relativa alla scoperta di un buon modello di progettazione OO o di una struttura di progettazione o combinazione di classi in grado di ospitare un algoritmo che elabora la selezione dell'utente per produrre raccomandazioni sui prodotti.

Scenario

L'utente specifica i requisiti del motore e del prodotto e gli hit Submit. L'algoritmo elabora l'input, carica vari motori e prodotti, seleziona motori e prodotti pertinenti secondo le specifiche. Quindi li combina, calcola vari parametri delle combo e rileva anche eventuali discrepanze. Quindi fornisce un'uscita sotto forma di valide combinazioni prodotto-motore con specifiche calcolate e anche eventuali discrepanze annotate come avvertenze.

Domanda

Posso avere un oggetto chiamato Algorithm , che è essenzialmente un insieme di metodi che carica Prodotti, Motori, li combina, esegue calcoli su di essi, imposta varie bandiere, ecc.? O c'è un design migliore?

Design corrente

Il mio attuale design proveniva da un background procedurale ed era usato solo per una serie di funzioni, ora ospitate in un paio di classi. L'algoritmo semplificato è qualcosa del genere (dove Algorithm è un insieme di metodi correlati alla guida dell'algoritmo e BundleOfComputationalMethods che si concentra sulle esigenze di calcolo):

class Algorithm
{
    public $bundle;

    function __construct()
    {
        $this->bundle = new BundleOfComputationalMethods();
    }

    function getRequestDataFromPOST()
    {
        $this->bundle->options = $_POST;
    }

    function loadMotors(){}

    function loadProducts(){}

    function combineProductsAndMotors()
    {
        $this->getRequestDataFromPOST();

        $this->loadMotors();
        $this->loadProducts();

        for ($k = 1; $k <= $this->bundle->spec->max; $k++)
        {
            $this->bundle->computeRotationalSpeed();
            $this->bundle->checkIfSpeedWithinLimits();
            if ($this->bundle->speedIsOkay)
            {
                //bundle contains a "selection" to be presented back to the user
                //(Motor, Product, computed specifications, pricing, any warnings/errors)
                $result .= json_encode($this->bundle);
            }
        }

        return $result;
    }
}
    
posta Dennis 08.07.2015 - 23:56
fonte

3 risposte

2

Migliorerei leggermente la parte OOP.

Fornisci una denominazione migliore:

Puoi modificare Algorithm in qualcosa di più specifico come RelatedProductsService . Quindi esporre un metodo: getrelatedProducts($options)

Separa le tue responsabilità:

Vuoi anche evitare di passare POST lungo la classe nei suoi figli. Questo è un odore di codice e crea dipendenze non necessarie. Chiedi al tuo chiamante di RelatedProductsService di estrarre i dati del post in una struttura e solo ciò che è necessario e passarlo come $options .

Vorrei anche spostare la funzionalità per caricare e combinare i motori, codificando JSON anche nelle proprie classi. Hai troppe cose stipate in una classe :)

Buona lettura: Principio di responsabilità singola

    
risposta data 09.07.2015 - 00:05
fonte
2

Posso avere un oggetto chiamato Algorithm, che è essenzialmente un insieme di metodi che carica Prodotti, Motori, li combina, esegue calcoli su di essi, imposta varie bandiere, ecc.? O c'è un design migliore?

Il Strategy Software Design Pattern sembra corrispondere alla descrizione del tuo post:

link

Questo modello consente di trattare un metodo o un gruppo di metodi come "oggetto", come richiesto.

Non forzarti a utilizzare "Modelli di progettazione software" perché sono una tendenza, usali perché, potrebbe aiutarti a risolvere un problema.

    
risposta data 09.07.2015 - 01:52
fonte
0

Il modello che mi viene in mente quando leggo questo è " Method Object " .

Se hai un grosso metodo lo trasferisci in un oggetto. Lo stato del metodo (ad esempio argomenti) può essere parte degli attributi dell'oggetto.

Modifiche che vedo immediatamente:

  • Non nominare la classe Algoritm ma CombineMotorsAndProducts
  • rinomina il metodo combineProductsAndMotors in compute .
risposta data 09.07.2015 - 12:25
fonte

Leggi altre domande sui tag