1-1.장황한메서드(LongMethod)

[ 2017-07.05 작성 ]

메서드를 작은 단위로 과감하게 쪼개야 한다. 주석을 달아야 할 것 같은 부분에 주석을 넣는 대신 메서드를 작성하고 안에 주석을 단 코드를 넣는다. 짧은 메서드를 이해하기 쉽도록 메서드 명을 잘 정해야 한다. 메서드 명은 기능 수행 방식이 아니라 목적, 즉 기능 자체를 나타내는 이름으로 정한다.

우리가 따르는 방법은 어떤것에 대해서 주석을 달아야 할 필요를 느낄 때마다 메소드를 작성하는 것이다 메소드의 길이가 아니라 메소드가 하는 일과 일을 처리하는 방법 사이의 의미적 거리(semantic distance)
  • 대부분의 경우 메소드의 길이를 줄이기 위해 해야 하는 경우 Extract Method 사용하자
  • 메소드에 파라미터와 임시변수가 많다면 임시변수는 Replace Temp with Query*를 사용할 수 있다
  • * 긴 파라미터 리스트는 Introduce Parameter Object, Preserve Whole Object 사용할 수 있다.
  • 여전히 임시변수와 파라미터가 많다면 Replace Method with Method Object라는 중장비를 사용하자
  • 뽑아낼 코드 덩어리의 식별은 주석을 찾는 것이다.조건문과 루프 또한 메소드 추출이 필요하다는 신호를 준다.
  • 조건식을 다루기 위해서는 Decompose Conditional 사용한다.
  • 루프의 경우는 루프와 그 안의 코드를 추출하여 하나의 메소드로 만든다* ※ http://blog.daum.net/_blog/BlogTypeView.do?blogid=0NnUW&articleno=6&categoryId=9®dt=20090221003052

Replace Temp with Query (WikiDocs - https://wikidocs.net/604)

  • 어떤 수식의 결과값을 저장하기 위해서 임시변수를 사용하고 있다면 수식을 뽑아내서 메소드로 만들고, 임시변수를 참조하는 곳을 찾아 모두 메소드 호출로 바꾼다. 새로 만든 메소드는 다른 메소드에서도 사용될 수 있다.

○ Introduce Parameter Obejct(http://jinsmisc.pe.kr/81) – 메소드 호출의 단순화

자연스럽게 몰려다니는 파라미터 그룹을 가지고 있다면, 그것들을 객체로 바꾸어라

sample code

public ActionResult PartnerOrderAcceptList(ListFormParam param, string fieldName, [DefaultValue("")] string searchValue, [DefaultValue("")] string topCateGory, [DefaultValue("")] string midCateGory, [DefaultValue("")] string botCateGory, [DefaultValue("input")] string dateField, [DefaultValue("")] string currentDateStart, [DefaultValue("")] string currentDateEnd, [DefaultValue("")] string workState, [DefaultValue("")] string printYN)
{
......
}

메서드의 다수파라미터를

public ActionResult PartnerOrderAcceptList(ListFormParam param, OrderSearchVO searchVO)
{
.....
}

객체로 대신 합니다

○ Preserve Whole Object (http://jinsmisc.pe.kr/83) – 메소드 호출의 단순화

어떤 객체에서 여러 개의 값을 얻은 다음 메소드를 호출하면서 파라미터로 넘기고 있다면, 대신 그 객체를 파라미터로 넘겨라.

sample code

 int low = dayTempRange().getLow();
 int high = daysTempRange().getHight();
 withinPlan = plan.withinRange(low, hight);

여러 개의 파라미터로 넘겨 줄 때
[ 위 코드 문제점 ]
만약 호출된 객체가 나중에 새로운 데이터 값을 필요로 한다면, 이 메소드를 호출하고 있는 모든 부분으로 찾아서 변경해야 한다는것.
여러 개의 파라미터를 넘겨주는 대신 객체를 넘겨줌으로써 이런 문제점을 피할 수 있다.

withinPlan = plan.withinRange(daysTempRange());

객체를 넘겨준다.
이렇게 하면 호출된 객체는 무엇을 원하든지 간에 넘겨 받은 객체에게 요청할 수 있다.