일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프리미티브 타입
- 자바스터디
- 람다식
- 정렬
- System.in
- github api
- annotation processor
- Study Halle
- 자바할래
- 로컬 클래스
- yield
- 제네릭 와일드 카드
- throwable
- 접근지시자
- 익명 클래스
- 항해99
- docker
- 스파르타코딩클럽
- 함수형 인터페이스
- raw 타입
- 제네릭 타입
- auto.create.topics.enable
- System.out
- System.err
- Switch Expressions
- 합병 정렬
- 브릿지 메소드
- junit 5
- 상속
- 바운디드 타입
- Today
- Total
목록Book/클린 코드 (11)
코딩하는 털보
소프트웨어 설계 품질을 높여주는 설계 규칙 4가지 모든 테스트를 실행한다. 테스트를 철저히 거쳐 모든 테스트 케이스를 항상 통과하는 시스템은 '테스트가 가능한 시스템'이다. 테스트가 가능한 시스템을 만들려고 애쓰다보면 설계 품질이 좋아진다. SRP를 준수하는 클래스는 테스트가 훨씬 더 쉽다. 결합도가 높으면 테스트 케이스를 작성하기 어렵다. 그래서 테스트를 많이 작성할수록 DIP원칙을 적용하고 의존성 주입, 인터페이스, 추상화 등으로 결합도를 낮춘다. 중복을 없앤다. 소규모 재사용, TEMPLATE METHOD 패턴 등 중복을 제거할 수 있는 기법을 익혀야 한다. 템플릿 메서드 패턴, https://rockintuna.tistory.com/187 프로그래머 의도를 표현한다. 유지보수 비용을..
클린 코드, 11. 시스템 시스템 수준에서 깨끗함을 유지하는 방법, 높은 추상화 수준. 시스템 제작과 시스템 사용을 분리하라 소프트웨어 시스템은 준비 과정과 런타임 로직을 분리해야 한다. 좀스럽고 손쉬운 기법으로 모듈성을 깨서는 안 된다. 설정 로직을 일반 런타임 로직과 분리하면 모듈성이 높아진다. SOC(관심사 분리) 프로그램을 기능 면에서 가능한 중복이 아닌 여러 모듈로 명확히 나누는 것 SOC를 적용하면 자연스럽게 단일 책임 원칙, 개방 폐쇄 원칙, 인터페이스 분리 원칙을 달성하게 된다. 초기화 지연(Lazy initialization) public FieldType getField() { if (fieldType == null) { fieldType = new FieldType(); } retur..
클린 코드, 10. 클래스 표준 자바 관례 변수 public static 상수 private static private public 변수가 필요한 경우는 거의 없다. 함수 public 메서드 private 메서드는 호출하는 함수 직후에 캡슐화 테스트 코드에서 함수를 호출하거나 변수를 사용해야 한다면 protected로 선언하거나 패키지 전체로 공개한다. 하지만 이렇게 캡슐화를 풀어주는 것은 언제나 최후의 수단이다. 클래스는 작아야 한다. 클래스의 크기는 클래스가 맡은 책임이다. 책임을 줄여야 한다. 만능 클래스가 있다면 단일 책임 클래스 여럿으로 분리하도록 노력해야 한다. 클래스 이름 클래스 이름이 모호하다면 클래스에 여러 책임을 떠안겼다는 증거다. 클래스 설명은 '만일', '그리고..
클린 코드, 9. 단위 테스트 애자일과 TDD 덕택에 단위 테스트를 자동화하는 프로그래머들이 많아졌으며 점점 더 늘어나는 추세다. 하지만 테스트를 추가하려고 급하게 서두르는 와중에 많은 프로그래머들이 제대로 된 테스트 케이스를 작성해야 한다는 중요한 사실을 놓치고있다. TDD 법칙 세 가지 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 잘 돼면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 이렇게 일하면 실제 코드를 사실상 전부 테스트하는 많은 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리문제를 유발하기도 한다. 깨끗한..
클린 코드, 8. 경계 소프트웨어 경계(제공자가 제공하고 사용자는 사용하는 인터페이스)를 깔끔하게 처리하는 기법과 기교. 외부 코드 사용하기 Map과 같은 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다. (Map 객체를 가지고 있는 새로운 클래스를 만들어서 대신 사용하기) Map 인스턴스를 공개 API의 인수로 넘기거나 반환값으로 사용하지 않는다. 경계 살피고 익히기 외부 코드를 익히고 우리의 프로그램과 통합하는 것은 어렵다. '학습테스트'는 곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 뻔한 방식 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익힌다. 학습 테스트는 공짜 이상이다 학습 테스트는 드는 비용 없이 필요한 지식만 확..
클린 코드, 7. 오류 처리 오류 처리는 중요하지만 오류 처리 코드로 인해 프로그램 로직을 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다. 오류 코드보다 예외를 사용하라 오류 플래그를 설정하거나 호출자에게 오류 코드를 반환하는 방식의 함수는 호출한 즉시 오류를 확인해야 하기 때문에 호출자 코드가 복잡해진다. 대신 예외를 던지면 로직이 오류 처리 코드와 뒤섞이지 않으니까 호출자 코드가 깔끔해진다. Try-Catch-Finally 문부터 작성하라 예외가 발생할 코드를 짤 때 try-catch-finally 문부터 코딩을 시작하면 try 블록에서 무슨 일이 생기든지 호출자가 기대하는 상태를 정의하기 쉬워진다. 먼저 강제로 예외를 일으키는 테스트 케이스를 작성한 후 테스트를 통과하게 코드를 작성하는 방법을 ..
클린 코드, 6. 객체와 자료구조 자료 추상화 변수와 클라이언트 사이에 함수라는 계층을 넣는다고 해서 구현이 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다. 추상 인터페이스를 제공하여 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다. 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 getter/setter 메서드만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 무지성으로 getter/setter를 만들지마라. 자료/객체 비대칭 객체는 자료를 숨기고 자료를 다루는 메서드를 공개한다. 자료 구조는 자료를 그대로 공개하며 메서드를 제공하지 않는다. 절차적인 코드로 도형 ..
클린 코드, 5. 형식 맞추기 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 형식을 맞추는 목적 의사소통은 전문 개발자의 일차적인 의무이며 코드 형식은 의사소통의 일환이다. 적절한 행 길이를 유지하라. 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 신문 기사처럼 작성하라. 이름은 간단하면서도 설명이 가능하게, 첫 부분은 고차원 개념과 알고리즘을 설명 내려갈수록 저차원 함수와 세부 내역. 개념은 빈 행으로 분리하라. 빈 행은 새로운 개념을 시작한다는 시각적 단서다. 완결된 생각하나를 행 묶음으로 표현하고 생각 사이에 빈 행을 넣어 분리한다. 세로 밀집도 서로 밀접한 코드 행은 세로로 가까이 놓여야 한다. 수직 거리 서로 밀접한 개념은 세로로 가까이 둬야 한다. 연관성이 깊은 두 개념이 멀리 ..
클린 코드, 4. 주석 코드만이 정확한 정보를 제공하는 유일한 출처다. 주석은 잘못된 정보를 전달하기 쉽다. 주석을 가능한 줄이도록 노력해야 한다. 주석은 나쁜 코드를 보완하지 못한다. 표현력이 풍부하고 깔끔하며 주석이 없는 코드가 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 코드로 의도를 표현하라. 주석으로 의도를 전달하기 보다는 코드로 표현하려 노력하자. 좋은 주석 법적인 주석 저작권 정보 또는 소유권 정보, 계약조건 등 정보를 제공하는 주석 눈으로 보기엔 이해하기 힘든 메서드의 반환값을 설명해주는 주석, 그러나 함수 이름을 바꾸거나 다른 클래스를 만들어 코드를 이동하면 주석을 달지 않아도 되는 경우가 많다. 의도를 설명하는 주석 어떤 구현 방법 결정에 대한 의도를 설명하는 주석 의미를..
클린 코드, 3. 함수 함수를 잘 만드는 법! 작게 만들어라. 조건문/반복문에 들어가는 블록을 한줄로 줄인다. 보통 다른 함수를 호출한다. 한 가지만 해라. 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다. 여기에서 한 가지 작업이란 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행하는 것이다. 만약 의미 있는 이름으로 다른 함수로 추출할 수 있다면 그 함수는 여러 작업을 하고 있는 것이다. 함수 당 추상화 수준은 하나로. TO 문단을 읽어내려 가듯이 코드를 구현하여 각 함수가 일정한 추상화 수준을 유지하면서 다음 함수를 참고하고 소개하도록 한다. Switch 문 switch 문은 작게 만들거나 한 가지 작업만 하게 만들기 어렵다. 그러므로 switch ..