이번 주차에는 코드프레소에서 clean code에 대한 강의를 수강하게 되었다. 전부터 프로그램 개발을 하며 코드를 더욱 깨끗하고 가독성있게 짜고 싶었지만 어떻게 해야할지 방법을 잘 몰랐었는데, 강의를 들으며 이전에 작성했던 코드들에 대해 반성하게 되었다. 특히 다른 사람들과 협업을 하는 프로젝트를 했을 때 이 강의를 알았더라면 더욱 잘 했을텐데 하는 아쉬움이 들었다. 인턴십 이후 이 강의를 접하게 되어 회사에서 생겼던 각종 이슈들이 생각나 이해와 반성이 더욱 잘 되었고, 본격적인 취업 이전에 이 강의를 수강하게 되어 앞으로 잘 활용해야겠다는 생각이 들었다. 이번에 습득한 지식을 계기로 code를 더욱 clean하게 작성해야겠다는 태도와 기준을 갖게되었다. 강의를 들으며 내용을 정리해보았다.
Clean Code
- 개발의 유지보수를 쉽게 하고 유지보수성을 높이기 위해 clean code는 중요하다.
- clean code 의 기준은 개개인마다 다르기 때문에 clean code를 위해서는 개인과 조직의 노력이 중요하다.
- clean code의 목적, 중요성, 기준, 목표, 품질등의 내용을 조직에서 정하고 합의해야 한다.
Clean Naming
- 우리는 개발의 약 75%의 시간을 코드를 읽고 이해하는데 사용
- 이름을 짓는것은 가독성 향상에 가장 중요한 요소
- 변수, 상수, 함수, 메소드, 클래스 등의 이름을 잘 짓기
1) clean naming의 원칙
모든 이름은 반드시 그 의미가 명확해야 한다.
- 명확한 역할을 갖게 하자: 역할이 많으면 이름도 명확하고 광범위해지기때문에
- 이름은 너무 짧지도, 장황하지도 않아야 함. 최소한의 정보를 가질것.
- 줄임말보단 풀네임
- 네이밍 규칙을 따를것, 언어별로 naming standard가 존재
- guide를 결정하여 잘 사용하기
- 협업하는 사람들이 네이밍에 대한 것을 신경쓰는 문화를 만들기
2) variable을 위한 clean naming
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/
'Study > 코드프레소 java 웹개발 체험단' 카테고리의 다른 글
[Spring Boot 웹개발 입문]3주차: 웹개발(프론트엔드, 백엔드)의 전반적 이해 (0) | 2022.02.04 |
---|---|
[JAVA프로그래밍 초급]2주차: 객체지향 (0) | 2022.01.25 |
[실무자가 알려주는 Git 활용한 프로젝트 관리]2주차: Git 브랜치 (0) | 2022.01.15 |
[실무자가 알려주는 Git입문]-1주차: Git의 이해와 실습 (0) | 2022.01.14 |
[처음 시작하는 Java 프로그래밍]- 1주차: 자바 개념 및 문법 정리 (0) | 2022.01.13 |