Должны ли литералы быть заменены универсальными интерфейсами - PullRequest
0 голосов
/ 23 сентября 2019

Я пишу код, который использует шаблон стратегии, однако я не уверен, что перехожу за борт с количеством используемой абстракции.Я случайным образом генерирую числа для своего приложения, используя различные распределения вероятностей, такие как нормальное распределение или равномерное распределение, или генерирую числа постоянно (совсем не случайно)

Различные алгоритмы имеют разные литеральные типы возврата, некоторые возвращают Ints, тогда как другие возвращаютFloats and Doubles.

Следуя принципу разделения интерфейсов, я создал интерфейсы ITYPEValuePicker, каждый из которых имеет следующее определение:

public interface ITYPEValuePicker
{
    public TYPE getTYPE();
}

, где "TYPE" - это определенный тип данных, такой как float, int,и т.д.

Теперь мои случайные алгоритмы реализуют эти интерфейсы и могут использоваться в коде

GaussianValuePicker implements IFloatValuePicker, IDoubleValuePicker

и

UniformValuePicker implements IFloatValuePicker, IDoubleValuePicker, IIntValuePicker

и

ConstantValuePicker implements IIntValuePicker, IFloatValuePicker, IDoubleValuePicker

Значительная часть моего кода зависит от случайно выбранных значений и случайно выбранных алгоритмов для выбора этих значений.Мой вопрос: есть ли причина, по которой я не должен заменять все магические числа этими универсальными «IValuePicker» и иметь фактическое получение любого значения, которое должно быть делегировано определенному алгоритму.

Например:

public class chicken
{
    float height;
    int age;

    public chicken(float height, int age)
    {
        this.height = height;
        this.age = age;
    }

    public boolean isSuperOld()
    {
        if (age > 99) 
        {
            return true;
        }
        return false;
    }
}

против

public class chicken
{
    IFloatValuePicker height;
    IIntValuePicker age;

    public chicken(IFloatValuePicker height, IIntValuePicker age)
    {
        this.height = height;
        this.age = age;
    }

    public boolean isSuperOld()
    {
        if (age.getInt() > 99) 
        {
            return true;
        }
        return false;
    }
}

извините за надуманный пример, но я надеюсь, что он иллюстрирует почти отсроченный (ленивый [я не уверен, что это правильный термин]?)оценка разных значений.Является ли это примером YAGNI (я так понимаю, является ли это YAGNI или нет, довольно сложным контекстом) или это правильное использование интерфейсов?

1 Ответ

0 голосов
/ 23 сентября 2019

Используйте Число в своем калькуляционном коде для int/double/BigDecimal (все Number) и такие:

float x = 0.12F;
Number n = x;
n = n.longValue() * 9;
x = n.doubleValue(); // 0.0F

Обертывание классов, которые я никогда не находил полезными - только видпеременная типа переменная, как для Basic в JavaScript, но они также были далеки от оптимальных.

То, что тогда пользователь API должен подготовить данные, это жизнь.

...