2015-11-11 3 views
1

Я реализовал класс, который преобразует температуру в градусах Цельсия. Мой вопрос в том, что является лучшим способом для применения преобразователя температуры? Это решение, которое я использовал.Как наилучшим образом реализовать преобразователь температуры

public TemperatureConverter(double measurement, String unit) { 
    if(unit.equals("F")){ 
     result = (measurement - 32) * 5/9; 
    } 
    else if(unit.equals("K")){ 
     result = measurement + KELVIN_TO_CELSIUS; 
    } 
    else if(unit.equals("R")){ 
     result = (5/4) * measurement; 
    } 
} 

Затем метод toCelsius.

public double toCelsius() { 
    return result; 
} 

И атрибуты класса:

private final double KELVIN_TO_CELSIUS = 273.15; 
private double result; 

ответ

1

Ваше решение кажется неполным:

100c (цельсию) в вашей программе будет 273.15, так же, как 0c или даже 10000c все равно будет 273.15, и это неправильно, также вы никогда не выводите новый блок измерения.

Во-первых, сделать статический метод (преобразование не нужен объект), который принимает номер, единица измерения значения входа, и единица Measurment выходного значения, и возвращает номер

public static double convertValue(double value, String to){ 
    if(to.equals("c")){ 
     return value; 
    } else { 
     if(to.equals("k")){ 
     return value + 273.15; 
     } else { 
     return (value - 32) * 5/9; 
     } 
    } 
} 

Чтобы использовать эту функцию, просто сделайте System.out.println(TemperatureConverter.convertValue(50, "k")); или System.out.println(TemperatureConverter.convertValue(50, "f"));

+1

Просто добавление для учебного аспекта. Единица измерения может быть классом enum со своими значениями. А также передаваться как аргумент вместо 'String to'. Как вы думаете? – Patrick

+0

@Patrick Кажется хорошим, однако, поскольку OP задал вопрос только с помощью простой механики, я попытался удалить все, что не является «необходимым» для выполнения задачи. Перечисление возможных значений будет правильным подходом, но потребуйте знания, я не верю, что OP имеет ... В моем ответе я даже удалил ненужные переменные .... – Bonatti

1

Создание нового объекта только для преобразования не является лучшим подходом. Если ваш класс делает больше, чем это, то это может быть причиной для создания объекта TemperatureConverter. Если преобразование - это единственное, что вам нужно, вы можете создать обычный статический класс, который также может содержать общие задачи, которые требуется вашей программе, или вы можете создать TemperatureConverter со статическими функциями для преобразования.

Вы можете иметь отдельные статические функции для каждого преобразования, как:

double Util.celciusTo(double temp, TempUnit to) 
double Util.fahrenheitTo(double temp, TempUnit to) 
double Util.kelvinTo(double temp, TempUnit to) 

TempUnit является единица измерения температуры перечисления. Вы можете создать класс Util и добавить дополнительную функцию полезности или создать TemperatureConverter, содержащий статические функции, как указано выше, только для температурного преобразования.

Если TemperatureConverter делает больше, чем просто преобразование, как сравнение температуры для сортировки List и т.д., чем вы можете иметь такой класс, но есть несколько вещей, которые вы должны сделать:

  • Dont сделать преобразование внутри конструктора. Делайте это по требованию
  • Обеспечения функций получателя для значения тока и блока
  • Обеспечить три функции для преобразования, которые будут обновлять внутреннее состояние объекта (измерение обновления и единиц) и вернуть обновленное значение
  • функцию Override ToString для хорошо печать значений
+0

Я думаю, что могу написать статические функции внутри static class Util, в этом случае. На самом деле мне нужно преобразовать не только температуру, но и длину, вес и другие. – Shruikan

+0

Да, вы можете создать класс Util и использовать его в своей программе. – ata