Qual è la pratica accettata per gestire le conversioni numeriche in OOP?

0

Sto facendo un'app meteo che comporta temperature. Puoi cambiare tra Kelvin, Celsius e Fahrenheit solo per divertimento.

Tuttavia, i dati relativi alla temperatura vengono utilizzati ovunque in diversi modi. Ha senso avere una classe di temperatura che memorizza il numero e le sue unità, e ha vari metodi per convertirla internamente in qualche altra unità di misura, quindi non sto eseguendo la matematica della conversione dappertutto?

Qual è la pratica accettata per memorizzare il suo stato attuale? Una stringa? Se currentUnits è "Fahrenheit", fai questo, ecc. Esiste un modo migliore per archiviarli usando enumerazioni o costanti in qualche modo?

Sto solo provando a farti un'idea delle migliori pratiche qui.

MODIFICA usando invece peso:

public class Weight {
    private double mWeight; // assumed to be in lbs

    public Weight(double weight) {
        mWeight = weight;
    }

    public double getWeight(Context context) {
        AppSettings appsettings = new AppSettings(context);
        if (appsettings.getUnitsPref().equals("kgs")){
           mWeight *= 2.20462;
        }
        return mWeight;
    }

}
    
posta Aruka J 26.03.2016 - 16:07
fonte

2 risposte

3

La best practice sarebbe qualsiasi cosa che soddisfi ragionevolmente il Principio ASCIUTTO . In questo caso, sicuramente non vuoi duplicare le stesse conversioni su tutto il tuo codice.

Creare una classe Temperature sarebbe una buona soluzione. Per evitare di reinventare la ruota, può valere la pena valutare se esistono biblioteche scientifiche esistenti che si adattino al tuo problema.

Quando scrivi la tua classe, sarebbe una buona idea assicurarsi che la rappresentazione interna della tua classe sia sempre rappresentata usando l'unità Base SI (ad esempio Kelvin per la temperatura) e quindi assicurati che altre unità derivate come Celsius / Fahrenheit vengono sempre calcolati da tale unità base.

Se la tua classe Temperature deve gestire la memorizzazione di diverse rappresentazioni interne della stessa metrica, probabilmente si avrà una complessità non necessaria, ad esempio il calcolo della somma di 10C + 50F è molto più semplice quando entrambi sono già internamente rappresentati da la tua classe in Kelvin.

Considera inoltre che il codice come questo dovrebbe idealmente seguire il Principio di almeno stupore . Pertanto, tieni un'attenta considerazione su come costruisci i tuoi oggetti in modo da ridurre al minimo l'ambiguità, ad esempio

Temperature myTemp = new Temperature(50.0); // Wait! What unit is that 50.0?!?

Ovviamente uno dei motivi per scrivere una classe come Temperature è che i valori numerici sono ambigui. Potresti considerare di nascondere un costruttore che accetta valori di double e di esporre invece metodi "factory" statici pubblici che rendono chiare le tue intenzioni.

Temperature myTemp = Temperature.fromFahrenheit(50.0);  // OK, that means 50F.

Possibile implementazione dei metodi from :

public class Temperature {

    private double kelvin;

    private Temperature(double k) {  // Private to prevent misuse
        kelvin = k;
    }

    public static Temperature fromCelsius(double celsius) {
        return new Temperature(celsius + 273.15);
    }    

    public static Temperature fromFahrenheit(double fahrenheit) {
        double temp = (fahrenheit - 32) / 1.8;
        return fromCelsius(temp); 
    }
}
    
risposta data 26.03.2016 - 16:27
fonte
0

In realtà si consiglia di farlo - creare una classe in cui si memorizzano i dati temporanei, la classe dovrebbe prendere input e riconoscerla come C F K ecc e quindi procedere per convertire ciascuno alla temperatura utente desiderata.

Vorrei andare per il riconoscimento delle stringhe, ma se stai facendo GUI le cose possono essere diverse.

    
risposta data 26.03.2016 - 16:19
fonte

Leggi altre domande sui tag