У меня есть код, который воссоздает алгоритм длинного деления и графически выводит результат в консоль. Исходный код, который я сделал, является более процедурным, поэтому моя задача состоит в том, чтобы реорганизовать его и сделать его в классическом 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();
}
}