From ea304beb98f2b4ea04935272cdd1cf36552fa5bc Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Thu, 15 Jun 2023 19:14:23 +0900 Subject: [PATCH 01/10] =?UTF-8?q?refactor:=20CalcManager=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=EC=9D=84=20CalcManagerDependency?= =?UTF-8?q?InjectionContainer=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calcproject/Main.java | 27 +++++------ ...lcManagerDependencyInjectionContainer.java | 46 +++++++++++++++++++ .../engine/CalcExpressionTokenizer.java | 1 + .../engine/tokenaction/TokenAction.java | 5 ++ .../factory/CalcManagerViewFactory.java | 9 ++++ .../CalcResultRecordRepositoryFactory.java | 7 +++ .../ConsoleViewCalcManagerViewFactory.java | 31 +++++++++++++ ...moryCalcResultRecordRepositoryFacotry.java | 20 ++++++++ .../MemoryCalcResultRecordRepository.java | 2 +- src/main/java/calcproject/view/Command.java | 4 +- .../view/console/CalcConsoleView.java | 12 +++-- .../MemoryCalcResultRecordRepositoryTest.java | 2 +- 12 files changed, 142 insertions(+), 24 deletions(-) create mode 100644 src/main/java/calcproject/di/container/CalcManagerDependencyInjectionContainer.java create mode 100644 src/main/java/calcproject/engine/tokenaction/TokenAction.java create mode 100644 src/main/java/calcproject/factory/CalcManagerViewFactory.java create mode 100644 src/main/java/calcproject/factory/CalcResultRecordRepositoryFactory.java create mode 100644 src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java create mode 100644 src/main/java/calcproject/factory/InMemoryCalcResultRecordRepositoryFacotry.java diff --git a/src/main/java/calcproject/Main.java b/src/main/java/calcproject/Main.java index 9dedaa95a..e58f65b3e 100644 --- a/src/main/java/calcproject/Main.java +++ b/src/main/java/calcproject/Main.java @@ -1,31 +1,26 @@ package calcproject; -import java.util.HashMap; -import java.util.Map; -import java.util.Scanner; - +import calcproject.di.container.CalcManagerDependencyInjectionContainer; +import calcproject.factory.CalcManagerViewFactory; +import calcproject.factory.CalcResultRecordRepositoryFactory; +import calcproject.factory.ConsoleViewCalcManagerViewFactory; +import calcproject.factory.InMemoryCalcResultRecordRepositoryFacotry; import calcproject.engine.CalcExpressionTokenizer; import calcproject.engine.Calculator; -import calcproject.models.CalcResultRecordModel; -import calcproject.repository.CalcResultRecordRepository; -import calcproject.repository.MemoryCalcResultRecordRepository; import calcproject.service.CalcManager; -import calcproject.view.console.CalcConsoleView; public class Main { public static void main(String[] args) { - Map calcMap = new HashMap<>(); - int startIdx = 0; - CalcResultRecordRepository calcResultRecordRepository = - new MemoryCalcResultRecordRepository(calcMap, startIdx); - Scanner scanner = new Scanner(System.in); - CalcConsoleView calcConsoleView = new CalcConsoleView(scanner); CalcExpressionTokenizer calcExpressionTokenizer = new CalcExpressionTokenizer(); Calculator calculator = new Calculator(calcExpressionTokenizer); - CalcManager calcManager = new CalcManager(calcResultRecordRepository, calcConsoleView, calcConsoleView, - calculator); + CalcManagerViewFactory calcManagerViewFactory = new ConsoleViewCalcManagerViewFactory(); + CalcResultRecordRepositoryFactory calcResultRecordRepositoryFactory = new InMemoryCalcResultRecordRepositoryFacotry(); + + CalcManagerDependencyInjectionContainer calcManagerDependencyInjectionContainer = + new CalcManagerDependencyInjectionContainer(calcResultRecordRepositoryFactory, calcManagerViewFactory, calculator); + CalcManager calcManager = calcManagerDependencyInjectionContainer.createCalcManager(); calcManager.startCalcManager(); } } diff --git a/src/main/java/calcproject/di/container/CalcManagerDependencyInjectionContainer.java b/src/main/java/calcproject/di/container/CalcManagerDependencyInjectionContainer.java new file mode 100644 index 000000000..3e8f26d8f --- /dev/null +++ b/src/main/java/calcproject/di/container/CalcManagerDependencyInjectionContainer.java @@ -0,0 +1,46 @@ +package calcproject.di.container; + +import calcproject.engine.Calculator; +import calcproject.factory.CalcManagerViewFactory; +import calcproject.factory.CalcResultRecordRepositoryFactory; +import calcproject.repository.CalcResultRecordRepository; +import calcproject.service.CalcManager; +import calcproject.view.CalcInput; +import calcproject.view.CalcOutput; + +public class CalcManagerDependencyInjectionContainer { + + private CalcResultRecordRepositoryFactory calcResultRecordRepositoryFactory; + + private CalcManagerViewFactory calcManagerViewFactory; + + private Calculator calculator; + + public CalcManagerDependencyInjectionContainer( + CalcResultRecordRepositoryFactory calcResultRecordRepositoryFactory, + CalcManagerViewFactory calcManagerViewFactory, Calculator calculator) { + this.calcResultRecordRepositoryFactory = calcResultRecordRepositoryFactory; + this.calcManagerViewFactory = calcManagerViewFactory; + this.calculator = calculator; + } + + public CalcManager createCalcManager() { + CalcResultRecordRepository calcResultRecordRepository = + calcResultRecordRepositoryFactory.createCalcResultRecordRepository(); + + CalcInput calcInput = + calcManagerViewFactory.createCalcInput(); + + CalcOutput calcOutput = + calcManagerViewFactory.createCalcOutput(); + + CalcManager calcManager = new CalcManager( + calcResultRecordRepository, + calcInput, + calcOutput, + this.calculator + ); + + return calcManager; + } +} diff --git a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java index 2d0996d30..9e5ac7918 100644 --- a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java +++ b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java @@ -4,6 +4,7 @@ public class CalcExpressionTokenizer { public List tokenizeExpression(String expression) { + return null; } } diff --git a/src/main/java/calcproject/engine/tokenaction/TokenAction.java b/src/main/java/calcproject/engine/tokenaction/TokenAction.java new file mode 100644 index 000000000..d05bb4ceb --- /dev/null +++ b/src/main/java/calcproject/engine/tokenaction/TokenAction.java @@ -0,0 +1,5 @@ +package calcproject.engine.tokenaction; + +public interface TokenAction { + void perform(); +} diff --git a/src/main/java/calcproject/factory/CalcManagerViewFactory.java b/src/main/java/calcproject/factory/CalcManagerViewFactory.java new file mode 100644 index 000000000..364856693 --- /dev/null +++ b/src/main/java/calcproject/factory/CalcManagerViewFactory.java @@ -0,0 +1,9 @@ +package calcproject.factory; + +import calcproject.view.CalcInput; +import calcproject.view.CalcOutput; + +public interface CalcManagerViewFactory { + public CalcInput createCalcInput(); + public CalcOutput createCalcOutput(); +} diff --git a/src/main/java/calcproject/factory/CalcResultRecordRepositoryFactory.java b/src/main/java/calcproject/factory/CalcResultRecordRepositoryFactory.java new file mode 100644 index 000000000..55209a405 --- /dev/null +++ b/src/main/java/calcproject/factory/CalcResultRecordRepositoryFactory.java @@ -0,0 +1,7 @@ +package calcproject.factory; + +import calcproject.repository.CalcResultRecordRepository; + +public interface CalcResultRecordRepositoryFactory { + public CalcResultRecordRepository createCalcResultRecordRepository(); +} diff --git a/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java b/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java new file mode 100644 index 000000000..2e6293723 --- /dev/null +++ b/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java @@ -0,0 +1,31 @@ +package calcproject.factory; + +import java.util.Scanner; + +import calcproject.view.CalcInput; +import calcproject.view.CalcOutput; +import calcproject.view.console.CalcConsoleView; + +public class ConsoleViewCalcManagerViewFactory implements CalcManagerViewFactory { + + private CalcConsoleView calcConsoleView; + + public ConsoleViewCalcManagerViewFactory() { + this.calcConsoleView = createCalcConsoleView(); + } + + public CalcConsoleView createCalcConsoleView() { + CalcConsoleView calcConsoleView = new CalcConsoleView(); + return calcConsoleView; + } + + @Override + public CalcInput createCalcInput() { + return this.calcConsoleView; + } + + @Override + public CalcOutput createCalcOutput() { + return this.calcConsoleView; + } +} diff --git a/src/main/java/calcproject/factory/InMemoryCalcResultRecordRepositoryFacotry.java b/src/main/java/calcproject/factory/InMemoryCalcResultRecordRepositoryFacotry.java new file mode 100644 index 000000000..aa9be564a --- /dev/null +++ b/src/main/java/calcproject/factory/InMemoryCalcResultRecordRepositoryFacotry.java @@ -0,0 +1,20 @@ +package calcproject.factory; + +import java.util.HashMap; +import java.util.Map; + +import calcproject.models.CalcResultRecordModel; +import calcproject.repository.CalcResultRecordRepository; +import calcproject.repository.MemoryCalcResultRecordRepository; + +public class InMemoryCalcResultRecordRepositoryFacotry implements CalcResultRecordRepositoryFactory { + @Override + public CalcResultRecordRepository createCalcResultRecordRepository() { + Map calcMap = new HashMap<>(); + int startIdx = 0; + CalcResultRecordRepository calcResultRecordRepository = + new MemoryCalcResultRecordRepository(calcMap, startIdx); + + return calcResultRecordRepository; + } +} diff --git a/src/main/java/calcproject/repository/MemoryCalcResultRecordRepository.java b/src/main/java/calcproject/repository/MemoryCalcResultRecordRepository.java index b1fce01fd..124cd6f1d 100644 --- a/src/main/java/calcproject/repository/MemoryCalcResultRecordRepository.java +++ b/src/main/java/calcproject/repository/MemoryCalcResultRecordRepository.java @@ -27,7 +27,7 @@ public void saveCalcResultRecord(CalcResultRecordModel calcResultRecord) { public List loadCalcResultRecords() { return this.calcMap.values() .stream() - .sorted(Comparator.comparing(calcModel -> calcModel.getId())) + .sorted(Comparator.comparing(CalcResultRecordModel::getId)) .collect(Collectors.toList()); } } diff --git a/src/main/java/calcproject/view/Command.java b/src/main/java/calcproject/view/Command.java index 3af202bc4..98cea6d13 100644 --- a/src/main/java/calcproject/view/Command.java +++ b/src/main/java/calcproject/view/Command.java @@ -14,8 +14,10 @@ public enum Command { } public static Command valueOf(int choiceNum) { + Arrays.stream(values()).forEach(System.out::println); + return Arrays.stream(values()) - .filter(value -> value.equals(choiceNum)) + .filter(value -> value.getCmdIdx() == choiceNum) .findAny() .orElse(CALCULATE.EXIT); } diff --git a/src/main/java/calcproject/view/console/CalcConsoleView.java b/src/main/java/calcproject/view/console/CalcConsoleView.java index 24ee6d936..0155ccf66 100644 --- a/src/main/java/calcproject/view/console/CalcConsoleView.java +++ b/src/main/java/calcproject/view/console/CalcConsoleView.java @@ -12,19 +12,21 @@ public class CalcConsoleView implements CalcInput, CalcOutput { private Scanner scanner; - public CalcConsoleView(Scanner scanner) { - this.scanner = scanner; + public CalcConsoleView() { + this.scanner = new Scanner(System.in); } @Override public Command getCmd() { - System.out.println(Messages.INPUT_GUIDE_MESSAGE); - System.out.print(Messages.INPUT_CHOICE_MESSAGE); + System.out.println(Messages.INPUT_GUIDE_MESSAGE.getMessage()); + System.out.print(Messages.INPUT_CHOICE_MESSAGE.getMessage()); int choiceNum = this.scanner.nextInt(); this.scanner.nextLine(); + System.out.println(choiceNum); Command command = Command.valueOf(choiceNum); + System.out.println(command); return command; } @@ -57,7 +59,7 @@ private String calcRecordToFormattedStr(CalcResultRecordModel calcRecord) { @Override public void showExitMessage() { - System.out.println(Messages.EXIT_MESSAGE); + System.out.println(Messages.EXIT_MESSAGE.getMessage()); } } diff --git a/src/test/java/MemoryCalcResultRecordRepositoryTest.java b/src/test/java/MemoryCalcResultRecordRepositoryTest.java index d2fa990dd..ed0058a90 100644 --- a/src/test/java/MemoryCalcResultRecordRepositoryTest.java +++ b/src/test/java/MemoryCalcResultRecordRepositoryTest.java @@ -30,10 +30,10 @@ void testLoadCalcRecords() { CalcResultRecordModel calcRecord2 = new CalcResultRecordModel("3+3", 6); calcResultRecordRepository.saveCalcResultRecord(calcRecord1); calcResultRecordRepository.saveCalcResultRecord(calcRecord2); + List expectedCalcRecords = Arrays.asList(calcRecord1, calcRecord2); // when List resultCalcRecords = calcResultRecordRepository.loadCalcResultRecords(); - List expectedCalcRecords = Arrays.asList(calcRecord1, calcRecord2); // then Assertions.assertThat(resultCalcRecords) From 610619a6a37024b6f40c68d3f9aaa444bcd4cec2 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Thu, 15 Jun 2023 19:52:43 +0900 Subject: [PATCH 02/10] =?UTF-8?q?refactor:=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20null=20=EB=8C=80=EC=8B=A0=20=EB=B9=88=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/calcproject/engine/CalcExpressionTokenizer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java index 9e5ac7918..09ef87895 100644 --- a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java +++ b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java @@ -1,10 +1,12 @@ package calcproject.engine; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class CalcExpressionTokenizer { public List tokenizeExpression(String expression) { - - return null; + List list = new ArrayList<>(); + return list; } } From bf3f864572e3194a36795a52fab9bd28d2f3d56f Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Thu, 15 Jun 2023 23:03:59 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20=EC=8B=9D=EC=9D=84=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=9C=BC=EB=A1=9C=20=EB=82=98=EB=88=84=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/CalcExpressionTokenizer.java | 25 +++++++++- .../java/calcproject/engine/Calculator.java | 46 +++++++++++++++++++ .../java/calcproject/engine/Operator.java | 40 ++++++++++++++++ src/main/java/calcproject/view/Command.java | 2 - .../engine/CalcExpressionTokenizerTest.java | 36 +++++++++++++++ 5 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 src/main/java/calcproject/engine/Operator.java create mode 100644 src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java diff --git a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java index 09ef87895..a72e20b12 100644 --- a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java +++ b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java @@ -6,7 +6,28 @@ public class CalcExpressionTokenizer { public List tokenizeExpression(String expression) { - List list = new ArrayList<>(); - return list; + List tokens = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + expression = expression.replace(" ", ""); + + for (int i = 0; i < expression.length(); i++) { + char c = expression.charAt(i); + + if (Character.isDigit(c)) { + sb.append(c); + } else { + String numberString = sb.toString(); + tokens.add(numberString); + sb.setLength(0); + tokens.add(Character.toString(c)); + } + } + + if (sb.length() > 0) { + String numberString = sb.toString(); + tokens.add(numberString); + } + + return tokens; } } diff --git a/src/main/java/calcproject/engine/Calculator.java b/src/main/java/calcproject/engine/Calculator.java index 6923460e6..791af4d55 100644 --- a/src/main/java/calcproject/engine/Calculator.java +++ b/src/main/java/calcproject/engine/Calculator.java @@ -1,6 +1,8 @@ package calcproject.engine; +import java.util.ArrayList; import java.util.List; +import java.util.Stack; public class Calculator { private CalcExpressionTokenizer calcExpressionTokenizer; @@ -9,8 +11,52 @@ public Calculator(CalcExpressionTokenizer calcExpressionTokenizer) { this.calcExpressionTokenizer = calcExpressionTokenizer; } + private boolean isNumber(String token) { + for (int i=0; i tokensToPostfixNotation(List tokens) { + Stack stack = new Stack<>(); + List postFixNotationTokens = new ArrayList<>(); + for (String currentToken : tokens) { + if (isNumber(currentToken)) { + postFixNotationTokens.add(currentToken); + continue; + } + + while(!stack.empty()) { + Operator currentOperator = Operator.opValueOf(currentToken); + Operator stackPeekOPerator = Operator.opValueOf(stack.peek()); + + if ( stackPeekOPerator == Operator.UnSupportedOp) { + return null; + } + + if ( currentOperator.getPriority() > stackPeekOPerator.getPriority()) { + break; + } + + postFixNotationTokens.add(stack.pop()); + } + + stack.add(currentToken); + } + + while (!stack.empty()) { + postFixNotationTokens.add(stack.pop()); + } + + return postFixNotationTokens; + } + public double calculateExpression(String expression) { List tokens = calcExpressionTokenizer.tokenizeExpression(expression); + + return Double.NaN; } } diff --git a/src/main/java/calcproject/engine/Operator.java b/src/main/java/calcproject/engine/Operator.java new file mode 100644 index 000000000..e0ddb2ab6 --- /dev/null +++ b/src/main/java/calcproject/engine/Operator.java @@ -0,0 +1,40 @@ +package calcproject.engine; + +import java.util.Arrays; +import java.util.Optional; + +import calcproject.view.Command; + +public enum Operator { + Plus("+", 0), + Minus("-", 0), + Multiply("*", 1), + Divide("/", 1), + UnSupportedOp("", -1); + + private String operator; + private int priority; + Operator(String operator, int priority) { + this.operator = operator; + this.priority = priority; + } + + public String getOperator() { + return this.operator; + } + + public int getPriority() { + return this.priority; + } + + public static Operator opValueOf(String op) { + return Arrays.stream(values()) + .filter( + value -> value + .getOperator() + .equals(op) + ) + .findAny() + .orElse(Operator.UnSupportedOp); + } +} diff --git a/src/main/java/calcproject/view/Command.java b/src/main/java/calcproject/view/Command.java index 98cea6d13..24c8ec787 100644 --- a/src/main/java/calcproject/view/Command.java +++ b/src/main/java/calcproject/view/Command.java @@ -14,8 +14,6 @@ public enum Command { } public static Command valueOf(int choiceNum) { - Arrays.stream(values()).forEach(System.out::println); - return Arrays.stream(values()) .filter(value -> value.getCmdIdx() == choiceNum) .findAny() diff --git a/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java b/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java new file mode 100644 index 000000000..92dd910f9 --- /dev/null +++ b/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java @@ -0,0 +1,36 @@ +package calcproject.engine; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class CalcExpressionTokenizerTest { + + private CalcExpressionTokenizer calcExpressionTokenizer; + + @BeforeEach + void beforeEach() { + this.calcExpressionTokenizer = new CalcExpressionTokenizer(); + } + + @Test + @DisplayName("식을 토큰 단위로 나누는 테스트") + void tokenizeExpression() { + //given + String expression = "1 + 2 * 3 / 4"; + List expectedTokens = Arrays.asList("1", "+", "2", "*", "3", "/", "4"); + + //when + List resultTokens = calcExpressionTokenizer.tokenizeExpression(expression); + + //then + Assertions.assertThat(resultTokens) + .containsExactlyInAnyOrderElementsOf(expectedTokens); + } +} \ No newline at end of file From 218140d535deda76cf5431c2aad1b47ac47c2a1c Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Thu, 15 Jun 2023 23:05:32 +0900 Subject: [PATCH 04/10] =?UTF-8?q?style:=20=EC=9E=90=EB=B0=94=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=BD=94=EB=93=9C=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/calcproject/Main.java | 7 ++++--- .../engine/CalcExpressionTokenizer.java | 1 - .../java/calcproject/engine/Calculator.java | 11 +++++----- .../java/calcproject/engine/Operator.java | 20 +++++++++---------- .../factory/CalcManagerViewFactory.java | 1 + .../ConsoleViewCalcManagerViewFactory.java | 2 -- .../engine/CalcExpressionTokenizerTest.java | 2 -- .../MemoryCalcResultRecordRepositoryTest.java | 0 8 files changed, 19 insertions(+), 25 deletions(-) rename src/test/java/{ => calcproject/repository}/MemoryCalcResultRecordRepositoryTest.java (100%) diff --git a/src/main/java/calcproject/Main.java b/src/main/java/calcproject/Main.java index e58f65b3e..616aab2b4 100644 --- a/src/main/java/calcproject/Main.java +++ b/src/main/java/calcproject/Main.java @@ -1,12 +1,12 @@ package calcproject; import calcproject.di.container.CalcManagerDependencyInjectionContainer; +import calcproject.engine.CalcExpressionTokenizer; +import calcproject.engine.Calculator; import calcproject.factory.CalcManagerViewFactory; import calcproject.factory.CalcResultRecordRepositoryFactory; import calcproject.factory.ConsoleViewCalcManagerViewFactory; import calcproject.factory.InMemoryCalcResultRecordRepositoryFacotry; -import calcproject.engine.CalcExpressionTokenizer; -import calcproject.engine.Calculator; import calcproject.service.CalcManager; public class Main { @@ -18,7 +18,8 @@ public static void main(String[] args) { CalcResultRecordRepositoryFactory calcResultRecordRepositoryFactory = new InMemoryCalcResultRecordRepositoryFacotry(); CalcManagerDependencyInjectionContainer calcManagerDependencyInjectionContainer = - new CalcManagerDependencyInjectionContainer(calcResultRecordRepositoryFactory, calcManagerViewFactory, calculator); + new CalcManagerDependencyInjectionContainer(calcResultRecordRepositoryFactory, calcManagerViewFactory, + calculator); CalcManager calcManager = calcManagerDependencyInjectionContainer.createCalcManager(); calcManager.startCalcManager(); diff --git a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java index a72e20b12..c0780b294 100644 --- a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java +++ b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java @@ -1,7 +1,6 @@ package calcproject.engine; import java.util.ArrayList; -import java.util.Collection; import java.util.List; public class CalcExpressionTokenizer { diff --git a/src/main/java/calcproject/engine/Calculator.java b/src/main/java/calcproject/engine/Calculator.java index 791af4d55..0c8e7d72e 100644 --- a/src/main/java/calcproject/engine/Calculator.java +++ b/src/main/java/calcproject/engine/Calculator.java @@ -12,8 +12,8 @@ public Calculator(CalcExpressionTokenizer calcExpressionTokenizer) { } private boolean isNumber(String token) { - for (int i=0; i tokensToPostfixNotation(List tokens) { continue; } - while(!stack.empty()) { + while (!stack.empty()) { Operator currentOperator = Operator.opValueOf(currentToken); Operator stackPeekOPerator = Operator.opValueOf(stack.peek()); - if ( stackPeekOPerator == Operator.UnSupportedOp) { + if (stackPeekOPerator == Operator.UnSupportedOp) { return null; } - if ( currentOperator.getPriority() > stackPeekOPerator.getPriority()) { + if (currentOperator.getPriority() > stackPeekOPerator.getPriority()) { break; } @@ -56,7 +56,6 @@ public List tokensToPostfixNotation(List tokens) { public double calculateExpression(String expression) { List tokens = calcExpressionTokenizer.tokenizeExpression(expression); - return Double.NaN; } } diff --git a/src/main/java/calcproject/engine/Operator.java b/src/main/java/calcproject/engine/Operator.java index e0ddb2ab6..4a1058f71 100644 --- a/src/main/java/calcproject/engine/Operator.java +++ b/src/main/java/calcproject/engine/Operator.java @@ -1,9 +1,6 @@ package calcproject.engine; import java.util.Arrays; -import java.util.Optional; - -import calcproject.view.Command; public enum Operator { Plus("+", 0), @@ -14,19 +11,12 @@ public enum Operator { private String operator; private int priority; + Operator(String operator, int priority) { this.operator = operator; this.priority = priority; } - public String getOperator() { - return this.operator; - } - - public int getPriority() { - return this.priority; - } - public static Operator opValueOf(String op) { return Arrays.stream(values()) .filter( @@ -37,4 +27,12 @@ public static Operator opValueOf(String op) { .findAny() .orElse(Operator.UnSupportedOp); } + + public String getOperator() { + return this.operator; + } + + public int getPriority() { + return this.priority; + } } diff --git a/src/main/java/calcproject/factory/CalcManagerViewFactory.java b/src/main/java/calcproject/factory/CalcManagerViewFactory.java index 364856693..ae6a44652 100644 --- a/src/main/java/calcproject/factory/CalcManagerViewFactory.java +++ b/src/main/java/calcproject/factory/CalcManagerViewFactory.java @@ -5,5 +5,6 @@ public interface CalcManagerViewFactory { public CalcInput createCalcInput(); + public CalcOutput createCalcOutput(); } diff --git a/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java b/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java index 2e6293723..3743bdd10 100644 --- a/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java +++ b/src/main/java/calcproject/factory/ConsoleViewCalcManagerViewFactory.java @@ -1,7 +1,5 @@ package calcproject.factory; -import java.util.Scanner; - import calcproject.view.CalcInput; import calcproject.view.CalcOutput; import calcproject.view.console.CalcConsoleView; diff --git a/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java b/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java index 92dd910f9..976e2e6b1 100644 --- a/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java +++ b/src/test/java/calcproject/engine/CalcExpressionTokenizerTest.java @@ -1,7 +1,5 @@ package calcproject.engine; -import static org.junit.jupiter.api.Assertions.*; - import java.util.Arrays; import java.util.List; diff --git a/src/test/java/MemoryCalcResultRecordRepositoryTest.java b/src/test/java/calcproject/repository/MemoryCalcResultRecordRepositoryTest.java similarity index 100% rename from src/test/java/MemoryCalcResultRecordRepositoryTest.java rename to src/test/java/calcproject/repository/MemoryCalcResultRecordRepositoryTest.java From bbd270b8adc21ac339f00c01f2bc9cb54ec5f8c7 Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Thu, 15 Jun 2023 23:49:18 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/CalcExpressionTokenizer.java | 14 +++-- .../java/calcproject/engine/Calculable.java | 5 ++ .../java/calcproject/engine/Calculator.java | 25 ++++++++- .../java/calcproject/engine/Operator.java | 19 +++++-- .../calcproject/engine/CalculatorTest.java | 56 +++++++++++++++++++ 5 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 src/main/java/calcproject/engine/Calculable.java create mode 100644 src/test/java/calcproject/engine/CalculatorTest.java diff --git a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java index c0780b294..0a70f8a73 100644 --- a/src/main/java/calcproject/engine/CalcExpressionTokenizer.java +++ b/src/main/java/calcproject/engine/CalcExpressionTokenizer.java @@ -7,18 +7,22 @@ public class CalcExpressionTokenizer { public List tokenizeExpression(String expression) { List tokens = new ArrayList<>(); StringBuilder sb = new StringBuilder(); - expression = expression.replace(" ", ""); for (int i = 0; i < expression.length(); i++) { - char c = expression.charAt(i); + char ch = expression.charAt(i); - if (Character.isDigit(c)) { - sb.append(c); + if (ch == ' ') { + continue; + } + + if (Character.isDigit(ch)) { + sb.append(ch); } else { String numberString = sb.toString(); tokens.add(numberString); sb.setLength(0); - tokens.add(Character.toString(c)); + + tokens.add(Character.toString(ch)); } } diff --git a/src/main/java/calcproject/engine/Calculable.java b/src/main/java/calcproject/engine/Calculable.java new file mode 100644 index 000000000..2550e623e --- /dev/null +++ b/src/main/java/calcproject/engine/Calculable.java @@ -0,0 +1,5 @@ +package calcproject.engine; + +public interface Calculable { + public double calculate(double num1, double num2); +} diff --git a/src/main/java/calcproject/engine/Calculator.java b/src/main/java/calcproject/engine/Calculator.java index 0c8e7d72e..d86561333 100644 --- a/src/main/java/calcproject/engine/Calculator.java +++ b/src/main/java/calcproject/engine/Calculator.java @@ -53,9 +53,32 @@ public List tokensToPostfixNotation(List tokens) { return postFixNotationTokens; } + public double calculatePostfixNotation(List postFixNotationTokens) { + Stack stack = new Stack<>(); + + for (int i = 0; i < postFixNotationTokens.size(); i++) { + String token = postFixNotationTokens.get(i); + + if (isNumber(token)) { + double num = Double.valueOf(token); + stack.push(num); + } else { + Operator operator = Operator.opValueOf(token); + + double operand2 = stack.pop(); + double operand1 = stack.pop(); + double result = operator.calculate(operand1, operand2); + stack.push(result); + } + } + + return stack.pop(); + } + public double calculateExpression(String expression) { List tokens = calcExpressionTokenizer.tokenizeExpression(expression); + double calcResult = calculatePostfixNotation(tokens); - return Double.NaN; + return calcResult; } } diff --git a/src/main/java/calcproject/engine/Operator.java b/src/main/java/calcproject/engine/Operator.java index 4a1058f71..e795b92ae 100644 --- a/src/main/java/calcproject/engine/Operator.java +++ b/src/main/java/calcproject/engine/Operator.java @@ -1,20 +1,23 @@ package calcproject.engine; import java.util.Arrays; +import java.util.function.BiFunction; public enum Operator { - Plus("+", 0), - Minus("-", 0), - Multiply("*", 1), - Divide("/", 1), - UnSupportedOp("", -1); + Plus("+", 0, (a, b) -> a + b), + Minus("-", 0, (a, b) -> a - b), + Multiply("*", 1, (a, b) -> a * b), + Divide("/", 1, (a, b) -> a / b), + UnSupportedOp("", -1, (a,b) -> Double.NaN); private String operator; private int priority; + private Calculable calculable; - Operator(String operator, int priority) { + Operator(String operator, int priority, Calculable calculable) { this.operator = operator; this.priority = priority; + this.calculable = calculable; } public static Operator opValueOf(String op) { @@ -35,4 +38,8 @@ public String getOperator() { public int getPriority() { return this.priority; } + + public double calculate(double num1, double num2) { + return this.calculable.calculate(num1, num2); + } } diff --git a/src/test/java/calcproject/engine/CalculatorTest.java b/src/test/java/calcproject/engine/CalculatorTest.java new file mode 100644 index 000000000..505f28daf --- /dev/null +++ b/src/test/java/calcproject/engine/CalculatorTest.java @@ -0,0 +1,56 @@ +package calcproject.engine; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import calcproject.engine.tokenaction.TokenAction; + +class CalculatorTest { + + private static CalcExpressionTokenizer tokenizer; + private static Calculator calculator; + + @BeforeAll + public static void beforeAll() { + tokenizer = new CalcExpressionTokenizer(); + calculator = new Calculator(tokenizer); + } + + @Test + void tokensToPostfixNotation() { + //given + String expression = "1+2*3"; + List tokens = tokenizer.tokenizeExpression(expression); + List expectedTokens = Arrays.asList("1", "2", "3", "*", "+"); + + //when + List resultTokens = calculator.tokensToPostfixNotation(tokens); + + //then + Assertions.assertThat(resultTokens) + .containsExactlyInAnyOrderElementsOf(expectedTokens); + + } + + @Test + void calculateExpression() { + //given + String expression = "1+2*3"; + List tokens = tokenizer.tokenizeExpression(expression); + List postfixNotationTokens = calculator.tokensToPostfixNotation(tokens); + double expectedResult = 7; + + //when + double calcResult = calculator.calculatePostfixNotation(postfixNotationTokens); + + // + Assertions.assertThat(calcResult) + .isEqualTo(expectedResult); + } +} \ No newline at end of file From 4b4de21fd1fbb745fa3808a9f135b16269b2692a Mon Sep 17 00:00:00 2001 From: Curry4182 Date: Fri, 16 Jun 2023 02:01:07 +0900 Subject: [PATCH 06/10] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=92=20=EC=9D=84=20=EB=B0=9B=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 1 + .../engine/CalcExpressionTokenizerTest.java | 22 +++++++--- .../calcproject/engine/CalculatorTest.java | 41 ++++++++++++------ .../MemoryCalcResultRecordRepositoryTest.java | 43 +++++++++++++------ 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index ed8b09936..84fb8587b 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,6 +4,7 @@