import java.time.LocalDate;
import java.time.Month;
public record Paystub(int amount, int bonus, String reasonCode) {
public static Paystub noPay(String reasonCode) {
return new Paystub(0, 0, reasonCode);
}
}
public class Employee {
private boolean isSeparated;
private boolean isRetired;
private int salary;
public Employee(boolean isSeparated, boolean isRetired, int salary) {
this.isSeparated = isSeparated;
this.isRetired = isRetired;
this.salary = salary;
}
public Paystub getPaystub() {
Paystub result;
if (isSeparated) { //퇴사한 직원
result = new Paystub(0, 0, "SEP");
}
else {
if (isRetired) { //은퇴한 직원
result = new Paystub(0, 0,"RET");
}
else { //일반 직원
result = new Paystub(salary / 12 , 0, "SAL");
// 12월에는 보너스 지급 (연봉의 10%)
if( LocalDate.now().getMonth() == Month.SEPTEMBER )
result = new Paystub(result.amount(), (int)(salary * 0.1) , "BONUS");
}
}
return result;
}
public static void main(String[] args) {
Employee employee = new Employee(false, false, 48000000);
Paystub paystub = employee.getPaystub();
System.out.println("Paystub Amount: " + paystub.amount());
System.out.println("Paystub Bonus: " + paystub.bonus());
System.out.println("Paystub Reason Code: " + paystub.reasonCode());
}
}
import java.time.LocalDate;
//Mock으로 항상 같은 테스트 결과가 나오도록 개선
public interface LocalDateFactory {
default LocalDate now() {
return LocalDate.now();
}
}
public class Employee {
private boolean isSeparated;
private boolean isRetired;
private int salary;
public Employee(boolean isSeparated, boolean isRetired, int salary) {
this.isSeparated = isSeparated;
this.isRetired = isRetired;
this.salary = salary;
}
public Paystub getPaystub(LocalDateFactory localDate) {
Paystub result;
if (isSeparated) { //퇴사한 직원
result = new Paystub(0, 0, "SEP");
}
else {
if (isRetired) { //은퇴한 직원
result = new Paystub(0, 0,"RET");
}
else { //일반 직원
result = new Paystub(salary / 12 , 0, "SAL");
// 12월에는 보너스 지급 (연봉의 10%)
if( localDate.now().getMonth() == Month.DECEMBER )
result = new Paystub(result.amount(), (int)(salary * 0.1) , "BONUS");
}
}
return result;
}
}
class EmployeeTest {
@DisplayName("pay 값을 계산한다")
@Test
void getPayAmount_평월(){
// given
Employee employee = new Employee(false, false, 48000000);
LocalDateFactory localDate = Mockito.mock(LocalDateFactory.class);
given(localDate.now()).willReturn(LocalDate.of(2025, 1, 1));
// when
Paystub paystub = employee.getPaystub(localDate);
// then
Assertions.assertEquals(4000000, paystub.amount());
Assertions.assertEquals(0, paystub.bonus());
}
@Test
void getPayAmount_12월보너스(){
// given
Employee employee = new Employee(false, false, 48000000);
LocalDateFactory localDate = Mockito.mock(LocalDateFactory.class);
given(localDate.now()).willReturn(LocalDate.of(2025, 12, 1));
// when
Paystub paystub = employee.getPaystub(localDate);
// then
Assertions.assertEquals(4000000, paystub.amount());
Assertions.assertEquals(4800000, paystub.bonus());
}
@Test
void getPayAmount_은퇴직원(){
// given
Employee employee = new Employee(false, true, 100000000);
LocalDateFactory localDate = Mockito.mock(LocalDateFactory.class);
given(localDate.now()).willReturn(LocalDate.of(2025, 12, 1));
// when
Paystub paystub = employee.getPaystub(localDate);
// then
Assertions.assertEquals(0, paystub.amount());
Assertions.assertEquals(0, paystub.bonus());
}
}
이후는 github 참고~ (76e262d)
https://github.com/Justin-ad-Park/refactoring-2nd-edition
GitHub - Justin-ad-Park/refactoring-2nd-edition: 리팩터링 2nd Java 버전
리팩터링 2nd Java 버전. Contribute to Justin-ad-Park/refactoring-2nd-edition development by creating an account on GitHub.
github.com
'프로그래밍 > 리팩터링' 카테고리의 다른 글
리팩터링 2nd 8.7 Split Loop (0) | 2025.04.07 |
---|---|
리팩터링 2nd 실습하기 좋은 항목 (0) | 2025.04.07 |
리팩터링 2nd Chapter 01 실습 (0) | 2025.03.25 |
IntelliJ가 지원하는 자동 리팩터링 목록 (1) | 2025.02.10 |
Refactoring if-else 제거 (0) | 2025.01.15 |