ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [java] 박재성님의 리팩토링 후기
    program_language 및 궁금한것/Java 2022. 2. 9. 17:58

    코드 리팩토링을 위해서 찾아보던중 유투브에 박재성님의 영상이 있는것을 확인했다.

    이분이 유명하신 자바지기의 박재성님이구나 생각하며 강의를 듣고 내용을 정리한다.

     

    1. 자바 코드 컨벤션을 지키면서 프로그래밍 한다.

    참고사이트1: https://google.github.io/styleguide/javaguide.html
    참고사이트2: https://myeonguni.tistory.com/1596

     

    Google Java Style Guide

    1 Introduction This document serves as the complete definition of Google's coding standards for source code in the Java™ Programming Language. A Java source file is described as being in Google Style if and only if it adheres to the rules herein. Like ot

    google.github.io

     

    [코딩규칙] 자바 코딩 규칙(Java Code Conventions)

    [코딩 규칙] 자바코딩 규칙(Java Code Conventions) 자바 프로그래밍 언어 코딩 규칙 원문 : Oracle / Code Conventions for JavaTM Programming Language / 1999-4-20 번역 : Kwangshin's Positive Blog, Java Co..

    myeonguni.tistory.com

     

    2. indent(들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지는 허용한다.

     

    3. 함수(메소드)가 한가지 일만 하도록 최대한 작게 만든다.

     

    4. else 예약어를 사용하지 않는다.

    (힌트. if 조건절에서 값을 return하는 방식으로 구현하면 else는 사용하지 않아도 된다. switch/case도 허용하지 않는다.)

     

    tip. 리팩토링 방법

    * 인덴트를 줄이는 가장좋은 방법은 메서드를 분리하는 것
    * 인덴트가 2 이상인 녀석들만 집중적으로 분리
    * 인덴트 줄이는 연습만해도 메서드 분리가 자동으로 됨
    * else 예약어를 쓰지 않는 방법에는 바로 리턴하는게 있음
    * 메서드가 한가지 일만 하도록 하게하기

     

    tip. 연습방법

    * 한번에 모든 원칙을 지키면서 리팩토링 하려고 연습하지 말기
    * 한번에 한가지 명확하고 구체적인 목표를 가지고 연습하기
    * 연습은 극단적인 방법으로 연습하는것도 좋음

    (예를들어 한 메소드 라인수 제한을 15라인 -> 10라인으로 줄여가면서 연습하는것도 좋은 방법.)

    * 연습하기 좋은 예
    - 로또
    - 사다리타기
    - 볼링게임 점수판
    - 체스게임
    - 지뢰찾기게임

     

    tip. 객체지향 생활체조 원칙 ( 소트웍스 앤솔러지 )

    1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.
    2. else 예약어를 쓰지 않는다.
    3. 모든 원시값과 문자열을 포장한다.
    4. 한 줄에 점을 하나만 찍는다.
    5. 줄여쓰지 않는다.(축약금지)
    6. 모든 엔티티를 작게 유지한다.
    7. 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
    8. 일급 콜렉션을 쓴다.
    9. 게터/세터/프로퍼티를 쓰지 않는다.

     

    tip. 클린코드 책에서는..

    메소드(함수)에서 이상적인 인자 개수는 0개(무항)이다. 다음은 1개이고, 다음은 2개이다. 3개는 가능한 피하는 편이 좋다. 4개이상은 특별한 이유가 있어도 사용하면 안된다.

     

    tip. 클래스 분리 연습을 위해 사용할 수 있는 원칙

    * 일급 콜렉션을 쓴다.
    * 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

     

    변경전

    // Test.class
    public static int splitAndSum(String text){
        int result = 0;
        if(text == null || text.isEmpty()){
            result = 0;
        }else{
            String[] values = text.split(",|:");
            result = sum(values);
        }
        return  result;
    }

    변경 후 

    // Test.class
    public static int splitAndSum(String text){
        if(isBlank(text)){
            return 0;
        }
        return sum(toPositives(split(text)));
    }
    
    private static boolean isBlank(String text){
        return text == null || text.isEmpty();
    }
    
    private static String[] split(String text){
        return text.split(",|:");
    }
    
    private static int[] toInts(String[] values){
        int[] numbers = new int[values.length];
        for (int i =0; i<values.length; i++){
            numbers[i] = toInt(values[i]);
        }
        return numbers;
    }
    
    private static int toInt(String value){
        int number = Integer.parseInt(value);
        if(number < 0){
            throw new RuntimeException();
        }
        return number;
    }
    
    private static Positive[] toPositives(String[] values){
        Positive[] numbers = new Positive[values.length];
        for (int i = 0; i<values.length; i++){
            numbers[i] = new Positive(values[i]);
        }
        return numbers;
    }
    private static int sum(Positive[] numbers){
        Positive result = new Positive(0);
        for (Positive number: numbers){
            result = result.add(number);
        }
        return result.getNumber();
    }
    
    public static void main(String[] args) {
        System.out.println(splitAndSum("1,2:3"));
    }
    
    // Positive.class
    public class Positive {
        private int number;
    
        public Positive(String value){
            this(Integer.parseInt(value));
        }
    
        public Positive(int number){
            if(number < 0 ){
                throw new RuntimeException();
            }
            this.number = number;
        }
    
        public Positive add(Positive other){
            return new Positive(this.number + other.number);
        }
    
        public int getNumber(){
            return number;
        }
    }

    변경후 코드는 메소드와 클래스들의 최소단위로 분리된것을 확인할 수 있다. Positive와 같이 모든 원시값과 문자열을 포장한다. 요구사항의 추가로는 숫자 이외의 값 또는 음수가 들어오는 경우엔 RuntimeException 예외를 throw한다.

    반응형

    댓글

Designed by Tistory.