제어 흐름은 관련된 것들끼리 모아서 코드를 처음 보는 사람들에게도 손쉽게 이해할 수 있게 하는 것이 좋다.
void compute() {
input();
process();
output();
}
public void displayShape(Shape subject, Brush brush) {
brush.display(subject);
}
선택 메시지를 많이 사용하는 프로그램을 이해하기 위해서는 연산의 세부 구현을 이해하기 위해 여러 클래스를 살펴봐야 할 수도 있다. 과도한 선택 메시지의 사용은 좋지 않으며, 당장 연산의 변형이 필요하지 않은 경우라면 굳이 지금 선택 메시지를 사용할 필요 없다.
void compute() {
input();
helper.process(this);
output();
}
void process(Helper helper) {
helper.process(this);
}
void compute() {
input();
process(helper);
output();
}
소프트웨어 개발에서 개발자의 의도와 구현을 분리하는 것은 언제나 중요하다. 이를 통해 연산의 핵심을 파악할 수 있고, 필요한 경우에만 세부 구현에 관심을 기울이면 된다.
한 줄로 된 코드를 가급적 메소드로 구현하면 커뮤니케이션을 도울 수 있다.
flags |= LOADED_BIT;
...
setLoadedFlag();
void initialize() {
if (!isInitialized()) {
...
}
}
void initialize() {
if (isInitialized()) {
return;
}
...
}
두번째 코드와 같이 조건문만 읽으면 초기화가 되어 있으면 루틴이 수행된다는 것을 바로 알 수 있다.
if / else 는 동등한 중요성을 가지는 두 가지의 제어 흐름을 반영한다. 그러나 두 번째 코드와 같은 조건은 한 쪽의 제어 흐름이 다른 쪽보다 중요할 경우에 유용하다.
void compute() {
Server server = getServer();
if (server != null) {
Client client = server.getClient();
if (client != null) {
Request current = client.getRequest();
if (current != null) {
processRequest(current);
}
}
}
}
void compute() {
Server server = getServer();
if (server == null) {
return;
}
Client client = server.getClient();
if (client == null) {
return;
}
Request current = client.getRequest();
if (current == null) {
return;
}
processRequest(current);
}
이와 같이 예외에 대해 프로그램을 보호하는 if문, 즉 보호절 의 포인트는 주요 흐름과 예외 경우 처리의 차이점을 부각시키는 것이다.
예외는 여러 함수 호출을 걸쳐서 제어 흐름을 바꾸는 경우에 유용