•
이 장에서는 명령문과 명령문 블록을 순차적으로 입력하는 가장 간단한 형태의 제어 구조를 소개한다.
1. 순서가 중요한 명령문
•
순서가 중요한 명령문은 정렬하기 쉽다. 다음 예를 확인해보자.
data = readData();
results = calculateResultsFromData( data );
printResults(results);
Java
복사
◦
특별할 일이 발생하지 않는 한 이 코드에 있는 명령문은 반드시 작성된 순서대로 실행된다.
▪
데이터를 읽고, 결과를 계산하고, 계산한 결과를 출력한다. 각 연산들은 바로 전의 연산에 의존하고 있다.
•
순서가 중요하지만 의존성이 덜 분명하게 작성된 명령문도 존재한다.
revenue.computeMonthly();
revenue.computeQuarterly();
revenue.computeAnnual();
Java
복사
◦
이 예제에서 분기별 계산은 이미 월별 계산이 되어있다는 전제하에 동작한다.
◦
각 연산들 사이에 의존성이 존재하지만 이 코드만으로 그 의존성을 확인할 수 없다. 여기에서는 그러한 의존성이 분명하지 않고 감춰져있다.
•
명령문이 특정한 순서로 작성되어야 하는 의존성이 존재하는 경우에는 의존성을 분명히 하는 과정이 필요하다. 다음은 명령문 배치와 관련된 지침이다.
◦
의존성이 분명하게 보이게 코드를 구성하라.
◦
의존성이 분명하게 보이게 메소드의 이름을 작성하라.
◦
의존성을 분명하게 하기 위해서 메소드 매개변수를 사용하라.
▪
메소드끼리 데이터를 주고 받는 것으로 의존성을 표현할 수 있다.
InitializeExpenseData( expenseData )
ComputeMarketingExpense( expenseData )
ComputeSalesExpense( expenseData )
ComputeTravelExpense( expenseData )
ComputePersonnelExpense( expenseData )
DisplayExpenseSummary( expenseData )
Visual Basic
복사
▪
데이터가 순서의 의존성이 없음을 표현할 수도 있다.
ComputeMarketingExpense( marketingData )
ComputeSalesExpense( salesData )
ComputeTravelExpense( travelData )
ComputePersonnelExpense( personnelData )
DisplayExpenseSummary( marketingData, salesData, travelData, personnelData )
Visual Basic
복사
2. 순서가 중요하지 않은 명령문
•
순서가 중요하지 않더라도 정렬은 가독성과 성능, 유지보수성에 영향을 미친다.
•
정렬을 위해 보조 기준들을 적용할 수 있으며 기본 가이드라인은 연관된 작업을 함께 두는 근접성 원칙을 따른다.
코드를 하향식으로 읽을 수 있도록 개발
•
기본 원칙은 코드를 여기저기 건너뛰지 않고 하향식으로 읽을 수 있게 개발하는 것이다.
•
단순히 제어 흐름이 실행 시 하향식으로 진행하게 하는 것만으로는 충분하지 않다. 코드를 읽는 사람이 이해에 필요한 정보를 찾기 위해서 코드를 뒤져야한다면 재구성해야한다는 뜻이다.
•
다음은 적절하지 않은 예다.
MarketingData marketingData;
SalesData salesData;
TravelData travelData;
travelData.ComputeQuarterly();
salesData.ComputeQuarterly();
marketingData.ComputeQuarterly();
salesData.ComputeAnnual();
marketingData.ComputeAnnual();
travelData.ComputeAnnual();
salesData.Print();
travelData.Print();
marketingData.Print();
Visual Basic
복사
◦
특정한 변수 객체인 marketingData가 어떻게 사용되는지 알고 싶다고 하자.
◦
코드를 읽는 사람은 marketingData를 참조하는 모든 코드를 추적해야 한다.
•
다음은 같은 코드를 더 나은 구조로 작성한 것이다.
MarketingData marketingData;
marketingData.ComputeQuarterly();
marketingData.ComputeAnnual();
marketingData.Print();
SalesData salesData;
salesData.ComputeQuarterly();
salesData.ComputeAnnual();
salesData.Print();
TravelData travelData;
travelData.ComputeQuarterly();
travelData.ComputeAnnual();
travelData.Print();
Visual Basic
복사
◦
이 코드는 여러 면에서 앞선 코드보다 좋다.
◦
각 객체에 대한 참조를 함께 위치시켜 참조가 지역화되었다.
◦
객체가 살아 있는 코드의 범위가 좁아졌다.
◦
가장 중요한 점은 각 객체 별로 메소드를 추출해낼 수 있게 되었다는 점이다.
연관된 명령문 그룹화하기
•
연관된 명령문을 함께 둔다. 이 명령문은 같은 데이터를 처리하거나 비슷한 작업을 수행하거나 각 명령문의 처리 순서에 의존하기 때문에 관련지을 수 있다.
•
연관된 명령문이 잘 정렬되어있는지 확인하는 방법은 연관된 객체끼리 그룹짓고 그들이 겹치는지 확인해보는 것이다. 명령문이 잘 정렬되어 있다면 그룹끼리 겹치지 않을 것이다.
•
관련 명령문을 그룹화하고 나면 서로 아주 밀접하게 관련되어 있으면서도 전후 명령문과는 아무런 관계가 없는 명령문을 발견하게 될 것이다.
◦
그런 경우에는 밀접하게 연관된 명령문을 별도의 메소드로 리팩토링한다.
요점 정리
•
순차적인 코드를 구성하는 가장 강력한 원칙은 의존성을 정리하는 것이다.
•
의존성은 훌륭한 메소드명이나 매개변수 리스트, 주석, 보조 변수(코드의 가독성이 정말 중요한 경우)의 사용을 통해 분명히하는 것이 좋다.
•
코드가 순서에 의존하지 않는다면 연관된 명령문을 가능한 가까이에 둔다.