Study/코드프레소 java 웹개발 체험단

[SW유지보수성 향상을 위한 clean code]3주차 : clean code

공부하기 좋은 날 2022. 1. 24. 20:24

이번 주차에는 코드프레소에서 clean code에 대한 강의를 수강하게 되었다. 전부터 프로그램 개발을 하며 코드를 더욱 깨끗하고 가독성있게 짜고 싶었지만 어떻게 해야할지 방법을 잘 몰랐었는데, 강의를 들으며 이전에 작성했던 코드들에 대해 반성하게 되었다. 특히 다른 사람들과 협업을 하는 프로젝트를 했을 때 이 강의를 알았더라면 더욱 잘 했을텐데 하는 아쉬움이 들었다. 인턴십 이후 이 강의를 접하게 되어 회사에서 생겼던 각종 이슈들이 생각나 이해와 반성이 더욱 잘 되었고, 본격적인 취업 이전에 이 강의를 수강하게 되어 앞으로 잘 활용해야겠다는 생각이 들었다. 이번에 습득한 지식을 계기로 code를 더욱 clean하게 작성해야겠다는 태도와 기준을 갖게되었다. 강의를 들으며 내용을 정리해보았다.

 

Clean Code

- 개발의 유지보수를 쉽게 하고 유지보수성을 높이기 위해 clean code는 중요하다.

- clean code 의 기준은 개개인마다 다르기 때문에 clean code를 위해서는 개인과 조직의 노력이 중요하다.

- clean code의 목적, 중요성, 기준, 목표, 품질등의 내용을 조직에서 정하고 합의해야 한다.

 

클린 코드의 정의 (출처: 코드프레소)
클린 코드의 중요성 (출처: 코드프레소)

 

 

 

 

Clean Naming

- 우리는 개발의 약 75%의 시간을 코드를 읽고 이해하는데 사용

- 이름을 짓는것은 가독성 향상에 가장 중요한 요소

- 변수, 상수, 함수, 메소드, 클래스 등의 이름을 잘 짓기

 

1) clean naming의 원칙

모든 이름은 반드시 그 의미가 명확해야 한다.

 

clean naming의 원칙(출처: 코드프레소)

- 명확한 역할을 갖게 하자: 역할이 많으면 이름도 명확하고 광범위해지기때문에 

- 이름은 너무 짧지도, 장황하지도 않아야 함. 최소한의 정보를 가질것.

- 줄임말보단 풀네임

- 네이밍 규칙을 따를것, 언어별로 naming standard가 존재

- guide를 결정하여 잘 사용하기

- 협업하는 사람들이 네이밍에 대한 것을 신경쓰는 문화를 만들기

 

2) variable을 위한 clean naming

좋은 변수 네이밍(출처: 코드프레소)
clean하지 않은 변수 네이밍(출처: 코드프레소)

 

 

3) method를 위한 clean naming

 

좋은 함수 네이밍(출처: 코드프레소)
나쁜 함수 네이밍(출처: 코드프레소)

 

4) class를 위한 clean naming

- 구체적이고 명확한 이름  ex) dbCnct -> DBConnector

- convention을 준수하는 일관성 있는 이름을 사용해야 함.

- 도메인 전문가가 봤을때도 알 수 있도록 네이밍 해야함

 

- 언어마다 코딩 룰이 있음

- 가장 중요한것은 이 이름을 내 동료가 쉽게 이해할 수 있을까? 생각하고 동료들과 함께 지속하는 태도

 

 

 

Clean Method

- method/function은 sw에서 가장 기본이 되는 모듈

- 호출하는 사람이 사용하기 용이해야 함

- 유지보수하는사람이 이해, 변경, 테스트하기 용이해야함

클린 메소드 원칙(출처: 코드프레소)

1) 파라미터

메소드를 호출할때마다 내부코드를 보거나 api문서를 보지 않게 해야함

메소드의 파라미터 갯수를 최대한 적게 해야함

 

2) clean method의 크기

- 작고 역할이 명확한 메소드는 읽고 이해, 기존코드 수정, 단위테스트, 재사용에 용이하다.

- 메소드의 길이는 작은것이 읽기 편함- 스크롤링 없어야 편함

- 메소드의 동작을 설명하기 위해 내부에 주석을 달아야 하면 bad smell!!! -> 주석이 필요한 코드들은 새로운 method로 추출하기

- 팀 내의 규칙을 만드는것이 좋음

 

3) 한가지의 명확한 역할

- 한가지의 함수는 한가지의 명확한 역할을 하게 해야함, 명확한 naming이 가능하고, 이름만드로 기능을 이해할 수 있도록.

- 한가지의 일을 하는 함수는 복잡도가 낮아질 가능성이 높음, 메소드의 내부 코드 수정, 단위 테스트 하기에 용이함.

- 한가지의 일이란? - 하나의 메소드는 동일한 추상화의 수준만 가져야 함.

 

4) 중복 코드

- 중복코드는 없는것이 좋음, 전체/일부/부분 중복을 없애야 함

 

5) 깨진 유리창 이론과 clean code

- 작고 명확하게 한가지 일을 하는 메소드는 수정할때도 더 신경쓰게 되지만 이미 bad smell을 풍기는 함수는 clean하게 수정하지 않아도 죄책감이 들지 않음-코드 품질에 관한 컨센서스를 맞춰야 함, 지속적인 sw품질 향상에 대한 노력이 가장 중요

 

