본문 바로가기
Study/Java

[Clean-Code] Chapter. 4-6

by novxerim 2023. 6. 21.

Clean-Code_week2_yerimi11

[주석]
나쁜 코드에 주석을 달지 마라. 주석은 나쁜 코드를 보완하지 못한다. 새로 짜라.
코드로 의도를 표현해라. ex) if (employee.isEligibleForFullBenefits()) 주석으로 달려는 설명을 함수로 만들어 표현해도 충분하다.
부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다. 주석을 가능한 줄이도록 꾸준히 노력해야 한다.

주석이 적절한 예제는 다음과 같다.

public static SimpleDateFormat makeStandardHttpDateFormat() 
{    
  // SimpleDateFormat은 스레드에 안전하지 못하다.  
  // 따라서 각 인스턴스를 독립적으로 생성해야 한다.  
  SimpleDateFormat df = new SimpleDateFormat("EEE , dd MMM yyyy HH:mm:ss z");  
  df.setTimeZone(TimeZone.getTimeZone("GMT"));  
  return df;  
}  

[같은 이야기를 중복하는 주석]
주석은 코드보다 더 많은 정보를 제공하지 못한다.
실제로 코드보다 부정확해 독자가 함수를 대충 이해하고 넘어가게 만든다.

Javadocs도 적절히 작성한다.

/**
 * write this
 */

[닫는 괄호에 다는 주석]
대신 함수를 줄이려 시도하자.

public static void main(String[] args) {
  ...
  ...
  } // this

[주석으로 처리한 코드]
다른 사람들이 지우기를 주저한다. 이유가 있어 남겨놨으리라고, 중요하니까 지우면 안 된다고 생각해 점차 쌓여간다.
이제는 소스 코드 관리 시스템이 코드를 기억해준다.(git) 그냥 코드를 삭제해라.

[코드 형식을 맞추는 목적]
오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미친다.
맨 처음 잡아놓은 구현 스타일과 가독성 수준은 유지보수 용이성과 확장성에 계속 영향을 미친다.

  • 종속 함수: 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다.
  • 들여쓰기 무시하기: (한 줄에 {super(parent, text);}) 때로 간단한 if문, 짧은 함수에서 들여쓰기 규칙을 무시하고픈 유혹이 생기지만 들여쓰기를 넣는다.
    public CommendWidget(ParentWidget parent, String text) {
      super(parent, text);
    }

[객체와 자료 구조]
객체와 자료 구조는 근본적으로 양분된다.
객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉽지만, 기존 객체에 새 동작을 추가하기는 어렵다.
자료구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.

  • (자료 구조를 사용하는) 절차 지향 코드

    • 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다.
    • 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다.
    • 새로운 자료 타입이 아니라 새로운 함수가 필요한 경우 -> 절차적인 코드와 자료 구조가 좀 더 적합하다.
  • 객체 지향 코드

    • 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
    • 새로운 함수를 추가하지 어렵다. 그러려면 모든 클래스를 고쳐야 한다.
    • 새로운 함수가 아니라, 새로운 자료 타입이 필요한 경우 -> 클래스와 객체 지향 기법이 가장 적합하다.

때로는 단순한 자료 구조와 절차적인 코드가 가장 적합한 상황도 있다.
하지만 절반은 객체, 절반은 자료 구조인 잡종 구조는 새로운 함수는 물론, 새로운 자료 구조도 추가하기 어렵다. 양쪽 단점만 모은 구조니 피하는 편이 좋다.

[자료 전달 객체 (DTO)]
자료 구조체의 전형적인 형태인 공개 변수만 있고 함수가 없는 클래스를 말한다.
데이터베이스와 통신하거나, 소켓에서 받은 메시지의 구문을 분석할 때 유용한 구조체이다.
DTO는 데이터베이스에 저장된 가공되지 않은 정보를 애플리케이션 코드에서 사용할 객체로 변환하는 일련의 단계에서 가장 처음으로 사용하는 구조체다.
좀 더 일반적인 형태는 '빈(bean)'구조이다. 빈은 비공개(private) 변수를 조회/설정 함수로 조작한다. 일종의 캡슐화이다. 별다른 이익을 제공하진 않는다.

[활성 레코드]
활성 레코드는 DTO의 특수한 형태이며, 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과다.
공개 변수가 있거나 비공개 변수에 조회/설정 함수가 있는 자료구조이지만, save나 find와 같은 탐색 함수를 제공하기도 한다.
활성 레코드에 비즈니스 규칙 메서드를 추가해 이런 자료 구조를 객체로 취급하는 개발자가 흔하지만, 이는 바람직하지 않다.

'Study > Java' 카테고리의 다른 글

[Clean-Code] Chapter. 11-13  (0) 2023.06.23
[Clean-Code] Chapter. 7-10  (0) 2023.06.22
[Clean-Code] Chapter. 1-3  (0) 2023.06.20
[JAVA] template method패턴  (0) 2023.06.19
[JAVA] BUILD-OPERATE-CHECK 패턴  (0) 2023.06.17

댓글