1. Java / Говнокод #16698

    +73

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    public static <T extends Comparable<T>> boolean isLessThan(T a, T b, double numericTolerance) {
        if (a == null) {
            return b != null;
        }
        boolean isLessThan = a.compareTo(b) < 0;
        if (!isLessThan && a instanceof Number && b instanceof Number) {
            isLessThan = ((Comparable) (((Number) a).doubleValue() - numericTolerance)).compareTo(((Number) b).doubleValue()) < 0;
        }
        return isLessThan;
    }

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

    Запостил: Actine, 16 Сентября 2014

    Комментарии (5) RSS

    • А еще, кмк, говно здесь в том, что Number не имплементит, сука, Comparable
      Ответить
      • > Number не имплементит Comparable
        А должен? С каким параметром дженерика он должен его имплементить? Попробуй написать адекватный Short.compareTo(Number).

        Не забывай, что имплементить интерфейс в жабе можно только один раз, поэтому Integer уже не сможет заимплементить Comparable<Integer>.
        Ответить
    • последний раз когда делал сравнение на крестах, просто брал разницу между числами. если модуль разницы меньше погрешности, то числа равны. иначе - по знанку разницы.
      Ответить
    • Слишком много всего в одной функции. Для Comparable можно сразу вызвать x.compareTo(y) < 0, для сравнения флотов можно просто написать Math.abs(x - y) < epsilon.
      В общем, типичная проблема жаболюбов - неудержимое желание родить "универсальное" решение, в действительности заточенное под конкретную проблему без намёка на реюзабельность.
      Ответить

    Добавить комментарий