Dove posso codificare i metodi di conversione del valore in un'applicazione web MVC per visualizzare i valori in diversi sistemi di unità nella vista?

3

Ho un caso d'uso in cui eseguo calcoli di dati interni usando il sistema inglese, a causa di vari coefficienti grafici precalcolati e altri dati che già utilizzano il sistema inglese. Ma per l'output ho bisogno di convertire alcuni dei miei dati nel sistema metrico e lasciare alcuni dati nel sistema inglese da utilizzare a scopo di debug per seguire il calcolo. (Le informazioni di debug saranno lì per rimanere a lungo termine e non solo utilizzate durante lo sviluppo).

La mia domanda è questa: dove all'interno del MVC faccio il valore conversioni e perché?

Le mie attuali scelte per fare questa conversione sono nel Controller o nella Vista.

Se faccio la conversione all'interno del controller, dovrò essenzialmente mantenere due serie di variabili (una per i calcoli, una per passare alla vista.

Se eseguo la conversione in Visualizza, il mio controller sarà più snello grazie al solo sistema inglese, ma la vista acquisirà vari coefficienti di conversione e codice di conversione e diventerà quindi più pesante.

C'è forse una terza opzione: la conversione deve essenzialmente diventare un altro livello tra Controller e View? In tal caso, dove o come lo collego?

Ulteriori informazioni sulla mia situazione specifica

Ho un'applicazione web PHP scritta in Zend Expressive. I controller sono chiamati Handlers .

class Handler // aka Controller
{
    private $renderer; // renders view template

    function handle($request)
    {
         $system = $request->getUnitSystem(); //"English", "Metric"
         $page = $request->getPage(); //page number
         $data = $this->repository->getEnglishData(); //PHP array of English-valued data sets

         /* Conversions in Handler */
         $data[$page]['height'] = $this->valueConverter->feet_to_meters($data[$page]['height']);
         $data[$page]['height_unit'] = $system->isMetric() ? 'meters' : 'feet';

         $params = array(
             'paginator' => $this->paginator->getPaginator($data, $page),
         );

         /* Send to View */
         return new HtmlResponse($this->renderer->render('show_data.phtml', $params));

     }
} 

Quindi sopra ho i seguenti giocatori:

  • $system , che è il valore del sistema di unità (inglese o metrico)
  • $valueConverter , che è una libreria di metodi di conversione del valore
  • $data , un array PHP con un insieme di dati con valori in inglese

Uso la conversione nel controller per aggiornare i valori per utilizzare il sistema unità corretto e li invio nella vista. Visualizza li visualizza così com'è.

Complicazione aggiuntiva quando devono essere visualizzati diversi sistemi

Ho anche un caso d'uso in cui ho bisogno di mostrare le informazioni di debug sullo schermo in unità inglesi (mostra i calcoli interni a scopo di debug) e mostrare le informazioni "reali" nelle unità metriche convertite. Potrebbe quindi essere necessario visualizzare contemporaneamente diversi sistemi di unità. Come strutturare il mio codice per gestire questo caso d'uso?

    
posta Dennis 10.07.2018 - 17:49
fonte

2 risposte

1

Forse una variante sull'opzione 3: rendere il modello responsabile della gestione della conversione.

Di 'questo:

class CalculationResultInEnglishUnits
{
    public decimal HeightInFeet { get; set; }
    public decimal WeightInPounds { get; set; }
}

e ne hai bisogno per assomigliare a questo:

class CalculationResultInMetricUnits
{
    public decimal HeightInMeters { get; set; }
    public decimal WeightInKillograms { get; set; }
}

Potresti aggiungere un costruttore di conversione (o metodo di fabbrica o helper o ...) per convertire tra i due. Qualcosa del genere:

class CalculationResultInMetricUnits
{
    public decimal HeightInMeters { get; set; }
    public decimal WeightInKillograms { get; set; }

    public CalculationResultInMetricUnits(CalculationResultInEnglishUnits results)
    {
        HeightInMeters = UnitConversionHelper.FeetToMeters(results.HeightInFeet);
        WeightInKillograms = UnitConversionHelper.PoundsToKillograms(results.WeightInPounds);
    }
}

In questo modo, né la vista né il controller devono preoccuparsi della conversione. Il modello si assume la responsabilità di mantenere lo stato coerente e di essere il modo di passare i dati tra il controller e la vista (e in questo caso, traducendolo nella forma corretta).

    
risposta data 10.07.2018 - 18:00
fonte
1

Sembra che prenderò un approccio a questo:

Il controller calcola i dati, invia i dati così come sono alla vista, assumendo unità inglesi.

Visualizza visualizza i dati utilizzando l'inglese, la metrica o entrambi, eseguendo le conversioni secondo necessità. La libreria di fattori di conversione viene fornita alla vista, quindi la vista può eseguire le proprie conversioni.

    
risposta data 11.07.2018 - 17:56
fonte

Leggi altre domande sui tag