Strategia per utilizzare due diversi sistemi di misurazione nel software

6

Ho un'applicazione che deve accettare e produrre valori sia in unità personalizzate che in sistemi metrici.

In questo momento la conversione e l'input e l'output sono un disastro. Puoi entrare solo nel sistema statunitense, ma puoi scegliere l'output come USA o Metrico e il codice per eseguire le conversioni è ovunque.

Quindi voglio organizzare questo e mettere insieme alcune semplici regole. Così mi è venuto in mente questo:

Regole

  • l'utente può immettere valori negli Stati Uniti o in Metrica e l'interfaccia utente si occuperà di contrassegnarla correttamente
  • Tutte le unità internamente verranno archiviate come Stati Uniti, poiché la maggior parte del sistema ha già la maggior parte dei dati memorizzati in questo modo e dipende da questo. Non dovrebbe importare, suppongo, finché non mischiate l'unità.
  • Tutto l'output sarà in USA o Metrico, a seconda della selezione / preferenza / preferenza dell'utente.

In teoria sembra fantastico e sembra una soluzione. Tuttavia, un piccolo problema che ho riscontrato è questo:

Alcuni dati sono memorizzati nel codice o nel database che già restituisce dati come questo: 4 x 13/16" screws , che significa "quattro volte viti". Ho bisogno che sia negli Stati Uniti o in Metrica. Dove esattamente metto il codice di conversione per fare la conversione per questa unità?

Quanto sopra già mescola presentazione e dati, ma i dati per il campo che ho bisogno di compilare è tutta la stringa. Posso sicuramente dividerlo nel numero 4, il 13/16 ", e" x "e" viti ", ma la domanda rimane ... dove inserisco il codice di conversione?

Percorsi diversi per le routine di conversione

1) In questo momento la stringa è in una classe in cui è prodotta. Posso inserire il codice di conversione direttamente in quella classe e potrebbe essere una buona soluzione. Tranne allora, voglio essere coerente, quindi metterò le procedure di conversione ovunque nel codice at-data-source, o subito dopo averlo letto dal database. Il problema però è che penso che il mio codice avrà a che fare con due sistemi, in tutto il codebase, dopo questo, dovrei farlo.

2) Secondo le regole, la mia idea era di inserirlo nello script della vista, ovvero l'ultima modifica per modificarlo prima che venisse mostrato all'utente. E potrebbe essere la cosa giusta da fare, ma poi mi sembra che potrebbe non essere sempre la soluzione migliore. (In primo luogo, rende complicato lo script di visualizzazione un po ', in secondo luogo, ho bisogno di fare più lavoro sul lato dati per dividere di più le cose, o fare un'analisi extra, come nel mio caso sopra).

3) Un'altra soluzione è quella di farlo da qualche parte nel passo di preparazione dei dati prima della vista, alias da qualche parte nel mezzo, prima della vista, ma dopo la fonte dei dati. Questo mi sembra disordinato e questo potrebbe essere il motivo per cui il mio codebase è in questo modo in questo momento.

Sembra che non ci sia la soluzione migliore. Cosa devo fare?

Domanda

Il mio obiettivo è capire come strutturare e dove posizionare il mio codice di conversione unità all'interno del sistema. Il sistema software in questione è un sistema LAMP simile a MVC (Zend Framework 2).

Esempio specifico

Al momento ho una classe che ha dato un id al momento della creazione, ha un metodo getValue() , che restituisce 4 x 13/16" screws . A seconda di id , è possibile produrre numeri diversi, ma sono ancora in pollici. Dovrei notare che alcuni numeri sono scritti con la barra di divisione ( 13/16" ) e alcuni usano la notazione decimale ( 0.8125" ). Come posso configurare il mio framework in modo che possa visualizzare tali valori anche in millimetri?

    
posta Dennis 21.08.2014 - 18:06
fonte

2 risposte

5

Il modo migliore per gestire più conversioni del genere è creare una classe di tipo Unit of Measurement per la tua applicazione. La classe UoM ti permetterà di incapsulare tutte quelle complessità all'interno di una singola area, e il resto del codice può semplicemente chiamare e specificare le unità di cui hanno bisogno il valore per tornare indietro.

In sostanza, ciò che fa è trasformare un'unità di misura in un oggetto di prima classe all'interno del tuo sistema. Memorizzerete il valore e le unità associate al valore. Se hai bisogno di convertire le unità originali in un altro tipo, fai una chiamata di conversione contro la classe UoM.

Un grande vantaggio di questo approccio è che tutta la bruttezza dell'analisi e della conversione è gestita in un unico posto, e ti dà la possibilità di usare le librerie esterne esistenti dove qualcuno ha già fatto tutto il duro lavoro per te.

Per un'applicazione pesante di unità con molte conversioni di unità, le "classi base" come questa appartengono al loro stesso livello e non all'interno di una struttura MVC. In sostanza, stai creando un nuovo tipo fondamentale o primitivo per la tua applicazione.

Ma se sei davvero obbligato a utilizzare MVC o la tua app non ha molte conversioni di unità, allora il Controller sarebbe la soluzione migliore in quanto può dialogare sia con il Modello che con la Vista. Potresti anche giustificatamente sostengono che il modello sarebbe una buona area se è lì che stai mettendo la logica del business.

    
risposta data 21.08.2014 - 18:19
fonte
4

Mai memorizza stringhe come 4 x 13/16" screws nel tuo codice o nel tuo database. Rendilo come una stringa segnaposto come 4 x {0} screws , passalo con il valore effettivo in unità interne (nel tuo caso pollici USA), e solo quando il tuo programma lo presenta finalmente all'utente, sostituirà il segnaposto con un valore in pollici o mm (secondo ciò che è effettivamente configurato). Se il tuo programma ha bisogno di presentare i valori statunitensi a volte come frazioni, puoi usare segnaposti con qualche simbolo "suggerimento" (ad esempio, usa un f come {0f} per assicurarti che i pollici vengano visualizzati come frazioni.

Ovviamente, dovresti provare ad avere solo un piccolo numero di routine di conversione (idealmente solo una) nell'intero programma, e un unico posto in cui è posizionato lo switch per unità USA e unità metriche. Avere la stessa informazione in modo ridondante o diverse routine di conversione per lo stesso scopo è estremamente soggetta a errori. Quindi la routine di conversione centrale dovrebbe essere riutilizzata ovunque possibile. Quindi, quando ho ottenuto le tue alternative 1, 2 e 3 a destra, questo porta direttamente all'opzione 3. Se questo diventa complicato dipende da te, ma penso che sia possibile gestirlo senza rendere il tuo codice inutilmente complicato.

    
risposta data 21.08.2014 - 21:54
fonte

Leggi altre domande sui tag