Salvataggio delle informazioni sui prezzi quando sono necessari più formati di visualizzazione

0

Nella mia applicazione ho spesso il caso in cui gli stessi dati devono essere in formato diverso in luoghi diversi. Ad esempio, un numero deve essere inviato a un servizio Web in forma decimale, ma deve essere formattato in un modo specifico che l'utente possa vedere.

public class Prize {
   float prizeAmount;
}

Un webservice si aspetta che l'importo sia nel formato:

A: 12000000

L'utente si aspetta di vedere l'importo nel formato:

B: 12. Mio €

Come posso implementarlo in modo riutilizzabile? Potrei salvare i dati nel formato A, quindi formattarlo in B nella classe vista. Ma allora cosa succede se viene mostrato in più viste? Quindi ho bisogno di implementare il formattatore più volte. C'è un modello elegante che posso applicare a questo?

    
posta dan 28.07.2017 - 12:08
fonte

6 risposte

2

Ricorda che i pattern non sono ricette magiche. Non esiste un modello per ogni singolo problema. E non tutti i problemi rispondono a un modello.

In questo caso specifico, come già sottolineato da @Mike Nakis, il problema potrebbe essere il modo in cui si esprime il concetto Price . Manca di informazioni significative e risorse preziose. Ad esempio, anche il consumatore del Webservice potrebbe aver bisogno di conoscere la valuta o l'importo nel suo formato di sola lettura. Non è vero? Al momento, Price include solo un float.

Che cosa succede se forniamo alcune informazioni più pertinenti? 1 . Ad esempio

public class Prize {
   BigDecimal amount;
   Locale locale;

   public BigDecimal getAmount(){ ... }

   public String getCurrencyCode(){
      return Currency.getInstance(locale).getCode();
   }
   public String getCurrencySymbol(){
      return Currency.getInstance(locale).getSymbol();
   }
   public String getFormattedAmount(){
      return DecimalFormat.getCurrencyInstance(locale).format(amount);
   }
}

Ora, Price è in grado di trasferire qualsiasi informazione che gli utenti / i servizi web potrebbero aver bisogno di sapere. Ad esempio, l'invio di getAmount insieme a getCurrencyCode consente ai consumatori di eseguire conversioni valutarie. D'altra parte, se non vogliamo che i consumatori modifichino il amount o la sua rappresentazione, potremmo inviare solo getFormattedAmount .

Tornando alla domanda principale, poiché Price è in grado di trasferire la sua rappresentazione in modi diversi, non è necessario copiare e incollare le trasformazioni su tutto il codice.

1: Questo approccio potrebbe portarti a salvare anche le impostazioni internazionali o la valuta.  Secondo l'API Java, Locale mi sembra un'informazione più preziosa da perseguire rispetto al codice di valuta. O salva entrambi.

Per ulteriori informazioni sulla Valuta, consulta il Documento API .

    
risposta data 30.07.2017 - 00:57
fonte
1

Separa la rappresentazione interna ed esterna. Scegli un formato interno e usalo in tutto il codice interno. Solo quando i dati vanno all'esterno, generando una pagina Web o chiamando un servizio esterno, trasformalo nella rappresentazione richiesta.

Lo stesso vale per i dati in arrivo, trasformarli nel formato interno al confine.

Oh, e non usare un flottante a un prezzo per evitare errori di arrotondamento sui calcoli (riduzione di tasse / prezzi in%).

    
risposta data 30.07.2017 - 22:12
fonte
0

Guarda nel pattern MVC. Questo è il punto in cui hai un modello che memorizzerà il numero come il tuo webservice si aspetta. Una vista che lo mostra nel modulo che l'utente si aspetta di vederlo. Quindi il controller per fare la conversione.

Ci sono molti schemi per fare questo genere di cose come MVVM, MVP o il termine generale ora MV qualcosa. Leggi su di loro e scegli ciò che è meglio per la tua situazione.

    
risposta data 28.07.2017 - 12:19
fonte
0

Come probabilmente avrai capito ora, non esiste uno schema per questo. I modelli sono per altre cose. Avresti evitato le persone fastidiose se avessi appena saltato la parola "pattern" e usato qualche altra parola, come "tecnica".

Ma sto divagando.

I tuoi dati devono essere archiviati nel formato più appropriato per rappresentare quel tipo di dati.

Detto questo, tieni presente che float è un po 'troppo piccolo quando i tuoi valori saranno grandi come 12000000. Un float ha solo 6 cifre significative e 12000000 è 8 cifre, il che significa che sei in guaio. Prendi in considerazione l'utilizzo di BigDecimal , o forse anche long come numero di centesimi anziché numero di euro.

Quindi i tuoi dati devono essere convertiti e da qualsiasi formato richiesto per la rappresentazione o la trasmissione. Non c'è modo di aggirare questo.

    
risposta data 30.07.2017 - 00:45
fonte
0

Questa è una domanda più generale della maggior parte dell'indirizzo delle risposte. Dal punto di vista OO hai bisogno di una classe di formattazione per il tuo tipo di dati. Per i tipi di valori di base, tuttavia, la libreria di classi del tuo linguaggio di programmazione preferito offre già delle belle opzioni di formattazione, se non sono già offerte dalla classe di valore stessa (come String.Format () in .net). Per i tuoi tipi personalizzati dovrai rollare i tuoi formattatori. Oppure, se non ti aspetti di aver bisogno di troppe presentazioni diverse o complicate, crea solo un paio di metodi AsXyz.

    
risposta data 30.07.2017 - 21:44
fonte
-2

Potresti usare Factory Pattern

Hai il tuo PrizeClass in un formato normale, un intero o un float, quindi, a seconda di chi richiede questi dati attraverso un factory, ottieni il corrispondente Prize Formatter, ogni formattatore formatta i dati nel modo necessario.

Ad esempio: - PriceWithTextFormatter - PriceWithSymbolFormatter

E così via.

    
risposta data 30.07.2017 - 14:29
fonte

Leggi altre domande sui tag