함수가 남발된 소스코드의 문제점
프로그래밍 책을 읽다 보면 "중복된 소스코드는 함수로 만들어라"라는 내용을 본 적이 있을 것이다.
그러다 보니 불필요하게 소스코드를 함수로 만드는 경우가 많은 것 같다.
프로젝트에서 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);
}
}
이 소스코드의 경우 데이터를 어떻게 가져오는지를 바로바로 확인할 수 있어서 읽기가 훨씬 더 쉽다.
단 한 줄의 기능을 넣기 위해서 함수를 따로 만드는 것은 다시 한번 생각해 보자. 나의 경우 위와 같은 소스코드를 아래와 같이 작성한 뒤에
소스코드를 읽기가 훨씬 더 쉬워졌다.