코드가 마치 술 취한 무리가 짜놓은 듯 어수선해 보인다면, 독자들은 프로젝트의 다른 측면도 똑같이 무성의한 태도로 처리했으리라 생각할 것이다.
프로그래머라면 코드의 포맷을 깔끔하게 맞춰 코드를 작성할 의무가 있다. 포맷에 대한 간단한 규칙을 정하고, 그 규칙들을 착실하게 따라야한다. 필요하다면 규칙을 자동으로 적용하는 도구를 활용한다.
포맷을 맞추는 목적
전문 개발자가 1차 의무는 '돌아가는 코드'를 작성하는 것이 아닌, '의사소통'을 하는 것이다. 포맷을 맞추는 목적은 이 '의사소통'을 원활하게 하는 데 있다.
세로 형식 맞추기
일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 500줄을 넘지 않고 주로 200줄 정도인 파일로도 대규모 시스템을 구축할 수 있다.
뉴스 기사처럼 작성하라
잘 작성된 뉴스 기사라면 최상단에 몇 마디로 요약하는 표제가 나온다. 독자는 표제를 보고서 기사를 읽을지 말지 결정한다. 첫 문단은 전체 기사 내용을 요약한다. 세세한 사실은 숨기고 커다란 그림을 보여준다. 쭉 읽으며 내려가면 세세한 사실이 조금씩 드러난다.
소스파일도 이처럼, 이름만 보고도 독자가 찾고있는 모듈이 맞는지 판단할 수 있도록 신경써서 짓는다. 아래로 내려갈 수록 의도를 세세하게 표현한다.
한면을 채우는 뉴스 기사는 거의 없고, 대다수의 뉴스 기사가 아주 짧다는 사실도 기억하자. 신문이 readable한 이유도 여기에 있다.
개념은 빈 행으로 분리하라 Vertical Openness Between Concepts
빈 행은 새로운 개념을 시작한다는 시각적 단서다. 예를 들어, 패키지 선언부, import 문, 각 함수 사이에 빈 행이 들어간다. 간단한 규칙이지만 이 세로 레이아웃은 심오한 영향을 미친다. 빈 행을 빼버리면 코드 가독성이 현저하게 떨어진다.
세로 밀집도 Vertical Density
줄바꿈이 개념을 분리하는 것과 같은 맥락에서, 세로로 밀집해있다는 것은 서로 연관되어있다는 것을 의미한다. 따라서 서로 의미적으로 밀접하다면 세로로도 가까이 놓여야 한다.
수직 거리 Vertical Distance
변수 선언
변수는 사용하는 위치에 최대한 가까이 선언한다. 지역 변수를 각 함수 맨 위에 선언한다. 루프를 제어하는 변수는 루프 내부에 선언한다.
인스턴스 변수
클래스 맨 처음에 선언한다. 인스턴스 변수간에 빈 행을 두지 않는다. 잘 설계한 클래스에서는 클래스의 메서드가 인스턴스 변수를 사용하기 때문이다. (단, C++에서는 클래스 마지막에 선언하는 가위규칙 scissors rule 을 적용하기도 한다. 변수 선언을 어디서 찾을지 모두가 알고 있기만 하다면 어느 쪽이든 이의가 없다.)
종속 함수 Dependent Functions
다른 함수에서 사용되는 종속 함수는, 호출하는 함수와 세로로 가까이 배치한다. 이때 호출하는 함수를 먼저, 종속된 함수를 나중에 배치한다. 그러면 프로그램이 자연스럽게 읽힌다. 규칙을 일관되게 적용한다면 독자는 방금 호출한 함수가 잠시 후에 정의되리라는 사실을 예측할 수 있다.
개념적 유사성 Conceptual Affinity
종속적인 관계가 없어도 기본 기능이 유사하다면 서로 가까이 배치한다.
세로 순서 Vertical Ordering
일반적으로 호출되는 함수를 호출하는 함수보다 나중에 배치한다. 그러면 소스 코드 모듈이 고차원에서 저차원으로 자연스럽게 내려간다. 뉴스 기사와 마찬가지로 가장 중요한 개념을 가장 먼저 표현한다. 이 때, 세세한 사항은 나중을 위해 아껴둔다.
가로 형식 맞추기
홀러리스(Hollerith)가 내놓은 80자 제한은 다소 인위적이다. 100자나 120자에 달해도 나쁘지 않다. 하지만 그 이상은 주의부족이 될 수 있다.
가로 공백과 밀집도 Horizontal Openness and Density
가로 공백을 넣으면 두 요소가 확실히 나뉜다는 사실이 더욱 분명해진다. 공백을 넣으면 한 개념이 아니라 별개로 보인다.
들여쓰기 Indentation
소스파일은 들여쓰기로 위계를 표현한다는 점에서 글의 개요 비슷하다. 적절한 들여쓰기는 시각적으로 계층을 구분해서 보여줄 수 있어 전체 구조가 한눈에 들어온다. 각 계층은 이름을 선언하는 범위이자, 선언문과 실행문을 해석하는 범위라고 볼 수 있다.
팀 규칙
프로그래머라면 각자 선호하는 규칙이 있다. 하지만 팀에 속한다면 자신이 선호해야할 규칙은 바로 팀 규칙이다.
팀은 한 가지 규칙에 합의해야 한다. 그리고 모든 팀원은 그 규칙을 따라야한다. 그래야 소프트웨어가 일관적인 스타일을 보인다. 개개인이 따로국밥처럼 맘대로 짜대는 코드는 피해야 한다.
출처: 도서 클린코드 애자일 소프트웨어 장인 정신, 로버트 C.마틴 지음 | 박재호, 이해영
'General' 카테고리의 다른 글
[클린 코드] 7장 오류 처리 (0) | 2023.05.25 |
---|---|
[클린 코드] 6장 객체 vs 데이터구조 (0) | 2023.05.20 |
[클린 코드] 4장 주석 (0) | 2023.05.06 |
[클린 코드] 3장 함수 (0) | 2023.04.23 |
[단위 테스트] 1장~5장 요약 (1) | 2023.04.18 |