Извлечение классов, чтобы сделать код более объектно-ориентированным - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть код, который воссоздает алгоритм длинного деления и графически выводит результат в консоль. Исходный код, который я сделал, является более процедурным, поэтому моя задача состоит в том, чтобы реорганизовать его и сделать его в классическом c объектно-ориентированном стиле, который будет соответствовать следующему шаблону:

public class DividionCalculator {
    private final Validator validator;
    private final DivisionProvider divisionProvider;
    private final ViewProvider viewProvider;

    public DividionCalculator(Validator validator, DivisionProvider divisionProvider, ViewProvider viewProvider) {
        this.validator = validator;
        this.divisionProvider = divisionProvider;
        this.viewProvider = viewProvider;
    }

    public String divide(int divided, int divisor) {
        validator.validate(divided, divisor);

        final List<DivisionStep> items = divisionProvider.divide(divided, divisor);

        return viewProvider.provideView(items);
    }
}

class DivisionProvider {
    public List<DivisionStep> divide(int divided, int divisor) {
        // division implementation
        return Collections.emptyList();
    }
}

class ViewProvider {
    public String provideView(List<DivisionStep> items) {
       // graphical implementation
        return null;
    }

}

class Validator {
    public void validate(int divided, int divisor) {
        //validation implementation
    }
}

class DivisionStep {
    //fields here
}

Кроме того, что мне нужно ввести List Interface, чтобы соответствовать шаблону, моя проблема в том, что все методы действительно интегрированы по всему коду, и я не совсем понимаю, как разделить их, чтобы соответствовать шаблону. Заранее спасибо!

Мой код:

public class Division {

private StringBuilder result = new StringBuilder();
private StringBuilder quotient = new StringBuilder();
private StringBuilder reminder= new StringBuilder();

public String makeDivision(int dividend, int divisor) {

    if (divisor == 0) {
        throw new IllegalArgumentException("Divisor cannot be 0, division by zero");
    }

    dividend = Math.abs(dividend);
    divisor = Math.abs(divisor);

    if (dividend < divisor) {
        return "" + dividend + "/" + divisor + "=0";
    }

    String[] digits = String.valueOf(dividend).split("");
    Integer reminderNumber;
    Integer multiplyResult;
    Integer divisorDigit = calculateDigit(divisor);
    Integer mod;

    for (int i = 0; i < digits.length; i++) {
        reminder.append(digits[i]);
        reminderNumber = Integer.parseInt(reminder.toString());

        if (reminderNumber >= divisor) {
            mod = reminderNumber % divisor;
            multiplyResult = reminderNumber / divisor * divisor;

            String lastReminder = String.format("%" + (i + 2) + "s", "_" + reminderNumber.toString());
            result.append(lastReminder).append("\n");

            String multiply = String.format("%" + (i + 2) + "d", multiplyResult);
            result.append(multiply).append("\n");

            Integer tab = lastReminder.length() - calculateDigit(multiplyResult);
            result.append(makeDivider(reminderNumber, tab)).append("\n");

            quotient.append(reminderNumber / divisor);

            reminder.replace(0, reminder.length(), mod.toString());
            reminderNumber = Integer.parseInt(reminder.toString());
        } else {
            if (i >= divisorDigit) {
                quotient.append(0);
            }
        }

        if (i == digits.length - 1) {
            result.append(String.format("%" + (i + 2) + "s", reminderNumber.toString())).append("\n");
        }
    }
    modifyResultToView(dividend, divisor);
    return result.toString();
}

private String makeDivider(Integer reminderNumber, Integer tab) {
    return assemblyString(tab, ' ') + assemblyString(calculateDigit(reminderNumber), '-');
}

private void modifyResultToView(Integer dividend, Integer divisor) {
    int[] index = new int[3];
    for (int i = 0, j = 0; i < result.length(); i++) {
        if (result.charAt(i) == '\n') {
            index[j] = i;
            j++;
        }

        if (j == 3) {
            break;
        }
    }

    int tab = calculateDigit(dividend) + 1 - index[0];
    result.insert(index[2], assemblyString(tab, ' ') +"│" + quotient.toString());
    result.insert(index[1], assemblyString(tab, ' ') +"│" + assemblyString(quotient.length(), '-'));
    result.insert(index[0], "│" + divisor);
    result.replace(1, index[0], dividend.toString());
}

private int calculateDigit(int i) {
    return (int) Math.log10(i) + 1;
}
private String assemblyString(int numberOfSymbols, char symbol) {
    StringBuilder string = new StringBuilder();
    for (int i = 0; i < numberOfSymbols; i++) {
        string.append(symbol);
    }
    return string.toString();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...