본문 바로가기

개발/클린코드

[요약] 1장. 깨끗한 코드

1. 본문 요약

르블랑의 법칙

-나중에 리팩토링한다는 말은 새빨간 거짓말이다. 개발 기간에 깨끗한 코드를 만들어내자. 

 

좋은 개발자(=시니어개발자)란 

- 기획자, PM이 납득할 수 있도록 현재 시스템을 설명하고, 개발 초기에 꼼꼼하게 설계하는 사람. 

  관리자가 나쁜 코드의 위험을 인지하도록 설득할 것

 

깨끗한 코드란

- 한가지 일을 제대로 한다. 의존성을 낮추어야 함 

- 단위테스트, 인수 테스트 존재

- 의미 있는 이름

- 중복을 제거한다.

 

- (내 생각)

    1) 테스트 케이스는 반드시 필요하다.

        아무리 주석을 자세히 적어놔도, input값과 output을 명확히 제공하는 테스트 케이스를 읽는 것이 훨씬 효율적이다. 

    2) 의미 있는 이름을 짓자. frmPop() 이런 함수를 최근 유지보수중인 코드에서 봤다.

         frm은 사실 의미 없다. 차라리 openRegistrationPop이 훨씬 자세하다. 

 

나쁜 코드 

- 너무 많은 일을 하려다가 의도가 뒤섞인다. 

예) 아래 코드의 문제: 'position을 움직이는 일' 과 '사용자에게 전진을 알리는 print문'이 섞여있다. 

      -> 프린트문은 따로 분리하자. 

public class Car {
  /*중략*/
  void goForward() {
      this.position++;
      System.out.println("자동차 전진 완료");
  }

}

 

한가지 일을 제대로 하는 코드 

- 객체는 한가지 일만 한다. 여러 일을 처리할 경우 객체를 분리하자.

- 메서드는 기능을 명확히 기술하는 메서드(A)와 하나의 기능을 실제로 수행하는 메서드(B) 여러개로 나눈다. 

   A는 B를 포함한다. 

 

보이스카우트 규칙

캠프장은 처음 왔을 때보다 더 깨끗하게 해놓고 떠나라

-> 내가 짠 코드가 아니더라도, 매 커밋마다 코드를 개선하려 노력하자. 

 

 

2. 클린코드 도서에서 거론될 원칙들

2.1 SRP (Single Responsibility Principle. 단일 책임 원칙)

 

"하나의 모듈은 오직 하나의 액터에 대해서만 책임을 져야한다."

 

만약 클래스를 사용하는 클라이언트가 여럿이고, 각각 다른 기능을 구현한다면, 이는 분리될 필요가 있다. 

예) 아래 클래스에서 talk은 동물 종류에 따라 분기처리 된다. (SRP 위반)

     이 경우에는 Animal을 abstract class로 두고, Cat과 Dog 클래스를 서브 클래스로 분리해야한다. 

public class Animal {

  /* 생성자 생략 */

  private final String species;

  public void talk() {
    if(this.species == "cat") {
        // 야옹 출력
    }
    if(this.species == "dog") {
        // 멍멍 출력
    }
  }
}

  

2.2 OCP (Open Closed Principle)

 

"무엇이 변하는 것인지, 무엇이 변하지 않는 것인지 구별하자"

 

변화가 자주 일어나는 로직은 인터페이스로 추상화. 구현체를 따로 두어 확장을 쉽게 할 수 있도록 하자. 

참고용 코드: https://nesoy.github.io/articles/2018-01/OCP

 

2.3 DIP (Dependency Inversion Principle)

변하지 않는 것(Interface)에 의존해야한다. 변하는 것은 구현체로 빼내자.

    참고용 코드 : https://bamdule.tistory.com/10

이번 장을 마치며 느낀점

'시간이 지날 수록 코드가 좋아지는 프로젝트'는 모두가 함께 만들어 가는 것이다. 

"이 코드는 더 이상 가망이 없어. 나도 똥을 얹어도 된다구! "

라면서 마구 작성하기보다는

 

똥 찌꺼기라도 제거하자는 경건한 마음으로 (물론 가장 먼저 치워야할 똥 찌꺼기는 내가 과거에 작성한 부끄러운 코드다)

유지보수 업무를 진행해야겠다. 

 

고민해볼 것

1. DIP와 OCP의 차이

DIP와 OCP 둘 다 추상화에 대해 이야기하는데 무슨 차이일까. 

참고할 자료: https://softwareengineering.stackexchange.com/questions/220765/open-close-principle-ocp-vs-dependency-inversion-principle-dip

 

2. 깨끗한 쿼리 작성법 (= 관계형 DB를 JAVA와 사용할 때, 어떻게 객체 지향을 지킬까)

현재 유지보수중인 코드에서는 한방 쿼리가 자주 보인다.

페이지에 필요한 정보에 대해, 여러 테이블을 JOIN한 뒤 보여줘서 DB 부하를 줄이는 것인데,
과연 이게 맞나 갸우뚱할때가 많다. 


쿼리 하나 분석하다보면 반나절이 가는데, 더 좋은 방법은 없을까? 

(JPA를 사용하지 않고 관계형 DB를 사용중입니다. 혹시 좋은 방법이 있다면 댓글로 남겨주시면 감사하겠습니다.)

 

읽어볼 책

Agile Software Development: Principle, Patterns, and Practice

 

레퍼런스

[1] SRP: https://siyoon210.tistory.com/155

[2] SOLID : https://velog.io/@hanblueblue/Java-SOLID-SRP-OCP-LSP-ISP-DIP

[3] DIP https://bbaktaeho-95.tistory.com/98

 

* 본 포스팅은 '클린코드 도서' 스터디를 진행하며 작성하였습니다. 

* 클린코드 도서 구매 링크: https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=34083680 

 

클린 코드 Clean Code

로버트 마틴은 이 책에서 혁명적인 패러다임을 제시한다. 그는 오브젝트 멘토(Object Mentor)의 동료들과 힘을 모아 ‘개발하며’ 클린 코드를 만드는 최상의 애자일 기법을 정제해 책 한 권에 담았

www.aladin.co.kr

 

'개발 > 클린코드' 카테고리의 다른 글

[클린코드 10장] 클래스  (0) 2022.01.13
5. 형식  (0) 2021.08.21
4장. 주석  (0) 2021.08.21
[요약] 3. 함수  (0) 2021.08.14
[요약] 2.의미 있는 이름  (0) 2021.08.14