[Code.presso] 3주차-1. SW 유지보수성 향상을 위한 Clean Code(2)

sorzzzzy·2022년 1월 24일
0
post-thumbnail

Code.presso Java 웹 개발 트랙 체험단 활동 3주차 첫번째 코스로, 이전 포스팅에 이어 Clean Code에 대해 학습한 내용을 정리해보려고 한다!

강의 제목은 "SW 유지보수성 향상을 위한 Clean Code" 으로, 자세한 정보는 👇🏻아래👇🏻 링크를 통해 확인할 수 있다.

📌 SW 유지보수성 향상을 위한 Clean Code - 강의 정보

✋🏻 포스팅 내 사용된 사진 파일들의 저작권은 모두 코드프레소에 있으며, 강의자료 공유 및 업로드는 불가능합니다.


🏷 Clean Comment

CommentCode에 대한 사람이 읽을 수 있는 부가설명으로 사람이 코드를 더 쉽게 이해할 수 있게 하는 것이 목적이다.

사실 Comment는 대부분의 상황에서 사용하지 않는 것이 좋다😅
Comment로 부가 설명이 필요하다는 것은 곧 코드가 충분히 의미있지 못하다는 뜻이기 때문이다.

Comment에 의지하기 보다는 의미있는 Code를 작성하는 노력이 필요하다!


✔️ Bad Comment

1. 의미가 분명한 코드를 설명하는 Comment
딱 봐도 의미를 알 수 있는 코드에 Comment로 중복 설명까지 할 필요는 없다. 중복된 정보는 제거해야 마땅하다.

2. Comment 처리된 Code
필요는 없지만 언젠가는 사용할 것 같아 당장 없애기는 아까운 코드들이 있다.
요즘은 Git과 같은 형상 관리 도구로 얼마든지 관리가 가능하니 과감하게 지우자!

3. 이력을 남겨놓은 Comment
수정 이력같은 경우에도, 현재는 형상 관리 도구에 모든 이력이 관리되므로 이력 Comment는 무조건 삭제하자.

📌 사실상 99%의 Comment는 불필요하다.


✔️ Clean Comment

Comment를 사용하지 않는 것이 사실상 최고의 Clean Comment이다.
모든 의미는 Code로 표현되어야 하지만, 아주 예외의 경우를 함께 살펴보자!

1. 저작권 등을 명시하는 Comment

  • 회사의 정책에 의해 소유권, 저작권 등을 표시해야 하는 경우가 있다.

2. 다수가 사용하는 OpenAPI 문서화

  • 오픈소스 라이브러리는 API 사용의 용이성을 높이기 위해 Java Doc과 같은 Comment가 필요하다.

3. 이름만으로 충분히 의미를 전달하기 어려운 경우

  • 복잡한 정규 표현식의 경우, 불가피하게 이름만으로 충분한 의미를 표현하지 못한다.

4. To Do Comment

  • To Do Comment로 앞으로 해야 할 작업을 간략히 표시할 수 있다.

🏷 Clean Formatting

문학적 프로그래밍은 Donald Knuth에 의해 주창된 개념으로, 문학 작품을 읽는 것처럼 코드 또한 읽을 수 있도록 만들어저야 한다는 개념이다.

Code Formatting코드의 가독성과 이해도를 높여주는 일련의 작업으로, 수직적 Formatting과 수평적 Formatting으로 분류된다.

Formatting은 동작에는 영향을 미치지 않으나 가독성에는 아주 큰 영향을 미친다.
Formatting만 변경되어도 코드의 가독성은 매우 크게 향상된다.

언어 별 Style Guide마다 Formatting이 반드시 포함되어 있을 정도로 중요하기 때문에 조직 내 규칙을 정해 모든 개발자는 규칙에 따라 Formatting을 하는 습관을 가져야 한다.

또한 코드 리뷰정적 분석 도구를 활용하여 Formatting을 지속적으로 확인해야 한다!


✔️ 수직적 Formatting

수직적 Formatting은 코드의 위에서 아래로 진행된 흐름과 관련된 코드 작성 규칙이다.

코드 라인 간격, 밀접한 관계를 가지는 코드 간 그룹화 등이 포함된다.

수직적 Formatting은 엔터와 같은 개행문자를 이용해 Formatting 하는 것을 의미하고, 마치 신문기사처럼 위에서 아래로 쉽게 읽혀 나갈 수 있는 것을 목표로 한다.

1. 추상화의 수준 순서로 코드를 배치
고차원 함수에서 저차원 함수로, 추상화의 수준 순서로 코드를 배치해야 한다.
에세이의 작성 순서(제목, 요약, 큰 그림, 다수의 세부내용)를 생각해보면 쉽게 이해할 수 있다.

2. 서로 다른 개념은 분리 & 유사한 개념은 모아놓음
서로 다른 개념은 빈 행을 사용하여 분리하고, 반대로 유사한 개념은 모아놓는다.

3. 관계 있는 내용은 가까운 행에 작성
관련있는 메소드들은 가까이 배치한다.
이를 통해 코드를 읽으면서 여러번의 점프를 하는 것을 방지할 수 있다.

📌 메소드를 추가할 때는 시간적 순서가 아닌 논리적인 관련성에 따라 배치해야 한다.


✔️ 수평적 Formatting

수평적 Formatting하나의 코드 행에서 왼쪽에서 오른쪽으로 진행된 흐름과 관련된 코드 작성 규칙이다.

들여쓰기, 코드 간 간격, 코드 행의 넓이 등이 포함된다.

수평적 Formatting은 코드 한 줄에 대해 Formatting하는 것으로 좌우 스크롤링 없이 코드를 읽을 수 있어야 한다.
코드 한 줄을 스크롤의 이동없이 볼 수 있는 것을 목표로 한다.(약 80자)

