오늘 리팩토링할 코드는 사칙연산을 계산하는 메소드이다.
Number라는 클래스는 int를 생성자의 인자로 가지며, 사칙연산을 실행하는 calculate() 메소드가 있다. 이 메소드는 사칙연산 기호에 따라 덧셈, 뺄쎔, 곱셈, 나눗셈 연산을 하는 메소드이다. 나눗셈 결과는 int로 가정하고 구현했다.
이 코드에 대한 리팩토링 요구사항은 calculate() 메소드에서 발생하는 if 문을 제거하는 것이다. 일반적으로 if/else로 구현하겠지만 else를 사용하지 않고 if만으로 구현했다.
어떻게 제거할 수 있을까?
public class Number {
private int no;
public Number(int no) {
this.no = no;
}
public Number calculate(String expression, Number number) {
if ("+".equals(expression)) {
return new Number(this.no + number.no);
}
if ("-".equals(expression)) {
return new Number(this.no - number.no);
}
if ("*".equals(expression)) {
return new Number(this.no * number.no);
}
if ("/".equals(expression)) {
return new Number(this.no / number.no);
}
throw new IllegalArgumentException();
}
}
힌트 - 자바의 다형성, enum 등을 활용해 제거해 본다.
위 샘플 예제는 코드스쿼드 에서 새롭게 진행 중인 마스터즈 코스에서 발췌한 코드입니다. 코드스쿼드의 마스터즈 코스는 코드 리뷰 방식의 개인별 맞춤 학습 방법입니다.
0개의 의견 from FB
저도 비슷한 작업을 해봤는데요. Enum에 List에 대한 Sort를 처리를 하도록 하는..Comparator를 직접 "(o1, o2) -> o1.getxxx() > o2.getxxx();" 써도 되기는 하는데.. 여튼 만들어보면..
뭐 대충 이런식. 근데 음.. 뭐랄까 enum이 좀 애매해 보이기도하고 이뻐보이지가 않기도 하고.. 해서 다른 방법을 고민중였는데, 공부되네요.~
6개의 의견 from SLiPP
자신만의 연산을 가지고 있는 Enum 을 만들어서 구현해보았습니다.
java 8 이전
java 8부터는 java.util.function에서 제공되는 BiFunction 인터페이스를 사용하여 별도의 인터페이스를 만들지 않고 구현해보았습니다!
java 8 이후
아래는 for문을 Map 탐색으로 변경해본 방식입니다.
업무상 필요해서 구현했던건데... 슬쩍 던져봅니다.
@권용근 예상 가능한 모든 답변을 구현했네요. 굿..
@kimmunsu 수강생 중에 한명이 네가 구현한 것과 똑같이 구현했네.
Map과 BiFunction을 사용한 구현 코드 공유해 본다.
@자바지기 https://stackoverflow.com/questions/2902458/is-it-possible-to-pass-arithmetic-operators-to-a-method-in-java 아마 저도 뭘 보고 했을텐데, 이 링크가 그 힌트인듯 합니다 ㅎㅎㅎㅎㅎ
저도 비슷한 작업을 해봤는데요. Enum에 List에 대한 Sort를 처리를 하도록 하는..Comparator를 직접 "(o1, o2) -> o1.getxxx() > o2.getxxx();" 써도 되기는 하는데.. 여튼 만들어보면..
뭐 대충 이런식. 근데 음.. 뭐랄까 enum이 좀 애매해 보이기도하고 이뻐보이지가 않기도 하고.. 해서 다른 방법을 고민중였는데, 공부되네요.~
@kimmunsu 앗. 자바지기님이 말씀하신 학생이 제가 맞는 것 같은데요, 저도 저 글 보고 참고했었어요. 신기하네요 ㅎㅎㅎ
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.