6) 보이스카우트 법칙과 비자아적 프로그래밍

* 보이스카우트 법칙

- 캠프장에 처음 왔을때보다 더 깨끗하게 해놓고 떠나라는 보이스카우트 법칙처럼 코드도 깨끗하게 해놔야 함.

지속적인 개선에 대한 인식과 노력이 중요. 

clean code를 장려하는 문화, 단위테스트 코드를 갖는것이 중요함

 

* 비 자아적 프로그래밍

- 각자 만든 코드에 개인의 자아를 투영하지 않은자세를 가져야 함.

코드에 대한 공동소유, 책임철학을 강조해야 함.

- 지속적인 코드리뷰 또는 페어프로그래밍으로 달성 가능

- 사람이 아닌 코드를 비판할 것.

- 사람과 사람이 작성한 코드는 다름.

 

7) 메소드 측정 지표

- 코드의 라인 수: 메소드의 길이 측정-조직에서 bad smell의 기준을 정하고 이를 넘는 method를 검출하여 수정하기

- cyclomatic complexity : 메소드 내부의 조건문 중첩이 복잡할수록 높아짐

 

 

 

Clean Comment

-comment(주석)은 필요악이다. 대부분의 상황에서 사용하지 않아야하지만, 필요에 따라 사용해야함.

comment 에 의미하기보다는 주석을 달지 않고도 코드를 명확히 알 수 있도록 해야함. 

- 주석은 최신정보를 포함하지 않을 수 있음

- 코드로 의미를 표현하는 경우 코멘트는 필요없는 중복정보임.

- 코드의 수정 이력을 표현하는 주석은 형상관리도구로 충분히 정보를 담을 수 있음

 

1) bad comment

- 의미가 모호한 코드를 설명하는 주석- 코드 자체로 명확한 표현이 안될 때 코드 자체를 개선해야 함.

- 중복된 정보를 나타내거나 의무적으로 작성하는 comment는 쓸모없음

- comment는 code bad smell

 

2) clean comment

- comment를 사용하지 않는것이 최고의 clean comment

- 진실은 code안에 있다

- 다수가 사용하는 open api의 문서화, 회사 저작권 등을 표시하는 등 반드시 필요할땐 사용

- 최대한 이름만으로 의미를 표현하는것이 중요

- to do comment : 앞으로 해야할 일을 간략히 작성

 

 

Clean Formatting

- 문학적 프로그래밍: 코드는 사람이 읽도록 만들어지는것이 우선. 좋은 코드는 문학작품과 같이 가독성있게 읽을 수 있어야 함. - 사람에게 만들어지기 때문

- clean formmating = 코드를 가독성있게 작성하는 규칙, 수직적/수평적으로 가독성 향상

- 주기적인 코드리뷰, 정적분석 시스템 이용등을 통해 clean formmating을 확인해야 함.

 

 

1) 수직적 formatting

: 신문기사처럼 위에서 아래로 쉽게 읽히는 코드 작성

- 추상화의 수준 순서로 코드를 배치

고차원 함수 

     ↓

저차원 함수

순서로 작성

 

- 서로 다른 개념은 분리, 유사한 개념은 모아놓기, 관련있는 메소드들은 가까이 배치하기-논리적인 관련성에 따라 메소드를 배치해야 함.

 

2) 수평적 formatting

- 수평적 formatting은 코드 한줄에 대해서 formatting하는것을 의미

- 횡스크롤 없이 코드를 읽을 수 있어야 함.

 

 

 

Clean Control Structure

- 조건, 루프, 흐름을 제어하는 선언문

- 중첩된 control structure는 복잡도를 높이고 가독성을 낮춤

 

프로그램 제어 흐름을 node, edge로 표현한 그래프를 기반으로 계산

 

1) 읽기 쉬운 조건문

- 왼쪽=변수-> 오른쪽=고정값

읽기 쉬운 조건문(출처:코드프레소)

- 삼항연산자 사용 - 가독성을 고려하기

삼항연산자와 가독성 (출처: 코드프레소)

 

 

2) fail fast early return

- 조건문이 중첩될 때 그림과 같이 해결가능

중첩 조건문 해결 (출처: 코드프레소)

조건이 맞지 않을때를 빠르게 수행하여 중첩되지 않은 조건문을 만든다

 

각각의 검증 로직을 method로 만들어도 됨

 

3) 최대한 긍정 조건으로 표현하기

isNotEmpty()  보다   isEmpty()  가 더 좋음

 

 

 

Code Refactoring

: 기존 기능에 변경을 가하지 않는 수준의 아주 작은 코드 개선작업

특별한 활동이 아닌, 일상생활처럼 해야하는 것

코드 리팩토링 과정 ( 출처: 코드프레소 )

- code bad smell

: 코드 중복, 긴 메소드, 큰 클래스, 많은 파라미터, 높은 결합도, 상속한 후 안 사용, 원시 데이터 타입만 고집, 실행되지 않는 코드, 불필요한 주석 등 민감한 코를 갖도록 훈련해야 함.

 

refactoring catalog를 참고하여 refactoring하는것은 좋은 습관

 

- 코드프레소 Java 웹 개발 체험단 활동 중
- 코드프레소 [실무자가 알려주는 Git입문]강의 수강 중
- 코드프레소 URL: https://www.codepresso.kr/

 

프리미엄 IT 교육 서비스 - 코드프레소

 

www.codepresso.kr