본문 바로가기
책/Clean Code

[Clean Code] 5장 형식 맞추기

by 오오오니 2025. 3. 17.

5장 형식 맞추기

2024년 2월 13일 오후 6:44
비어 있음

형식을 맞추는 목적

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

세로 형식

적절한 행 길이를 유지하기
200줄 정도인 파일로도 커다란 시스템을 구축할 수 있다.
개념은 빈 행으로 분리하라
완결된 생각 하나를 일련의 행 묶음으로 표현하기
패키지 선언부, import 문 , 각 함수 사이에 빈행
세로 밀집도는 연관성을 의미한다.
클래스의 인스턴스끼리 가까이 놓기
수직 거리
변수는 사용하는 위치에 가까이 선언한다.
지역변수는 맨 처음에 선언한다.
인스턴스 변수는 클래스 맨 처음에 선언한다.
한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다.
호출하는 함수를 호출되는 함수보다 먼저 배치한다.
복사
public class WikiPageResponder implements SecureResponder { protected WikiPage page; protected PageData pageData; protected String pageTitle; protected Request request; protected PageCrawler crawler; public Response makeResponse(FitNesseContext context, Request request) throws Exception { String pageName = getPageNameOrDefault(request, "FrontPage");// 상수를 알아야 마땅한 함수에서 실제 사용하는 함수로 산수를 넘겨주는 방법이 좋음 loadPage(pageName, context); if (page == null) return notFoundResponse(context, request); else return makePageResponse(context); } private String getPageNameOrDefault(Request request, String defaultPageName) { String pageName = request.getResource(); if (StringUtil.isBlank(pageName)) pageName = defaultPageName; return pageName; } protected void loadPage(String resource, FitNesseContext context) throws Exception { WikiPagePath path = PathParser.parse(resource); crawler = context.root.getPageCrawler(); crawler.setDeadEndStrategy(new VirtualEnabledPageCrawler()); page = crawler.getPage(context.root, path); if (page != null) pageData = page.getData(); } private Response notFoundResponse(FitNesseContext context, Request request) throws Exception { return new NotFoundResponder().makeResponse(context, request); } private SimpleResponse makePageResponse(FitNesseContext context) throws Exception { pageTitle = PathParser.render(crawler.getFullPath(page)); String html = makeHtml(context); SimpleResponse response = new SimpleResponse(); response.setMaxAge(0); response.setContent(html); return response; } ...
개념적 유사성
친화도가 높은 요인
한 함수가 다른 함수를 호출해 생기는 직접적인 종속성
변수와 그 변수를 사용하는 함수
비슷한 동작을 수행하는 일군의 함수
아래 코드는 명명법이 똑같고 기본 기능이 유사함
복사
class Assert { static public void assertTrue(String message, boolean condition) { if (!condition) fail(message); } static public void assertTrue(boolean condition) { assertTrue(null, condition); } static public void assertFalse(String message, boolean condition) { assertTrue(message, !condition); } static public void assertFalse(boolean condition) { assertFalse(null, condition); } ...

가로 형식

80자 이후부터 행 수는 급격하게 감소한다. 프로그래머는 명백하게 짧은 행을 선호한다.
120자 이하가 좋다.
가로 공백
공백을 사용해 밀접한 개념과 느슨한 개념을 표현한다.
할당 연사자 앞 뒤에는 공백을 준다.
함수 이름과 이어지는 괄호 사이에는 공백을 넣지 않는다.
함수와 인수는 서로 밀접하다.
연산자 우선순위를 강조하기 위해서 공백을 사용하지만 코드 형식을 자동으로 맞춰주는 대다수 도구는 이를 고려하지 않음
b*b - 4*a*c
가로 정렬
엉뚱한 부분을 강조해 진짜 의도가 가려지기 때문에 유용하지 않음
복사
private Socket socket; private InputStream input; private OutputStream output; private Reques request; private Response response; private FitNesseContex context; protected long requestParsingTimeLimit; private long requestProgress; private long requestParsingDeadline; private boolean hasError;
들여쓰기
범위로 이뤄진 계층을 표현하기 위해 코드를 들여쓴다.
들여쓰기한 파일은 구조가 한눈에 들어온다.
간단한 if문 짧은 while문, 짧은 함수에서도 들여쓰기 규칙을 유지하기

팀 규칙

팀에 속한다면 팀 규칙을 따라야 한다.

' > Clean Code' 카테고리의 다른 글

[Clean Code] 11장 시스템  (0) 2025.03.17
[Clean Code] 9장 단위 테스트  (0) 2025.03.17
[Clean Code] 7 장 오류 처리  (0) 2025.03.17
[Clean Code] 3장 함수  (0) 2024.01.30
[Clean Code] 1장 깨끗한 코드  (2) 2024.01.30