Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[라빈] 온보딩 - 학습 테스트, 단위 테스트 #3

Merged
merged 18 commits into from
Feb 10, 2020

Conversation

giantim
Copy link

@giantim giantim commented Feb 7, 2020

안녕하세요
우아한 테크코스 2기 라빈입니다.
온보딩 미션 리뷰 부탁드립니다.
감사합니다.

Copy link

@kingbbode kingbbode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 :) 잘 구현해주셨네요.
몇 가지 피드백 남겨두었습니다.
확인 부탁드려요!


private double calculateByOperator(double left, double right, String operator) {
double result = 0d;
if (operator.equals("+")) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

존재할 가능성이 큰 것으로부터 사용되는 것이 안전합니다. :)

"+".eqauls(operator)

System.out.print("계산식을 입력하시오: ");
String inputLine = scanner.nextLine();
try {
validator.isValidInput(inputLine);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is 접두어를 갖는 메서드는 boolean 타입을 반환하는 것이 컨벤션입니다 :)

validator.isValidInput(inputLine);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return inputString();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

계속해서 잘못된 문자열을 입력한다면 콜스택이 쌓이게 되겠네요.
out of memory 가 발생할 수 있는 코드는 피하는 것이 좋습니다.
콜스택이 쌓이지 않도록 풀어보는 것은 어떨까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 사용자가 정상 문자열을 입력할 때 까지 입력을 계속해서 받도록 하기 위해 try catch 문을 이용하였습니다. 근데 이 방법에서 콜스택이 쌓이는 부분을 고려하지 못했네요. 수정한 방법으로는 사용자가 비정상적인 문자열을 입력하면 계산기가 종료되도록 구현했습니다.


import java.util.Scanner;

public class Input {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Input 이란 클래스명과 inputString, splitString 이란 메서드명으로는, 이 클래스와 메서드가 이 무엇을 입력받고, 무엇을 처리하는지 알기 어렵네요 :)

추상적이거나 광범위한 네이밍보다는 역할과 의도를 드러낼 수 있는 네이밍을 해보는 것이 어떨까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

클래스와 메소드의 이름을 짓는 것이 정말 어려운것 같습니다. 왜냐하면 의도를 나타내도록 이름을 짓다보니까 이름이 길어져서 가독성이 떨어지는것 처럼 느껴집니다. 제가 변경한 클래스와 메소드 이름을 보시고 다시 한번 피드백 해주실 수 있나요? :)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

과거에는 축약어를 사용하는 등으로 코드 양을 줄이려고 했다면, 요즘은 네이밍을 있는 그대로 풀어서 작성하여 가독성을 높이려는 노력을 현업에서 더 많이 하고 있습니다
이름이 길어진다고 가독성이 떨어지진 않습니다. :)


import java.util.ArrayList;

public class Validator {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추상적이거나 광범위한 네이밍보다는 역할과 의도를 드러낼 수 있는 네이밍을 해보는 것이 어떨까요?

}
}

private void checkIsDoubleNumber(String s) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

check, is 가 함께 있는 네이밍이 어색하네요 :)

for (int i = 1; i < splitedInput.length; i = i + 2) {
String operator = splitedInput[i];
String number = splitedInput[i + 1];
if (operator.equals("/") && number.equals("0")) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이곳에 있는 "/" 과 operators 에 있는 "/" 는 같은 의미일 것 입니다.
만약 작성하는 프로그램에서 나누기 연산의 기호를 변경하려고 한다면 수정해야할 곳이 두 곳이 될 것 입니다. 한 곳이라도 놓치면 의도한데로 동작하지 않을 것 입니다.

}

private double calculateByOperator(double left, double right, String operator) {
double result = 0d;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

각 단계에서 명시적 반환을 한다면 불필요한 선언은 필요없지 않을까요?

Comment on lines 17 to 25
if (operator.equals("-")) {
result = left - right;
}
if (operator.equals("*")) {
result = left * right;
}
if (operator.equals("/")) {
result = left / right;
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if 나열과 else if 를 사용 함의 차이점이 무엇일까요?

이 코드에서 if가 나열되는 것이 의도와 맞는 것인가요?


import java.util.stream.Stream;

public class CalculatorTest {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MethodSource 이 외에도 여러가지 ParameterizedTest 를 위한 Source 들이 제공됩니다 :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MethodSource 로 테스트 코드를 작성했었던 이유는 이전에 테스트를 할 때 Double.toString() 을 이용해서 테스트를 해보려고 했었기 때문이었습니다. 목적에 맞는 Source 를 사용하도록 코드를 변경했습니다. 잘 몰랐던 부분인데 감사합니다 :)

Copy link

@kingbbode kingbbode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요.
아쉬운 점이 있어 코멘트를 추가해두었습니다 :)
확인 부탁드려요!

package calculator;

public enum Operator {
Plus("+"), Minus("-"), Multiplication("*"), Division("/");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum 변수는 대문자로 작성하는 것이 컨벤션입니다 :)

Comment on lines 10 to 14
operators = new ArrayList<>();
operators.add(Operator.Plus.getValue());
operators.add(Operator.Minus.getValue());
operators.add(Operator.Multiplication.getValue());
operators.add(Operator.Division.getValue());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저장해두지 말고 Operator 에게 물어보는 것은 어떨까요?

Operator.contains(String operator)

Comment on lines 13 to 22
if (Operator.Plus.getValue().equals(operator)) {
return left + right;
} else if (Operator.Minus.getValue().equals(operator)) {
return left - right;
} else if (Operator.Multiplication.getValue().equals(operator)) {
return left * right;
} else if (Operator.Division.getValue().equals(operator)) {
return left / right;
}
return 0d;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Operator 에 대한 연산은 Operator 가 알고 있는 것이 좋지 않을까요?

Operator.find(operator).calculate(left, right)

객체에게 묻는 것보다 요청하는 코드를 작성하는 것이 객체지향적인 코드를 작성하는 방법 중 하나입니다.

https://martinfowler.com/bliki/TellDontAsk.html

객체지향에서 굉장히 중요한 원칙이니 참고하시면 좋을 듯 합니다 :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

올려주신 링크 참고해서 묻는 것이 아닌 요청하는 코드에 대해서 예전보다 더 정확하게 이해하게 되었습니다! :) 다시 리뷰 부탁드립니다. 감사합니다.

…ate() 메소드를 만들어 입력한 연산자와 좌항, 우항을 계산하게 수정
Copy link

@kingbbode kingbbode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요.
요구사항 잘 만족하여 이만 머지하겠습니다 :) 👍
수고하셨습니다!

return this.symbol;
}

public static Operator find(String operator) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

잘못된 입력에 대한 예외는 처리해줬으면 더 좋았겠네요 :)

@kingbbode kingbbode merged commit 6fe685c into woowacourse:giantim Feb 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants