Android (Java): более сухой подход с использованием интерфейсов и меньшим количеством дубликатов - PullRequest
0 голосов
/ 08 января 2019

Есть ли хороший способ с помощью интерфейсов уменьшить дублирование здесь. В настоящее время существует 3 типа (kelvin, celcius, fahrenheit) конвертации, что приводит к 6 комбинациям.

Есть ли более масштабный способ справиться с этим, скажем, мы хотим добавить еще 2 типа (всего 5), и это станет немного хлопотно для поддержания всех комбинаций?

Вот код:

public class ConvertTemperatureJava {
        private static final String TAG = "ConvertTemperatureJava";

    static String TEMPERATURE_KELVIN = "kelvin";
    static String TEMPERATURE_CELCIUS = "celsius";
    static String TEMPERATURE_FAHRENHEIT = "fahrenheit";

    private float inputValue = 0;
    private String inputUnit, outputUnit = null;

    public void setInputValue(String inputValueString) {
        // convert input to correct type
        try {
            this.inputValue = Float.parseFloat(inputValueString);
        } catch (NumberFormatException e) {
            Log.e(TAG, e.getMessage());
            this.inputValue = 0;
        }
    }

    public void setInputUnit(String inputUnit) {
        this.inputUnit = inputUnit;
    }

    public void setOutputUnit(String outputUnit) {
        this.outputUnit = outputUnit;
    }

    public float convert() {
        // same units, no conversion required
        if (inputUnit != null && outputUnit != null && inputValue != 0) {
            if (inputUnit.equalsIgnoreCase(outputUnit)) {
                return inputValue;
            }

            // kelvin and celsius
            if (inputUnit.equalsIgnoreCase(TEMPERATURE_KELVIN) && outputUnit.equalsIgnoreCase(TEMPERATURE_CELCIUS)) {
                return kelvinToCelsius(inputValue);
            }
            if (inputUnit.equalsIgnoreCase(TEMPERATURE_CELCIUS) && outputUnit.equalsIgnoreCase(TEMPERATURE_KELVIN)) {
                return celsiusToKelvin(inputValue);
            }

            // kelvin and fahrenheit
            if (inputUnit.equalsIgnoreCase(TEMPERATURE_KELVIN) && outputUnit.equalsIgnoreCase(TEMPERATURE_FAHRENHEIT)) {
                return kelvinToFahrenheit(inputValue);
            }
            if (inputUnit.equalsIgnoreCase(TEMPERATURE_FAHRENHEIT) && outputUnit.equalsIgnoreCase(TEMPERATURE_KELVIN)) {
                return fahrenheitToKelvin(inputValue);
            }

            // celsius and fahrenheit
            if (inputUnit.equalsIgnoreCase(TEMPERATURE_CELCIUS) && outputUnit.equalsIgnoreCase(TEMPERATURE_FAHRENHEIT)) {
                return celsiusToFahrenheit(inputValue);
            }
            if (inputUnit.equalsIgnoreCase(TEMPERATURE_FAHRENHEIT) && outputUnit.equalsIgnoreCase(TEMPERATURE_CELCIUS)) {
                return fahrenheitToCelsius(inputValue);
            }
        }

        // fallback
        return 0;
    }

    private float kelvinToCelsius(float input) {
        return input - 273.15f;
    }

    private float celsiusToKelvin(float input) {
        return input + 273.15f;
    }

    private float kelvinToFahrenheit(float input) {
        return (input * 1.8f) - 459.67f;
    }

    private float fahrenheitToKelvin(float input) {
        return (input + 459.67f) * (5f / 9f);
    }

    private float celsiusToFahrenheit(float input) {
        return (input * 1.8f) + 32f;
    }

    private float fahrenheitToCelsius(float input) {
        return (input - 32f) / 1.8f;
    }
}

1 Ответ

0 голосов
/ 08 января 2019

Нравится то, что Организация Объединенных Наций делает с языками. Выберите одну единицу в качестве промежуточной (например, английский в ООН), а затем определите все остальные ваши конвертеры в терминах перехода в / из этой стандартной единицы.

Например, вы можете выбрать Кельвин в качестве стандартной единицы, а затем реализовать celsiusToFahrenheit(input) как kelvinToFahrenheit(celsiusToKelvin(input)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...