[ Clean Colde ] ch1.깨끗한 코드
깨끗한 코드
나중은 결코 오지 않는다.
안 돌아가는 프로그램보다 돌아가는 쓰레기가 좋다고 스스로를 위로한 경험이 있다. 다시 돌아와 나중에 정리하겠다고 다짐했었다. 물론 그땐 르블랑의 법칙을 몰랐다. 나중은 결코 오지 않는다.
우아한 코드
비야네 스트롭스트룹 나는 우아하고 효율적인 코드를 좋아한다. 논리가 간단해야 버그가 숨어들지 못한다. 의존성을 최대한 줄여야 유지보수가 쉬워진다. 오류는 명백한 전략에 의거해 철저히 처리한다. 성능을 최적으로 유지해야 사람들이 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다. 깨끗한 코드는 한 가지를 제대로 한다.
깨진 유리창 이론
나쁜 코드는 나쁜 코드를 유혹한다.
추상 Abstract
오랜 경험 끝에 나는 모든 프로그램이 아주 유사한 요소로 이뤄진다는 사실을 깨달았다. 한 가지 예가 ‘집합에서 항목 찾기’다. db, hash map, 배열 등 집합에서 특정 항목을 찾아낼 필요가 자주 발생합니다. 이런 상황이 발생하면 나는 추상 메서드나 추상 클래스를 만들어 실제 구현을 감싼다. 그러면 여러가지 장점이 생긴다.
저는 위 이야기를 아래처럼 코드로 해석했습니다.
AbstractDao를 상속하는 MapDao와 ListDao로 구현체를 감싼 추상화를 구현했습니다.
이렇게 구현하면 언제든지 구현체를 바꿔도 됩니다.
List를 사용 해야한다면 App
에 ListDao
를 Map을 사용 해야한다면 MapDao
를 주입하면 됩니다.
이렇게 주입점을 맨 끝까지 올려보내는걸 저도 굉장히 좋아합니다.
이렇게 하면 테스트를 하기에도 용이합니다.
public class App {
private final static Controller controller = Controller.getInstance(new ListDao());
public static void main(String args[]) {
controller.findAllMember();
}
}
public class Controller {
private final Service service;
private Controller(AbstractDao dao) {
this.service = Service.getInstance(dao);
}
public static Controller getInstance(AbstractDao dao) {
return new Controller(dao);
}
public void findAllMember() {
List<Member> members = service.findAllMember();
members.forEach ( member -> {
System.out.print(" NAME : " + member.getName());
System.out.println(" | AGE : " + member.getAge());
});
}
}
public class Service {
private final AbstractDao dao;
private Service(AbstractDao dao ) {
this.dao = dao;
}
public static Service getInstance(AbstractDao dao) {
return new Service(dao);
}
public List<Member> findAllMember() {
return dao.findAllMember();
}
}
public interface AbstractDao {
List<Member> findAllMember ();
}
public class ListDao implements AbstractDao {
private final List<Member> list = List.of(new Member("list", 24), new Member("dao", 20));
public List<Member> findAllMember() {
return Collections.unmodifiableList(list);
}
}
public class MapDao implements AbstractDao {
private final Map<Integer, Member> map = Map.of ( 1, new Member("map", 24), 2, new Member("dao", 24));
public List<Member> findAllMember() {
return Collections.unmodifiableList(map.values().stream().toList());
}
}
보이스카우트 규칙
체크아웃할 때보다 좀 더 깨끗한 코드를 체크인한다면 코드는 절대 나빠지지 않는다. 한꺼번에 많은 노력을 하진 않는다. 변수 이름을 하나 개선하고, 조금 긴 함수를 분할하고, 약간의 중복을 제거하고, if문을 하나 분리하면 충분하다.
댓글남기기