본문 바로가기

클린코드15

Clean Code 요약해보기 (15) (오랜만에 다시 쓰려니 어렵다. 역시 꾸준해야한다 사람은) 점진적으로 개선하다 프로그램을 망치는 가장 좋은 방법 중 하나는 개선이라는 이름 아래 구조를 크게 뒤집는 행위다. 어떤 프로그램은 그저 그런 '개선'에서 결코 회복하지 못한다. '개선' 전과 똑같이 프로그램을 돌리기가 아주 어렵기 때문이다. 그래서 TDD를 사용해야한다. 테스트 케이스를 작은 변경 작업마다 돌려가면서 개선 전과 같은 동작을 하는지 체크해야한다. (오랜만에 작성 + 너무 많은 코드와 해설로 미처 다 쓰기 어려우니 많이 생략함) 또한 리팩터링을 하다 보면 코드를 넣었다 뺐다 하는 사례가 아주 흔하다. 단계적으로 조금씩 변경하며 매번 테스트를 돌려야 하므로 코드를 여기저기 옮길 일이 많아진다. 결론 그저 돌아가는 코드만으로는 부족하다... 2022. 12. 4.
Clean Code 요약해보기 (14) 14장 점진적인 개선 이 장은 점진적인 개선을 보여주는 사례 연구다. 출발은 좋았으나 확장성이 부족했던 모듈을 소개한다. 그런 다음, 모듈을 개선하고 정리하는 단계를 살펴본다. 프로그램을 짜다 보면 종종 명령행 인수의 구문을 분석할 필요가 생긴다. 편리한 유틸리티가 없다면 main 함수로 넘어오는 문자열 배열을 직접 분석하게 된다. 새로 짤 유틸리티를 Args라 부르겠다. Args 사용법은 생성자에 (입력으로 들어온) 인수 문자열과 형식 문자열을 넘겨 Args 인스턴스를 생성한 후 Args 인스턴스에다 인수 값을 질의한다. public static void main(String[] args) { try { Args arg = new Args("l,p#,d*", args); boolean logging =.. 2022. 7. 13.
Clean Code 요약해보기 (13) 13장 동시성 객체는 처리의 추상화다. 스레드는 일정의 추상화다. - 제임스 O. 코플리엔 동시성과 깔끔한 코드는 양립하기 어렵다. 스레드를 하나만 실행하는 코드는 짜기 쉽고, 겉으로 보기에는 멀쩡하나 깊숙한 곳에 있는 다중 스레드 코드도 짜기 쉽다. 이런 코드는 시스템이 부하를 받기 전까지 멀쩡하게 돌아간다. 동시성이 필요한 이유 동시성은 결합(coupling)을 없애는 전략이다. 즉, 무엇과 언제를 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다. 무엇과 언제를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다. 서블릿 모델을 살펴보자. 서블릿은 웹 혹은 EJB 컨테이너라는 우산 아래서 돌아가는데, 이들 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 .. 2022. 7. 5.
Clean Code 요약해보기 (12) 12장 창발성 창잘적 설계로 깔끔한 코드를 구현하자 켄트 백은 다음 규칙을 따르면 설계는 '단순하다'고 말한다. 1. 모든 테스트를 실행한다. 2. 중복을 없앤다. 3. 프로그래머 의도를 표현한다. 4. 클래스와 메서드 수를 최소로 줄인다. 단순한 설계 규칙 1: 모든 테스트를 실행하라 철저한 테스트가 가능한 시스템을 만들면 더 나은 설계가 얻어진다. 결합도가 높다면 테스트 케이스를 작성하기 어렵다. 그러므로 개발자는 의존성 역전을 적용하고, DI, 인터페이스, 추상화 등과 같은 도구를 사용해 결합도를 낮춘다. 단순한 설계 규칙 2~4: 리팩터링 테스트 케이스를 모두 작성했다면 이제 코드와 클래스를 정리해도 괜찮다. 구체적으로는 코드를 점진적으로 리팩터링 해나간다. 코드를 정리하면서 시스템이 깨질까 걱정.. 2022. 6. 26.
Clean Code 요약해보기 (11) (이전 글에 이어서) 11장 시스템 자바 프록시 자바 프록시는 단순한 상황에 적합하다. 개별 객체나 클래스에서 메서드 호출을 감싸는 경우가 좋은 예다. JDK 프록시 예제 // Bank.java (패키지 이름을 감춘다) import java.util.*; // 은행 추상화 public interface Bank { Collection getAccounts(); void setAccounts(Collection accounts); } // BankImpl.java import java.util.*; // 추상화를 위한 POJO 구현 public class BankImpl implements Bank { private List accounts; public Collectioin getAccounts() { .. 2022. 6. 15.
Clean Code 요약해보기 (10) 11장 시스템 시스템 제작과 시스템 사용을 분리하라 소프트웨어 시스템은 (애플리케이션 객체를 제작하고 의존성을 서로 '연결'하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야 한다. 시작 단계는 모든 애플리케이션이 풀어야 할 관심사(concern)다. 관심사 분리는 우리 분야에서 가장 오래되고 가장 중요한 설계 기법 중 하나다. 불행히도 대다수 애플리케이션은 시작 단계라는 관심사를 분리하지 않는다. 다음이 전형적인 예다. public Service getServie() { if (service == null) service = new MyServiceImpl(...); // 모든 상황에 적합한 기본값일까? return service; } getService 메서드가 MyService.. 2022. 6. 9.
반응형