728x90
1. 이미 존재하는 기능을 다시 구현하지 말기
개선 전) 중첩 코드 존재(for문 안에 if절)
boolean hasPrisonKey = false;
//items는 List<Item> 자료형
for(Item each : items){
if(each.name.equals("감옥 열쇠")){
hasPrisonKey = true;
break;
}
}
개선 후) 컬렉션 사용(anyMatch)
boolean hasPrisonKey = items.stream().anyMatch(
item -> item.name.equals("감옥 열쇠")
);
이처럼 anyMatch 메서드를 알고 있으면, 복잡한 로직을 직접 구현하지 않아도 됩니다. 반대로 모르면 로직을 직접 구현해야 하므로, 코드가 쓸데없이 복잡해집니다. 또한 구현 실수로 버그가 발생할 가능성도 있습니다.
2. 반복 처리 내부의 조건 분기 중첩
개선 전) 중첩 코드
for(Member member : members){
if(0 < member.hitPoint){
if(member.containsState(StateType.poison)){
...
if(member.hitPoint <= 0){
...
}
}
}
}
개선 후) if조건문 중첩 제거
- 조기 컨티뉴로 중첩 제거
for(Member member : members){
if(member.hitPoint == 0) continue;
if(!member.containsState(StateType.poison)) continue;
...
if(member.hitPoint > 0) continue;
...
}
- 조기 브레이크로 중첩 제거
int totalDamage = 0;
for(Member member : members){
if(!member.hasTeamAttackSucceeded()) break;
...
}
3. 응집도가 낮은 컬렉션 처리
컬렉션 처리도 응집도가 낮아지기 쉽습니다.
개선 전) 멤버 추가하는 메서드 중복
컬렉션과 관련된 작업을 처리하는 코드가 여기저기에 구현될 가능성이 굉장히 높습니다. 응집도가 낮아진 것입니다.
class FieldManager{
// 멤버 추가
void addMember(List<Member> members, Member newMember){
if(members.stream().anyMatch(member -> member.id == newMember.id)){
throw new RuntimeException("이미 존재하는 멤버입니다.");
}
if(members.size() == MAX_MEMBER_COUNT){
throw new RuntimeException("이 이상 멤버를 추가할 수 없습니다.");
}
}
}
class SpecialEventManager(){
//멤버를 추가합니다.
void addMember(List<Member> members, Member member){
members.add(member);
}
}
개선 후) 컬렉션 처리를 캡슐화하기
컬렉션과 관련된 응집도가 낮아지는 문제는 일급 컬렉션 패턴을 사용해 해결할 수 있습니다. 일급 컬렉션(First Class Collection)이란 컬렉션과 관련된 로직을 캡슐화하는 디자인 패턴입니다.
아래와 같은 요소로 구성됩니다.
- 컬렉션 자료형의 인스턴스 변수
- 컬렉션 자료형의 인스턴스 변수에 잘못된 값이 할당되지 않게 막고, 정상적으로 조작하는 메서드
class Party{
static final int MAX_MEMBER_COUNT = 4;
private final List<Member> members;
Party(){
members = new ArrayList<Member>();
}
private Party(List<Member> members){
this.members = mebers;
}
/**
* 멤버 추가하기
* @param newMember 추가하고 싶은 멤버
* @return 멤버를 추가한 파티
*/
Party add(final Member newMember){
if(exists(newMember)){
throw new RuntimeException("이미 파티에 참가되어 있습니다.");
}
...
}
/** @return 파티 멤버가 1명이라도 살아 있으면 true를 리턴
*/
boolean isAlive(){
return members.stream().anyMatch(each -> each.isAlive());
}
...
/** @return 멤버 리스트(다만 요소를 외부에서 변경할 수 없습니다.)
*/
List<Member> member(){
return members.unmodifiableList();
}
}
컬렉션과 컬렉션을 조작하는 로직을 한 클래스에 응집한 구조로 만들었습니다.
'일상 > 레벨업 독서' 카테고리의 다른 글
[내 코드가 그렇게 이상한가요?] 9장 설계의 건전성는 여러 악마 (2) | 2024.10.28 |
---|---|
[내 코드가 그렇게 이상한가요?] 8장 강한 결합: 복잡하게 얽혀서 풀 수 없는 구조 (1) | 2024.10.27 |
[내 코드가 그렇게 이상한가요?] 6장-조건 분기 : 미궁처럼 복잡한 분기 처리를 무너뜨리는 방법 (0) | 2024.07.16 |
[내 코드가 그렇게 이상한가요?] 5장 응집도:흩어져 있는 것들 (0) | 2024.07.06 |
[내 코드가 그렇게 이상한가요?] 4장 불변 활용하기 : 안정적으로 동작하게 만들기 (0) | 2024.07.04 |