java - Android(Java):使用接口和更少重复的 DRYer 方法
问题描述
有没有一种使用接口的好方法可以减少这里的重复。目前有 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;
}
}
解决方案
就像联合国对语言所做的那样。选择一个单位作为中间单位(就像英语在联合国一样),然后根据去往/来自该标准单位的方式定义所有其他转换器。
例如,您可以选择开尔文作为标准单位,然后实现celsiusToFahrenheit(input)
为kelvinToFahrenheit(celsiusToKelvin(input))
.
推荐阅读
- php - 图片不是在 digitalocean 上的 ubuntu 服务器中使用 php 上传的吗?
- node.js - 将 typedoc 部署到 gh-pages
- mod-rewrite - Prestashop 1.7.3.4 - 尽管重写活动,友好的 URL 不起作用
- c# - 如何降低 Unity2D 中的实例化频率
- ruby-on-rails - 在任何来源中都找不到 rake-12.3.1
- c# - C# 相当于在类中覆盖 __dict__
- php - Webcrawler 提取链接元素
- javascript - 在 iE 的浏览器会话中手动添加 cookie
- html - IE11 中的 max-width 和 flex 不起作用
- ruby - 在不显示任何错误消息的情况下保存记录不起作用 - Rails