지우쓰 개발일기
🚩 모듈을 개선하고 정리하는 방법 "프로그래밍은 과학보다 공예에 가깝다. 깨끗한 코드를 짜려면 먼저 지저분한 코드를 짠 뒤에 정리해야 한다." (p.254) 어떻게 짰느냐고? '돌아가는' 프로그램을 목표로 잡는 것은 자살행위다. 우아한 프로그램은 한 방에 뚝딱 만들어지지 않는다. 그래서 멈췄다 프로그램을 어떻게든 완성한 후가 아니라, 구조를 짤 수 있는 시점에 리팩토링을 시도한다. 점진적으로 개선하다 구조를 뒤집어 엎는 것은 위험부담이 크다. TDD 기법을 사용하자. 변경에 무관하게 시스템이 똑같이 돌아가야 한다. 자동화된 테스트 슈트를 작성하여 정상 작동을 보장한다. 결론 소프트웨어 설계는 분할만 잘해도 품질이 크게 높아진다. 적절한 장소를 만들어 코드만 분리해도 설계가 좋아진다. 관심사를 분리하면 코..
창발(創發) : 하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상 🚩 소프트웨어 설계 품질을 높일 수 있는 단순한 규칙 네 가지 단순하지만 중요한 네 가지 규칙을 따라 설계를 하면, 창발성이 촉진되어 우수한 설계를 완성할 수 있게 된다. 💻 모든 테스트를 실행하라 시스템이 의도한 대로 작동하는지 검증이 필요하다. 테스트가 가능한 시스템을 만들려는 노력은 결국, 낮은 결합도와 높은 응집력이라는 결과를 낳는다. 테스트 케이스를 작성함으로써 설계 품질을 자연스럽게 높일 수 있다. 💻 중복을 없애라 중복은 추가 작업, 추가 위험, 불필요한 복잡도를 의미한다. 단 몇 줄이라도, 중복을 제거하는 것은 시스템 복잡도를 극적으로 줄일 수 있다. TEMPLATE ..

🚩 높은 추상화 수준, 즉 깨끗한 시스템을 유지하는 방법 "체계적이고 탄탄한 시스템을 만들고 싶다면 흔히 쓰는 좀스럽고 손쉬운 기법으로 모듈성을 깨서는 절대로 안 된다." (p.196) 💻 시스템 제작과 시스템 사용을 분리하라 제작(Construction): 어플리케이션 객체를 제작하고 의존성을 서로 연결하는 과정 사용(Use): 제작 과정 이후 이어지는 런타임 과정 관심사(Concern) 분리 가장 흔히 쓰이는 초기화 지연(Lazy Initialization)의 한계 public Service getService() { if (service == null) service = new MyServiceImpl(...); return service; } MyServiceImpl이 모든 상황에 적절하지 않을 ..
🚩 깨끗한 클래스를 작성하는 방법 "도구 상자를 어떻게 관리하고 싶은가? 작은 서랍을 많이 두고 기능과 이름이 명확한 컴포넌트를 나눠 넣고 싶은가? 아니면 큰 서랍 몇 개를 두고 모두를 던져 넣고 싶은가?" (p.177) 💻 클래스 체계 표준 자바 관례 static, public 상수 private 변수 private 인스턴스 변수 public 함수 private 함수 캡슐화 변수와 유틸리티 함수는 가능한 private으로 하는 것이 낫다. 캡슐화를 풀어주는 결정은 언제나 최후의 수단이다. 💻 클래스는 작아야 한다 클래스가 맡은 책임을 최소화하라. 큰 클래스 몇 개가 아닌 작은 클래스 여럿으로 이루어진 시스템이 더 바람직하다. 메소드 개수가 적다고 책임이 적은 것이 아니다. 클래스가 맡은 책임을 클래스 ..
💻 TDD 법칙 세 가지 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 💻 깨끗한 테스트 코드 유지하기 '지저분해도 빨리' 작성한 테스트 코드는 결국 오히려 테스트를 안하느니 못한 결과를 내놓는다. 테스트 코드는 실제 코드 못지 않게 중요하다. 실제 코드 못지 않게 깨끗하게 짜야 한다. 테스트는 유연성, 유지보수성, 재사용성을 제공한다. 테스트 케이스가 있으면 잠정적인 버그가 없을 것이라는 확신 하에 코드를 변경할 수 있다. 💻 깨끗한 테스트 코드 (Feat. 가독성) 잡다한 내용은 없애고 BUILD-OPERATE-CHECK 패턴을 적용하라. 테..