//[Before]
public class Calculator {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("kim", 18, 28000000),
new Person("lee", 19, 30000000),
new Person("park", 20, 35000000)
);
var averageAge = 0;
var averageSalary = 0;
for(Person person : people) {
averageAge += person.getAge();
averageSalary += person.getSalary();
}
averageAge = averageAge / people.size();
averageSalary = averageSalary / people.size();
System.out.println(String.format("average Age: %d, average Salary: %d", averageAge, averageSalary));
}
}
위와 같은 코드에서 Salary의 합, Age의 합을 출력하는 요구사항이 추가되었다고 했을 때
// Step1 : 각 메서드 분리 & 파이프라인(스트림) 이용
public class CalculatorStep01 {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("kim", 18, 28000000),
new Person("lee", 19, 30000000),
new Person("park", 21, 35000000)
);
var averageAge = getAverageAge(people);
var averageSalary = getAverageSalary(people);
System.out.println(String.format("average Age: %.2f, average Salary: %.2f", averageAge, averageSalary));
}
private static double getAverageSalary(List<Person> people) {
return people.stream()
.mapToInt(Person::getSalary)
.average().orElse(0);
}
private static double getAverageAge(List<Person> people) {
return people.stream()
.mapToInt(Person::getAge)
.average().orElse(0);
}
}
//Step2 : 메서드를 Class로 이동
public class CalculatorStep02 {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("kim", 18, 28000000),
new Person("lee", 19, 30000000),
new Person("park", 21, 35000000)
);
var peopleStatistics = new PeopleStatistics(people);
System.out.println(String.format("average Age: %.2f, average Salary: %.2f", peopleStatistics.getAverageAge(), peopleStatistics.getAverageSalary()));
}
private static class PeopleStatistics {
private List<Person> people;
public PeopleStatistics(List<Person> people) {
this.people = people;
}
public double getAverageSalary() {
return people.stream()
.mapToInt(Person::getSalary)
.average().orElse(0);
}
public double getAverageAge() {
return people.stream()
.mapToInt(Person::getAge)
.average().orElse(0);
}
}
//Step3 :
// 파라미터를 생성자로 이동
// 반복 연산을 초기화로 변경
// 토탈, 평균 등 메서드 추가
public class CalculatorStep03 {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("kim", 18, 28000000),
new Person("lee", 19, 30000000),
new Person("park", 21, 35000000)
);
var peopleStatistics = new PeopleStatistics(people);
System.out.println(String.format("average Age: %.2f, average Salary: %.2f", peopleStatistics.getAverageAge(), peopleStatistics.getAverageSalary()));
System.out.println(String.format("Total Age: %d, Total Salary: %d", peopleStatistics.getTotalAge(), peopleStatistics.getTotalSalary()));
}
private static class PeopleStatistics {
private List<Person> people;
private int totalAge;
private int totalSalary;
public int getTotalAge() {
return totalAge;
}
public int getTotalSalary() {
return totalSalary;
}
public PeopleStatistics(List<Person> people) {
this.people = people;
totalAge();
totalSalary();
}
private void totalAge() {
totalAge = people.stream()
.mapToInt(Person::getAge)
.sum();
}
private void totalSalary() {
totalSalary = people.stream()
.mapToInt(Person::getSalary)
.sum();
}
public double getAverageSalary() {
return (double) totalSalary / people.size();
}
public double getAverageAge() {
return (double) totalAge / people.size();
}
}
'프로그래밍 > 리팩터링' 카테고리의 다른 글
함수의 이름을 만들 때 '왜 또는 무엇을 하는지'가 드러나야 한다. (0) | 2025.04.23 |
---|---|
리팩터링 2nd 10.3 중첩 조건문을 보호 구문으로 바꾸기 (0) | 2025.04.09 |
리팩터링 2nd 실습하기 좋은 항목 (0) | 2025.04.07 |
리팩터링 2nd Chapter 01 실습 (0) | 2025.03.25 |
리팩터링은 언제 해야 하나? (0) | 2025.02.17 |