Как вынести расчет в отдельный метод?

112
19 марта 2022, 08:50

У меня вопрос по алгоритму. Делаю линеаризацию. Я хочу загнать общую часть вычислений в отдельный метод. Чтобы не вдаваться в математические подробности, приведу код и объясню.

 public ArrayList<Double> calculateCommonPart(){
    ArrayList <Ellipse2D.Double> transformedData = new ArrayList<>();
    ArrayList<Double> result = new ArrayList<>();
    for (int i = 0; i <pointList.size(); i++) {
        transformedData.add(pointList.get(i));
    }
    // линеаризация y = ax^b
    // считаем коэффициенты a и b
    double averageProductXY =0;
    double averageX =0;
    double averageY =0;
    double averageSqrX = 0;
    int n = pointList.size();
    double newX =0;
    double newY  =0;

    for (int i = 0; i < n ; i++) {
        Ellipse2D.Double CurrentPoint = pointList.get(i);
        // разные newX и newY для разных формул, остальное общее для всех формул
        newX = Math.log(CurrentPoint.getX());
        newY = Math.log(CurrentPoint.getY());
        averageX += newX;
        averageY +=newY;
        averageSqrX += Math.pow(newX, 2);
        averageProductXY += newX*newY;
    }
    averageProductXY /=n;
    averageX/=n;
    averageY/=n;
    averageSqrX/=n;
    double sqrDispX = 0d;
    sqrDispX = averageSqrX - Math.pow(averageX,2);
    double a =(averageSqrX*averageY - averageX*averageProductXY)/sqrDispX;
    double b =0d;
    b = (averageProductXY-averageX*averageY)/(sqrDispX);
    result.add(a);
    result.add(b);
return result;
} 

Проблема в том, что я не знаю, как реализовать вариативное присваивание переменным newX и newY их значений. Например, для функции вида y = ax^bnewX = Math.log(x); newY = log(y), а для функцииy = x/(ax+b)newX = 1/x newY = 1/y

Привожу таблицу линеаризации

Как можно эту разную часть разграничить с общей? Подскажите алгоритм

Answer 1

Реализуйте патерн шаблонный метод

Помещаете ваш метод в Абстрактный класс

public abstract class CalculatorAbstract{
    public ArrayList<Double> calculateCommonPart(){
        ...
        // разные newX и newY для разных формул, остальное общее для всех формул
        newX = getNewX();
        newY = getNewY();
        ...
    } 
    public abstract double getNewX();
    public abstract double getNewY(); 
}

Дальше создаете конкретные реализации

public class CalculatorConcrete extends CalculatorAbstract{
    @Override
    public double getNewX(){
        return Math.log(CurrentPoint.getX());
    }
    @Override
    public double getNewY(){
        return Math.log(CurrentPoint.getY());
    } 
}

Подробней про паттерн можно прочитать здесь https://systems-ez.ru/index.php/ru/patterns/template-method

Answer 2

Вынестие частное в отдельные классы, которые реализуют один и тот же интерфейс, и в общем коде обращайтесь к этому интерфейсу

interface newXY { // если x и y вычисляются всегда одинаково, то достаточно и одного метода
  double getNewX(double x);
  double getNewY(double y);
}
// и несколько реализаций по функциям
class newXYLog implements newXY {
  @Override
  double getNewX(double x) {
    return Math.log(x);
  }
  @Override
  double getNewY(double y) {
    return Math.log(y);
  }
} 
// и в коде у вас будет
newXY func = ...; //
...
    newX = func.getNewX(CurrentPoint.getX())
    newY = func.getNewY(CurrentPoint.getY())
READ ALSO
Почему не работают события hover?

Почему не работают события hover?

Не могу понять почему не работает вот такого вида событие hover

117
Картинку и цвет фоном

Картинку и цвет фоном

Как наложить цвет поверх логотипа через CSS, как на картинке?

92
Как запустить процесс nohup через php скрипт?

Как запустить процесс nohup через php скрипт?

Хочу через php скрипт запустить работу в фоне другого скрипта, для этого в script_1php пишу такой код:

99
Вывод из файла txt

Вывод из файла txt

Есть файл filetxt с таким содержимым

93