클린코드 5장 형식 맞추기

2023. 9. 18. 19:29AWS

5장 형식맞추기

형식 맞추기

뚜껑을 열었을 때 독자들이 코드가 깔끔하고, 일관적이며, 꼼꼼하다고 감탄하면 좋겠다.

어수선해 보인다면 독자들은 프로젝트의 다른 측면도 똑같이 무성의한 태도로 처리했으리라 생각할 것이다.

프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야한다. 코드 형식을 맞추기 위한 간단한 규칙을 정하고 그 규칙을 착실히 따라야한다. 팀으로 일한다면 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야 한다. 필요하다면 규칙을 자동으로 적용하는 도구를 활용한다.

Q1. 여러분들이 정해본 규칙을 공유해주세요!

익명1- x

익명2- 포맷에 맞게 설정, 규칙을 정하고 시작 - lint 키워드

익명3- 변수명,함수명,IDE, 자바버전

익명4- 전 규칙은 정해본적은 없네요

형식을 맞추는 목적

코드 형식은 중요하다! 너무나도 중요, 융통성 없이 맹목적으로 따르면 안된다.

코드 형식 = 의사소통의 일환

의사소통은 전문 개발자의 일차적인 의무

오늘 구현한 기능이 다음 버전에서 바뀔확률이 아주높음. 그런데 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미침! → 코드가 바뀌어도 맨 처음 잡아놓은 구현스타일과 가독성 수준은 유지보수 용이성과 확장성에 계속 영향을 미침

적절한 행 길이를 유지하라

자바에서 파일의 크기는 클래스 크기와 밀접.

500줄을 넘지 않고 대부분 200줄 정도인 파일로도 커다란 시스템을 구축할 수 있다.

일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다.

엄격하게 지킬 규칙은 아니지만 지키면 바람직하다.

신문 기사처럼 작성하라

소스파일을 신문 기사와 비슷하게 작성

신문 → 독자는 위에서 아래로 읽음, 최상단에 기사를 몇 마디로 요약하는 표제, 첫 문단은 전체 기사 내용을 요약, 쭉 읽어 내려가면 세세한 사실이 조금씩 드러남.

이름은 간단하면서도 설명이 가능하게, 이름만 보고도 올바른 모듈을 살펴보고 있는지 아닌지를 판단할 정도로 신경 써서 짓는다. 소스파일의 첫 부분은 고차원 개념과 알고리즘을 설명한다. 아래로 내려갈수록 의도를 세세하게 묘사, 마지막에는 가장 저차원 함수와 세부내역.

신문은 다양한기사로 짧게 이루어짐 , 사실,날짜,이름 등을 무작위로 뒤섞은 긴 기사 하나만 있으면 아무도 안읽음

개념은 빈 행으로 분리하라

코드는 왼쪽에서 오른쪽, 위에서 아래

각 행은 수식이나 절, 일련의 행 묶음은 완결된 생각 하나를 표현, 생각 사이에는 빈 행을 넣어 분리

빈 행을 빼버리면 코드 가독성이 현저하게 떨어져 암호처럼보임.

세로 밀집도

줄바꿈이 개념분리

세로 밀집도는 연관성을 의미

서로 밀접한 코드 행은 세로로 가까이 놓여야 한다는 것

수직 거리

함수 연관 관계와 동작 방식을 이해하려고 이 함수에서 저 함수로 오가며 소스파일을 위아래로 뒤지는 등 ㅈ뺑이를 돌았으나 결국은 미로 같은 코드때문에 혼란만 가중된 경험? 저는 있어요..

함수나 변수가 정의된 코드를 찾으려 상속 관계를 줄줄이 거슬러 올라간 경험?

시스템이 무엇을 하는지 이해하고 싶은데, 이 조각 저 조각이 어디에 있는지 찾고 기억하느라 시간과 노력을 소모

서로 밀접한 개념은 세로로 가까이 둬야한다. ← protected 변수를 피해야 하는 이유 중 하나

같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리로 연관성을 표현

연관성이란 한 개념을 이해하는 데 다른 개념이 중요한 정도, 연관성이 깊은 두 개념이 멀리 떨어져 있으면 코드를 읽는 사람이 소스 파일과 클래스를 여기저기 뒤지게 된다.

변수선언- 변수는 사용하는 위치에 최대한 가까이 선언. 지역 변수는 각 함수 맨 처음에 선언

루프를 제어하는 변수는 흔히 루프 문 내부에 선언

아주 드물지만 다소 긴 함수에서 블록 상단이나 루프 직전에 변수를 선언하는 사례도있음

인스턴스 변수 - 클래스 맨 처음에 선언, 변수간에 세로로 거리를 두지 않음

위치 논쟁- 자바는 보통 클래스 맨 처음에 선언, C++에서는 모든 인스턴스 변수 클래스 마지막에선언(가위규칙)

