Проектирование по контракту с поиском предварительных условий

Мне нужно создать калькулятор на Java на основе этого интерфейса.

public interface CalculatorIF {
    int add(int x, int y);
    int sub(int x, int y);
    int mult(int x, int y);
    //double div(int x, int y);
    //int sqrt(int x);
}

Но для каждого метода мне нужны предварительные условия. Мне действительно нужна помощь для предварительных условий, потому что я не могу представить ни одного, который имеет смысл и еще не обрабатывается Java.

РЕДАКТИРОВАТЬ: разделение и sqrt мне понятны, но мне нужны некоторые идеи для добавления, сабвуфера и мульта.


person koin    schedule 05.11.2016    source источник
comment
Что вы имеете в виду под управлением Java?   -  person ItamarG3    schedule 05.11.2016
comment
Я имею в виду, что для моего метода добавления я могу только представить, что предварительное условие x или y больше, чем Integer.MAX_VALUE, но это уже обрабатывается java.   -  person koin    schedule 05.11.2016
comment
предварительное условие для sqrt неотрицательно? или для div это y!=0? может я просто ошибаюсь но может так оно и есть   -  person ItamarG3    schedule 05.11.2016
comment
Деление на ноль? Квадратный корень из отрицательных чисел? Java выдаст исключение ArithmeticException в случае деления на ноль и вернет NaN, и в этом случае вы должны проверить в методе sqrt, является ли int x отрицательным, и если да, то выдать соответствующее исключение...   -  person nvkrj    schedule 05.11.2016
comment
Если нечего проверять, нечего и проверять   -  person baao    schedule 05.11.2016
comment
Да, извините, я забыл упомянуть, что мне просто нужно немного для добавления, сабвуфера и мульта. Деление y!=0 и sqrt x ›= 0 было довольно простым. @baao да, но в моей задаче это написано явно, поэтому я немного волновался, что я что-то упускаю   -  person koin    schedule 05.11.2016


Ответы (1)


Если вы добавите два значения Integer.MAX_VALUE, результат не будет соответствовать int и будет усечен. С другой стороны, если входной домен ограничен, мы всегда можем гарантировать, что результат не усекается и вместо этого имеет ожидаемое значение.

Например, если x <= Integer.MAX_VALUE / 2 и y <= Integer.MAX_VALUE / 2, то сумма x + y будет меньше или равна Integer.MAX_VALUE, поэтому для положительных целых чисел усечения не будет. Аналогичные рассуждения можно использовать для отрицательных значений и Integer.MIN_VALUE. Таким же образом можно сделать предварительные условия для вычитания.

Для умножения, если абсолютное значение любого из операндов меньше sqrt (Integer.MAX_VALUE), их произведение будет в пределах диапазона int.

Возможны и более изощренные способы обнаружения переполнения и потери значимости, но для занятий в классе такие предварительные условия кажутся подходящими.

person Alexander Kogtenkov    schedule 06.11.2016