Я искал некоторые хорошие шаблоны, чтобы иметь возможность выразить расстояние в разных единицах. Я нашел Martin Fowler article about quantities и я запрограммировал что-то вроде:Это хороший способ реализовать расстояние с различными единицами измерения
Вот Расстояние класс (я думаю, что это не necessery, чтобы сделать его аннотация):
public class Distance {
double mValue;
DistanceUnit mUnit;
public Distance(double value, DistanceUnit unit){
this.mValue = value;
this.mUnit = unit;
}
public Distance toUnit(DistanceUnit unit){
double factor = this.mUnit.getMetresFactor()/unit.getMetresFactor();
double newValue = this.mValue * factor;
Distance distance = new Distance(newValue, unit);
return distance;
}
@Override
public String toString(){
return String.valueOf(mValue);
}
}
Это выглядит очень просто. Конверсия toUnit
основана на DistanceUnit
метод getMetresFactor
. Каждый класс Unit реализует DistanceUnit
интерфейс и имеет метод getMetresFactor()
как:
public interface DistanceUnit {
double getMetresFactor();
}
public class Inch implements DistanceUnit {
@Override
public double getMetresFactor() {
return 0.0254;
}
}
public class Kilometer implements DistanceUnit {
@Override
public double getMetresFactor() {
return 1000.0;
}
}
А использование, например,:
Distance inches = new Distance(300.0, new Inch());
Distance kilometres = inches.toUnit(new Kilometres());
Так она возвращает правильное значение.
Это хороший способ сохранить расстояние таким образом? Возможно, вы знаете некоторые недостатки такого подхода. Может быть, неплохо использовать здесь шаблон FactoryMethod для построения расстояния на основе ярлыка единицы, например, «m» для счетчика. Я думаю о количестве занятий, если бы у меня было много единиц ... Хорошо ли иметь фабрику, которая возвращает коэффициент метров на основе названия единицы? Тогда не будет классов для единиц?
Вместо того, чтобы изобретать колесо, у вас думал о usi ng библиотека, подобная [JScience] (http://jscience.org/), которая уже существует? –
Я ожидал, что где-то есть что-то вроде JScience, но я не слышал об этом, я его не нашел. Я это проверю. Но мой вопрос был также, если это хороший способ сделать это, как я. Я не очень опытный программист, поэтому каждое хорошее слово из меня стоит много. –
@ Tim Biegeleisen как будто он может использовать свои дистанции. Нет смысла изобретать колесо, если он проще и быстрее, чем использовать существующий плохой –