#java
У меня есть 3 метода и для каждого прописаны одни и те же участки кода. как сократить данный участок кода? double n = COUNT; while (Math.abs(rectangleMethod(a, b, 2 * n) - rectangleMethod(a, b, n)) > EXACTNESS) { n *= 2; } System.out.print("Rectangle method: n = " + n + ": "); System.out.println(rectangleMethod(a, b, n)); n = COUNT; while (Math.abs(trapezoidMethod(a, b, 2 * n) - trapezoidMethod(a, b, n)) > EXACTNESS) { n *= 2; } System.out.print("Trapezoid method: n = " + n + ": "); System.out.println(trapezoidMethod(a, b, n)); n = COUNT; while (Math.abs(simpsonFormul(a, b, 2 * n) - simpsonFormul(a, b, n)) > EXACTNESS) { n *= 2; } System.out.print("Simpson method: n = " + n + ": "); System.out.println(simpsonFormul(a, b, n));, b, n));
Ответы
Ответ 1
Не совсем знаю, как у вас устроен ваш код, но вот, к примеру, как можно сократить Интерфейс метода interface Method { double calc(double a, double b, double c); } Соответвенно вам нужно будет реализовать классы для ваших трех типов вычислений(к примеру SimpsonMethod и т.д.) И добавить класс обработки, наподобии class Calc { private final static double EXACTNESS = 100; private final static double COUNT = 0; private Method method; public Calc(Method method) { this.method = method; } double doMethod(double a, double b) { double n = COUNT; while (Math.abs(method.calc(a, b, 2 * n) - method.calc(a, b, n)) > EXACTNESS) { n *= 2; } System.out.print(method.getClass().getSimpleName() + " method: n = " + n + ": "); return n; } } И вызов, соответсвенно, будет наподобии: new Calc(new SimpsonMethod()).doMethod(a, b); И так для каждого из методов(реализаций интерфейса Method)Ответ 2
Да, метод в качестве параметра передать можно. @FunctionalInterface interface TriFunction{ R apply(F first, S second, T third); } class SomeClass { public static double rectangleMethod(int x, int y, double z) { return 1; } public static double trapezoidMethod(int x, int y, double z) { return 2; } public static double simpsonFormul(int x, int y, double z) { return 3; } } public class Demo { private static final int COUNT = 42; private static final int EXACTNESS = 0; private static void someMethod(TriFunction function, int a, int b) { double n = COUNT; while (Math.abs(function.apply(a, b, 2 * n) - function.apply(a, b, n)) > EXACTNESS) { n *= 2; } System.out.format("Результат %.2f при n = %.2f%n", function.apply(a, b, n), n); } public static void main(String[] args) { System.out.print("Rectangle method: "); someMethod(SomeClass::rectangleMethod, 1, 2); System.out.print("Trapezoid method: "); someMethod(SomeClass::trapezoidMethod, 1, 2); System.out.print("Simpson method: "); someMethod(SomeClass::simpsonFormul, 1, 2); } }
Комментариев нет:
Отправить комментарий