'한 줄에 점을 하나만 찍는다.'는 원칙을 지키도록 리팩토링하려면...

2017-10-20 10:00

오늘 코드 리뷰도 지난 코드 리뷰에 이어 간단한 자동차 경주 게임 코드에서 시작한다.

프로그래밍을 하다 보면 다음 코드와 같이 한 줄에 점(dot, .)을 2개 이상 사용하는 경우가 있다.

public class ResultView {
	private String getTopRankedCar(List<Car> carList) {
		String topCarString = "";
		int maxPosition = getMaxPosition(carList);
		for(int i=0; i<carList.size(); i++) {
			if(carList.get(i).getPosition()==maxPosition) topCarString += carList.get(i).getCarName() + ", ";			
		}
		return topCarString.substring(0, topCarString.length()-2);
	}
	
	private int getMaxPosition(List<Car> carList) {
		int maxPosition = 0;
		for(int i=0; i<carList.size(); i++) {
			if(maxPosition < carList.get(i).getPosition()) maxPosition = carList.get(i).getPosition();
		}
		return maxPosition;
	}
}

위 코드 중 ''carList.get(i).getPosition()" 코드를 보면 점(.)을 두 개 사용하고 있다. 이와 같이 특정 객체의 데이터에 접근할 때 점(.)을 무분별하게 사용하는 경우가 있다.

객체지향 생활 체조 원칙에서도 "한 줄에 점을 하나만 찍는다."와 같은 원칙을 지킬 것을 요구한다.

위 코드에서 점(.)을 하나만 사용하라고 하면 반드시 이렇게 변경하는 사람도 있을 것이다.

	private String getTopRankedCar(List<Car> carList) {
		String topCarString = "";
		int maxPosition = getMaxPosition(carList);		
		for(int i=0; i<carList.size(); i++) {
			Car car = carList.get(i);
			if(car .getPosition()==maxPosition) topCarString += car .getCarName() + ", ";			
		}
		return topCarString.substring(0, topCarString.length()-2);
	}

위와 같이 리팩토링하면 점(.)이 하나이기 때문에 원칙에 어긋나지 않는다고 할 수 있지만 꼼수를 통한 해결책이지 완벽한 해결방법은 아니다.

이 문제를 해결하기 위한 힌트는 객체지향 생활 체조 원칙의 하나인 규칙 8: 일급 콜렉션 사용을 사용해 해결해 본다.

일급 Collection을 적용했을 때와 적용하지 않았을 때의 장,단점을 비교해 보면 좋겠다.

위 샘플 예제는 코드스쿼드 에서 새롭게 진행 중인 마스터즈 코스에서 발췌한 코드입니다. 코드스쿼드의 마스터즈 코스는 코드 리뷰 방식의 개인별 맞춤 학습 방법입니다.

0개의 의견 from FB

1개의 의견 from SLiPP

2017-10-20 14:44

carList를 List로 갖고 있지 말고 CarList와 같은 클래스를 통해 캡슐화를 실현해야 한다고 생각합니다.


public class CarList{ 2 private Map<String, Car> list; 3 4 public void addCar(Car car){} 5 6 public void getCar(String owner){ 7 return list.get(owner); 8 } 9 }
의견 추가하기

연관태그

← 목록으로