본문 바로가기

잡담

함수가 남발된 소스코드의 문제점

프로그래밍 책을 읽다 보면 "중복된 소스코드는 함수로 만들어라"라는 내용을 본 적이 있을 것이다.

그러다 보니 불필요하게 소스코드를 함수로 만드는 경우가 많은 것 같다. 

 

프로젝트에서 5000줄 정도 되는 소스코드를 읽어보고 있는데 함수 남발을 다음과 같이 사용하였다.

 

public class Study {
    public static void main(String[] args) {
        String rcvData = "0020FTPHNMOBILE000020220401";

        String code      = getCode(rcvData);      //코드
        String conDvcd   = getConDvcd(rcvData);   //통신구분
        String companyId = getCompanyId(rcvData); //회사명
        String connected = getConnected(rcvData); //응답여부
        String day       = getDay(rcvData);       //날짜

        System.out.println(code);
        System.out.println(conDvcd);
        System.out.println(companyId);
        System.out.println(connected);
        System.out.println(day);

    }


/*




다른 소스코드들이 있다고 가정





















 */



































    

    public static String getCode(String pRcvData){
        return pRcvData.substring(0,4);
    }

    public static String getConDvcd(String pRcvData) {
        return pRcvData.substring(4,7);
    }

    public static String getCompanyId(String pRcvData) {
        return pRcvData.substring(7,15);
    }

    public static String getConnected(String pRcvData) {
        return pRcvData.substring(15,19);
    }

    public static String getDay(String pRcvData) {
        return pRcvData.substring(19,27);
    }



}

 

위와 같이 작성된 소스코드인데 해당 소스는 현재 라인수가 얼마 되지 않아 읽기 쉬울지도 모르겠지만 1000줄 이상 넘어가면 상황은 확실히 달라진다. 위 소스코드의 문제점을 알아보자

String companyId = getCompanyId(rcvData); 이 소스코드를 보면

companyId를 String형으로 선언했고 선언과 동시에 getCompanyId라는 함수를 이용하여 companyId 변수를 초기화 시킨다.

getCompanyId 함수는 매개변수로 rcvData를 받는다.

함수명으로 유추해 봤을 때 rcvData를 매개변수로 받아서 companyId를 가지고 온다는 것은 알 수 있다.

그런데 문제점은 어떻게 companyId를 가져오는지 알아보려고 할 때 pRcvData.substring(7,15); 이라는 이 한 줄 밖에 안되는 소스코드를 보려고 해당 함수를 찾아가서 내용을 확인하고 난 뒤 다시 원래 읽고 있던 소스코드로 되돌아와야 한다는 것이다.

그렇다면 이렇게 반문할지도 모르겠다. "getCompanyId라는 함수명이 있기 때문에 companyId를 가져온다는 것을 유추할 수 있고 소스코드가 소설처럼 읽히게 되는 것이 아니냐고" 근데 String companyId = getCompanyId(rcvData); 이 소스코드는 변수명 자체에 companyId라는 의미를 유추할 수 있는 단어가 적혀 있기 때문에 String companyId = rcvData.substring(7,15); 이라고 작성해도 아무 문제가 없다.

 

 

 

public class Study {
    public static void main(String[] args) {
        String rcvData = "0020FTPHNMOBILE000020220401";

        String code      = rcvData.substring(0 , 4 ); //코드
        String conDvcd   = rcvData.substring(4 , 7 ); //통신구분
        String companyId = rcvData.substring(7 , 15); //회사명
        String connected = rcvData.substring(15, 19); //응답여부
        String day       = rcvData.substring(19, 27); //날짜

        System.out.println(code);
        System.out.println(conDvcd);
        System.out.println(companyId);
        System.out.println(connected);
        System.out.println(day);
    }
}

 

 

이 소스코드의 경우 데이터를 어떻게 가져오는지를 바로바로 확인할 수 있어서 읽기가 훨씬 더 쉽다.

단 한 줄의 기능을 넣기 위해서 함수를 따로 만드는 것은 다시 한번 생각해 보자. 나의 경우 위와 같은 소스코드를 아래와 같이 작성한 뒤에

소스코드를 읽기가 훨씬 더 쉬워졌다.