1. 들여쓰기를 적극적으로 활용
들여쓰기는 관련 있는 개념들을 논리적인 그룹으로 묶음으로써 가독성을 크게 향상시킨다.
파이썬과 같은 일부 언어에서는 들여쓰기가 필수적이다.

2. 한 줄의 긴 코드를 여러 줄의 짧은 코드로 분리
수평 스크롤링 없이 코드를 이해할 수 있어야 하기 때문에, 대부분에 Style Guide에 수평 최대 권장 글자 수가 존재한다.
➡️ Google Java : 100글자
➡️ PEP8 : 72글자

3. 수평 정렬은 중요하지 않음
수평 정렬은 해도 상관 없지만, 필요하지는 않다.


🏷 Clean Control Structure

Control Structures란🤔❓

조건, 루프, 흐름을 제어하는 선언문으로 if, else if, for, while 등이 있다.
Control Structures는 코드 복잡도에 가장 큰 영향을 주는 요소이다.
특히 중첩된 Control Structures는 코드의 가독성을 낮추고, 복잡도는 높여서 테스트 용이성을 낮춘다.


✔️ Cyclomatic Complexity

Cyclomatic Complexity소스 코드의 복잡도를 나타내는 지표이다.
프로그램의 제어 흐름을 node, edge로 표현한 그래프를 기반으로 계산해 복잡도를 구한다.

복잡도가 낮을수록 프로그램이 구조적으로 안정되었다는 의미이고,
반대로 복잡도가 높을수록 프로그램이 구조적으로 불안정하다는 의미이다.

계산방법에는 두가지가 있다!


1. 복잡도 V(G) = edge의 수 - node의 수 + 2
➡️ V(G) = 6-5+2 = 3

2. 복잡도 V(G) = 분기문의 수 + 1
➡️ V(G) = 2+1 = 3

소프트웨어의 규모, 도메인 특성 등에 따라 Cyclomatic Complexity의 기준이 달라졌다.


✔️ 읽기 쉬운 조건문

개발 초기부터 코드 복잡도를 고려한 Control Structures의 설계가 중요하다.
설계의 첫번째 조건은 조건문이 읽기 쉬워야 한다는 것이다.

연산자를 기준으로 왼쪽항은 값이 변경될 가능성이 높은, 주로 변수의 이름이 와야 하고, 오른쪽 항에는 값이 고정될 가능성이 높은, 주로 특정 값이 위치해야 한다.

조건문을 구성하는 오른쪽 항에는 값을 잘 설명할 수 있는 명확한 상수로 설계되어야 한다.

삼항연산자를 사용하는 경우 항상 가독성을 고려해야 하는데, 위와 같이 아주 간단한 경우가 아니라

이와 같이 복잡한 삼항연산자의 경우, 기본적으로 if-else 문으로 표현하는 것이 자연스럽다.

코드의 라인을 최소화하는 것보다, 코드를 읽고 이해하는 시간을 최소화 하는 것이 중요하다❗️


✔️ Fail Fast! Early Return!

코드에는 검증 로직핵심 로직이 존재한다.
이 두가지 로직을 분리해야 메소드의 복잡성이 낮아지고, 가독성이 향상되어 테스트가 용이해진다.

Contorl Structure를 구성할 때에는 Fail Fast! Early Return! 의 구조를 고려해야 한다.
이는 빨리 실패하는 검증로직을 구현하여 로직을 분리하는 것이다.

이처럼 중첩을 제거할 수 있고, 조금 더 개선시켜서 각각의 검증로직을 메소드로 만들 수도 있다.

검증로직을 각각을 메소드로 만들고 나니 처음 코드에 비해 훨씬 가독성이 높아진 것을 확인할 수 있다!

📌 Fail Fast는 Clean Code와 코드의 복잡도를 줄이기 위한 매우 중요한 기법이다


✔️ 최대한 긍정 조건으로 표현

긍정적인 표현은 부정적인 표현보다 이해하기가 상대적으로 용이하기 때문에, 조건문은 긍정 표현을 사용하는 것이 가독성 관점에서 좋다.

! 연산자를 사용하는 조건은 긍정을 표현하는 메소드로 바꿔서 사용한다.


🏷 Clean Code를 위한 Code Refactoring

Code Refactoring이란 소프트웨어 품질 향상을 목적으로 기능의 변경 없이 내부 코드를 변경하는 기술이다.

'티끌 모아 태산' 이라는 말이 있듯이, 하나하나의 리팩토링이 너무 작아서 큰 의미는 없어 보일 수 있지만, 이러한 작은 개선들이 쌓이면 의미있는 품질 향상이 가능해진다!

Code Refactoring은 매일 개발의 일부로 진행하는 것으로 특별한 '활동'이 아니다.
개선해야 할 코드의 Bad Smell을 맡는 코를 가질 수 있도록 훈련해야 하고,
정리된 Code Bad Smell과 Refactoring Catalog를 참고하는 좋은 습관을 가지자😊


이렇게 이전 포스팅에 이어서 Clean Comment, Clean Formatting, Clean Control Structure, Code Refactoring 에 대해 다뤄보았다.

앞으로도 클린 코드 작성에 관심을 가지고 꾸준히 학습해야겠다!

코드프레소 홈페이지(https://www.codepresso.kr/)에는 오늘 포스팅한 Clean Code 관련 강의뿐만 아니라 다양한 강의들이 개설되어 있으니 모두 한번 씩 살펴보고 수강해보면 좋을 것 같다😃

profile
Backend Developer

0개의 댓글