잘 알려진 위치에 인스턴스 변수를 모은다는 사실이 중요, 변수 선언을 어디서 찾을지 모두가 알고 있어야함

코드 중간에 인스턴스 변수 선언하면 찾기 어려움…

종속함수 - 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치

가능하다면 호출하는 함수를 호출되는 함수보다 먼저배치

첫째 함수에서 가장 먼저 호출하는 함수가 바로 아래정의, 다음으로 호출하는 함수는 그 아래에 정의. 호출되는 함수를 찾기가 쉬워지며, 그만큼 모듈 전체의 가독성도 높아진다.

개념적 유사성 - 어떤 코드는 서로 끌어당긴다. 개념적인 친화도가 높다. 친화도가 높을수록 코드를 가까이 배치.

친화도가 높은요인- 한 함수가 다른 함수를 호출해 생기는 직접적인 종속성, 변수와 그 변수를 사용하는 함수, 비슷한 동작을 수행하는 일군의 함수

명명법이 똑같고 기본 기능이 유사하고 간단,종속적인 관계가 없더라도 가까이 배치할 함수들

세로순서

호출되는 함수를 호출하는 함수보다 나중에 배치, 소스 코드 모듈이 고차원에서 저차원으로 자연스럽게 내려간다.

중요한 개념을 가장 먼저 표현,세세한 사항을 최대한 배제→세세한 사항은 가장 마지막에

독자 입장에선 소스파일에서 첫 함수 몇 개만 읽어도 개념을 파악하기 쉬워짐.

가로형식맞추기

프로그래머는 명백하게 짧은 행을 선호

80자 제한은 다소 인위적, 100자나 120자에 달해도 나쁘지 않음. 그 이상은 솔직히 주의부족

120 자 정도로 행길이 제한

가로 공백과 밀집도

가로 공백을 이용해 밀접한 개념과 느슨한 개념 표현

가로정렬

이런식의 정렬은 별로 유용하지 못하다. 코드가 엉뚱한 부분을 강조해 진짜 의도가 가려지기 때문.

ex 위 선언부를 읽다 보면 변수 유형은 무시하고 변수 이름부터 읽게 됨. 할당문을 보게 되면 할당 연산자는 보이지 않고 오른쪽 피 연산자에 눈이간다.

코드 형식을 자동으로 맞춰주는 도구는 대다수가 위와같은 정렬을 무시한다.

들여쓰기

소스파일은 윤곽도(outline)와 계층이 비슷, 파일 전체에 적용되는 정보가 있고, 파일 내 개별 클래스에 적용되는 정보가 있고, 클래스 내 각 메서드에 적용되는 정보가 있고, 블록 내 블록에 재귀적으로 적용되는 정보가 있다.

범위로 이루어진 계층을 표현하기 위해 우리는 코드를 들여쓴다.

들여쓰는 정도는 계층에서 코드가 자리잡은 수준에 비례

클래스 정의처럼 파일 수준인 문장은 들여쓰지 않는다. 클래스 내 메서드는 클래스보다 한 수준 들여쓴다.

메서드 코드는 메서드 선언보다 한 수준 들여쓴다. 블록코드는 블록을 포함하는 코드보다 한수준 들여씀.

원쪽으로 코드를 맞춰 코드가 속하는 범위를 시각적으로 표현

들여쓰기가 없다면 인간이 코드를 읽기란 거의 불가능

들여쓰기 무시하기

때로는 간단한 if문,짧은 while문,짧은 함수에서 들여쓰기 규칙을 무시하고싶다. 하지만 무조건 넣어야함

가짜범위

빈 while문이나 for문은 안쓰는게 좋다. 세미콜론도 제대로 들여써서 넣어준다.

팀규칙

팀은 한 가지 규칙에 합의해야 한다. 그리고 모든 팀원은 그 규칙을 따라야 한다. 그래야 소프트웨어가 일관적인 스타일을 보인다. 개개인이 따로국밥처럼 맘대로 짜대는 코드는 피해야한다.

어디에 괄호를 넣을지, 들여쓰기는 몇 자로 할지, 클래스와 변수와 메서드 이름은 어떻게 지을지 등

정한 규칙으로 IDE 코드 형식기를 설정한 후 사용

 

Q2. IDE 코드형식기 아시거나 사용해보신분??

익명1-intellij 매크로지정, 

 

좋은 소프트웨어 시스템은 읽기 쉬운 문서로 이뤄진다

스타일은 일관적이고 매끄러워야함

한 소스파일에서 봤던 형식이 다른 소스파일에도 쓰이리라는 신뢰감

온갖 스타일을 뒤섞어 소스코드를 필요 이상으로 복잡하게 만드는 실수는 반드시 피해야함

밥 아저씨의 형식규칙

코드 자체가 최고의 구현 표준 문서가 되는 예

 

'AWS' 카테고리의 다른 글

클린코드 9장 단위테스트  (1) 2023.11.27
mobile programming 프로젝트 준비  (0) 2023.10.31