IT 관련 책 정리 및 후기/Clean Code

[Clean Code] 3장. 함수

JUN0126 2022. 8. 21. 02:59

함수를 만드는 규칙

1. 작게 만들어라

함수의 코드 길이는 20줄 이내로 작성해야하며 최대한 적은 수의 줄로 이루어 지는 것이 좋다.

그렇기에 함수 하나가 단 한가지의 기능만을 하도록 선언해주는 것이 좋다.

단 한가지 기능이라는 것이 애매할 수 있다 적정한 추상화 수준이 하나인 단계만 수행하는것이 좋고 그 안에서 의미없는 기능 나누기는 

필요가 없다.

 

2.  위에서 아래로 코드 읽기 : 내려가기 규칙

코드는 위에서 아래로 이야기처럼 읽혀야 좋으며 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수를 호출한다.

필자가 생각한 한 단계 낮은 함수는 한 기능을 담당하는 public 함수가 있다면 그 안에서 추상화 수준이 한 단계 낮은 함수를 만들어 private 함수를 바로 밑에다가 작성하는 규칙이라 생각한다.

 

3. Switch 문

다형적 객체를 생성하는 코드 안에서만 Switch문을 적용한다.

 

4. 서술적인 이름을 사용하라

함수의 이름을 통하여 함수가 하는 일을 좀 더 잘 표현하는 것이 좋다. 함수명만 읽더래도 짐작하는 기능이 해당 함수에서 작동한다면

코드를 이해하는데 많은 도움이 된다. 

쉬운 단어를 사용하고, 어떠한 기능이 들어가 있는지 알 수 있게끔 함수 이름을 정하여 사용하는 것이 바람직하다

 

5. 함수 인수

이상적인 함수 인수 개수는 0개이며 최대 2항 으로 함수를 구성하는 것이 바람직하다

너무 많은 인수를 가진 함수는 기능을 여러개 담개 되며 어떠한 기능을 하는지 헷갈리게 하는 경우가 많다

 

함수에 인수 1개를 넘기는 이유

 1. 인수에 질문을 던지는 경우

   EX) boolean fileExists("MyFile") // 해당 파일이 존재하는지 여부를 반환하는 함수

 2. 인수를 변환하여 결과를 반환하는 경우

  EX) InputStream fileOpen("Myfile") // String형의 파일을 InputStream으로 변환 하는 경우

  map stream을 생각하면 좀 더 이해가 될 듯 하다

 

플래그 인수

 파라미터 값으로 boolean 값을 넘겨 true / false 에 따라 기능을 구분지어 나누는 것은 바람직 하지 않다

 이와 같은 표현은 함수안에 두가지 기능이 있다는 것을 의미하며, 함수를 하나 더 선언하여 사용하는 것이 바람직 하다

 

이항함수

 인수가 2개인 이항함수는 1개인 이항함수보다 이해하기 어려우며 현실적으로 인수를 2개를 취하는 개념이 아니면 인수를 하나만 받아 처리하는 함수로 구현하는 것이 이상적이다.

 인수의 순서에 따라 값이 달라질 수도 있고 표현의 애매함이 있다.

 

 

 인수 객체

  인수를 2개 이상으로 사용하는 경우 차라리 클래스를 선언하여 해당 기능을 따로 객체화 해서 사용하는것이 더 바람직 하다.

Circle makeCircle(double x, double y, double radius)
------------------------------------------------
Circle makeCircle(Point point, double radius)

 x,y 좌표를 표현할 수 있는 Point 객체를 생성하여 관리

 

동사와 키워드

 함수의 의도나 인수의 순서와 의도를 제대로 표현하려면 좋은 함수 이름이 필수다.

 단항 함수는 함수와 인수가 동사/명사 쌍을 이루도록 이름을 지어야 한다

 함수 이름에 인수 이름을 넣는것도 함수가 어떠한 기능을 하는지 파악하기에 용이하다

 

부수 효과를 일으키지 마라

부수효과란 기능이 작동하면서 다른 이벤트가 발생하는 것을 의미하는데, 함수를 구현하고 안에 부수 효과 기능을 넣어 해당 함수명만 있었을 경우에 부수효과를 생각하지 못하게 된다 그러므로 부수효과가 나타나는 기능은 함수명에 명확하게 표기를 해주거나 분리하여야 한다

 

출력인자

인수를 출력으로 사용하는 함수는 바람직 하지 않다.

appendFooter(s)

public void appendFooter(StringBuffer report)

위와 같은 방식을 아래 방식으로 바꾸어 사용하는 것이 바람직 하다.
인자를 받아 return 값이 없는 함수를 선언하지 말고 값을 반환하는 식으로 출력 값을 사용하도록 하는것이 좋다

class Report(){

  private String string;
  public StringBuffer appendFooter(){
    StringBuffer sb = new StringBuffer();
    sb.append(string)
    return sb
  }
  
}

Report report = new Report(string)
StringBuffer outputReport = report.appendFooter

 

명령과 조회를 분리하라

 함수는 객체 상태를 변경하거나 객체 정보를 반환하거나 둘중에 하나의 기능만을 해야한다. 두가지의 기능을 모두 구현하게 된다면 혼돈이 

 오게 되며 확실하게 명령과 조회를 구분지어 분리하여 혼돈을 막는것이 중요하다.

 

오류코드보다 예외처리를 하라

 log,print 등 오류를 나타내는 코드를 사용하는 것 보다 예외 처리를 통하여 코드를 분리하여 작성하는 것이 바람직하다

 

Try / Catch 블록 뽑아내기

 try / catch 블록을 별도 함수로 뽑아내서 예외 처리를 검증하는 것이 바람직하다 추상화한 개념의 예외 처리를 통하여 오류 처리 부분과 

 기능 동작 부분을 구분지어 명확하게 알 수 있기 때문이다.

 오류를 처리하는 함수는 오로지 오류만 처리해야 되기 때문에 try 문으로 시작하여 catch/ finally 문으로 끝나야 한다

 

오류 코드 대신 예외를 사용하면 새 예외는 모두 Exception 에서 파생되어 나온 예외들이기 때문에 재컴파일/재배치 없이도 새 예외 클래스들을 추가 할 수 있다.

 

반복하지 마라

 중복되는 코드는 소프트웨어에서 매우 안좋다. 가독성을 해치기도 하며 이러한 중복 코드들을 지속적으로 제거하려고 하는 노력을 해야한다

 

 

결론

 소프트웨어를 짜는 행위는 글짓기와 비슷하며 처음에는 서투르고 읽기 불편할 수 있다 지속적으로 다듬고 정리함으로써 위에서 명시해놓은 방법들로 깨끗하고 가독성 좋은 소프트웨어, 함수를 만들도록 노력해야 한다.

 

 

 

 

해당 내용은 Clean Code를 읽고 정리한 내용입니다.

주관적인 생각과 내용을 같이 적시하였으니 적확한 정보는 해당 책을 통하여 같이 확인 해주시길 바랍니다.

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788966260959

 

Clean Code(클린 코드) - 교보문고

애자일 소프트웨어 장인 정신 | 나쁜 코드도 돌아는 간다. 하지만 코드가 깨끗하지 못하면 개발 조직은 기어간다. 매년 지저분한 코드로 수많은 시간과 상당한 자원이 낭비된다. 그래야 할 이유

www.kyobobook.co.kr