ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리팩토링 / 마틴 파울러 - (4) Chapter 03. 코드의 구린내
    개발/자습중 2018. 2. 13. 10:13

    세번째 챕터에서는 어떤 코드가 리팩토링을 해야 하는 '구린내 나는' 코드인지 설명한다. 

    저자의 말대로 세번째 챕터를 읽자마자 그래! 바로 요 줄부터 저 줄까지 리팩토링을 하면 되겠군!! 할 수 있는 건 아니고

    대충 이런 느낌이 올 때 리팩토링을 쓸 수도 있겠다 정도의 감은 잡을 수 있다.

     

    아직 경험이 부족해서 그런지 깔끔하게 요약해서 정리하기 어려웠다.  

    이번 챕터만큼은 한번 읽고 넘어가는 수준에서 정리한다.




    저자가 말하는 구린내 목록은 아래와 같다.


    1. 중복코드

     - 똑같은 코드 구조가 두 군데 이상 있을 때는 그 부분을 하나로 통일 시 프로그램 개선 가능

     

    2. 장황한 메소드

     - 메소드에서 하나로 묶으면 좋을 만한 부분들을 찾아내어 메소드로 만들어줌

     

    3. 방대한 클래스

     - 기능이 지나치게 많은 클래스

     

    4. 과다한 매개변수

     - 객체를 사용할 때는 메소드에 필요한 모든 데이터를 가져올 수 있는 메소드만 전달하면 됨


    5. 수정의 산발 

     - 하나의 수정건 발생 시 한 클래스 내에서 여러 군데를 수정해야하는 문제


    6. 기능의 산재 

     - 하나의 수정건 발생 시 여러 클래스를 수정해야 하는 문제


    7. 잘못된 소속 

     - 어떤 메소드가 자신이 속하지 않은 클래스에 더 많이 접근하는 문제


    8. 데이터 뭉치 

     - 동일한 3~4개의 데이터 항목이 여러 위치에 몰려 있는 경우

     - 둘 이상의 필드를 객체로 전환하면 코드가 개선됨


    9. 강박적 기본 타입 사용 

     - 객체의 주요 장점 중 하나가 언어에 내장된 기본 타입 클래스와 응용 클래스 간의 경계를 허문다는 점

     - 데이터 값을 객체로 전환하는 것을 지향


    10. switch문 

     - switch-case 문은 중복이 생기기 쉬운 단점 존재 

     - 다형성, 즉 재정의를 이용하여 switch문을 바꿔야함


    11. 평행 상속 계층

     - 기능의 산재의 특수한 상황. 한 클래스의 하위 클래스를 만들 때마다 다른 클래스의 하위 클래스도 만들어야 하는 문제

     - 한 상속 계층의 인스턴스가 다른 상속 계층의 인스턴스를 참조하게 만들면 됨


    12. 직무유기 클래스

     - 비용만큼의 기능을 수행하지 못하는 비효율적인 클래스는 제거해야 함


    13. 막연한 범용 코드

     - 아직은 필요없는 기능을 수행하기 위해 작성된 코드

     

    14. 임시 필드

     - 어떤 객체 안에 인스턴스 변수가 특정 상황에서만 할당되는 경우


    15. 메시지 체인

     - 메시지 체인이란 클라이언트가 한 객체에 제 2의 객체를 요청하면 제 2의 객체가 제 3의 객체를 요청하고,

       제 3의 객체가 제 4의 객체를 요청하는 식으로 연쇄적 요청이 발생하는 문제점을 의미함


    16. 과잉 중개 메소드

     - 캡슐화 시에는 대개 기능의 위임이 수반되는데, 이것도 지나치면 문제가 됨


    17. 지나친 관여

     - 상속으로 인해 지나친 관여가 발생하는 경우가 많음

     - 클래스의 양방향 연결을 단방향으로 전환


    18. 인터페이스가 다른 대용 클래스

     - 기능은 같은데 시그너처가 다른 메소드


    19. 미흡한 라이브러리 클래스

     - 라이브러리 클래스가 원하는 기능을 수행하도록 수정하는 것이 불가능한 문제


    20. 데이터 클래스

     - 데이터 클래스란 필드와 필드 읽기, 쓰기 메소드만 들어 있는 클래스. 데이터 보관만 담당하게 됨

     - 변경되지 않아야 하는 필드에 대해서는 쓰기 메소드를 제거하는 등 캡슐화가 제대로 되어있는지 확인


    21. 방치된 상속물

     - 하위 클래스가 부모 클래스의 메소드나 데이터를 상속 받았으나 쓰지 않을 경우


    22. 불필요한 주석

     - 주석이 구린내를 감춰주는 탈취제 용도로 쓰일 때

     - 주석은 무슨 작업을 해야 좋을지 모를 때, 코드를 넣은 이유를 메모할 때, 정보나 잊기 쉬운 사항을 메모할 때 넣는 것이 좋음

     


    정리하다보니 저자 말대로라면 내가 작성했던 소스들은 그냥 똥의 산인 것 같다.

    이 장에서 인상 깊었던 부분들을 따로 빼면서 정리를 마무리한다. 


    "주석을 넣어야겠다는 생각이 들 땐 먼저 코드를 리팩토링해서 주석을 없앨 수 있게 만들어보자."

    "객체의 핵심은 데이터와 그 데이터에 사용되는 프로세스를 한 데 묶는 기술이라는 점이다."



    댓글

Designed by Tistory.