일반적으로 좋은 코드라 할 수 있는 코드의 특징은 다음과 같다
개발을 하다보면 한번에 끝나는 것이 아닌 변경작업인 코드 리팩토링이 필수적이기 때문에 개발만큼 중요한 것은 유지보수이다.
따라서 리팩토링을 쉽게 하기위해선 위와 같은 특징이 있는 코드들이 좋은 코드라고 할 수 있다.
좋은 코드를 작성하기 위해선 몇가지 참고할 내용들이 있다.
코드를 만들 때 지켜야 하는 코딩 스타일
한 프로젝트 안에서 많은 사람들이 작업 할 경우에 코딩 스타일, 즉 코딩 컨벤션이 통일이 되지 않은 상태로 작업을 진행 했을 때에 추후에 리팩토링이나 코드리뷰를 하는 과정에서 코드를 보고 이해를 못하는 대참사가 일어날 수가 있다.
그래서 사용하는 언어나 프로젝트에 따라 사용하는 코딩 컨벤션이 정해져있다.
이 코딩 컨벤션에는 다음과 같은 내용들이 포함되어있다.
처음 언어를 배우거나 프로젝트를 처음 시작하게 되었을 때, 변수의 이름을 a, b 이런 식으로 생각없이 편하게 생성하곤 한다.
이런 방식은 프로젝트의 규모가 조금만 증가해도 변수사용, 함수사용할 때에 큰 불편을 야기하곤한다.
그래서 이름의 길이를 줄이는 것 보단 명확한 뜻을 가지고 있는 것이 중요하다.
예)
함수 -> getName, setName | 일반적으로 동사로 짓는다 변수 -> name, music, music | 일반적으로 명사로 짓는다 예외로 Boolean 변수는 isEmpty, isLogined 처럼 앞에 is가 붙게 짓는다
프로젝트를 중간에 참여하게 되거나 현업에서 새로운 직장에 취업을 해서 프로젝트를 파악을 해야하는 데 이해 하기 힘든 폴더 구조로 되어 있다면 파악하는데에만 시간이 오래 걸릴 것이다.
이를 방지하기위해 프레임워크에 따른 프로젝트 구조나 아키텍쳐가 있다.
예)
SWIFTUI -> MVVM 아키텍쳐 PHP -> MVC 아키텍쳐 Spring -> Controller, Service, Repository, Dto, Config등
추상레벨이란?
- 코드가 세부 정보 어디까지 보여주는 지를 뜻한다.
추상 레벨을 너무 낮게 잡으면 코드 파악에 어렵다.
낮게 잡은 예)
void register() { throwIfEmailExists(); if (blacklistEnabled && blacklist.contains(credentials)) { let hiddenPassword = passwordService.secure(credentials.password); throw new CannotRegisterWithBlacklistedCredentials(credentials); } }
일정 수준으로 유지한 예제)
void register() { throwIfEmailExists(); throwIfBlacklisted(); }
한눈에 봐도 밑에 예제가 어떤 역할을 하는 코드인 지 눈에 잘 들어온다.
프로그래밍 원칙 중 하나인 DRY(Don't Repeat Yourself)는 똑같은 코드를 절대 반복하지 말라는 뜻이다.
실제로 프로젝트를 진행하면서 같은 코드를 많이 사용하게 되는데 중간에 오류가 나거나 변경사항이 생기면 복사, 붙여넣기 했던 코드들을 샅샅이 찾아서 변경해야 하는 대참사가 일어난 적이 있었다.
또한 사람이 작성하는 코드이기 때문에 이 과정에서 실수가 나올 가능성이 크고 버그 발생을 만드는 가장 큰 요인이다.
실제 자그만하게 협업도 해보고 개인프로젝트도 해봤을 때 개인적으로 가장 중요하고 도움이 되었던 것은 모든 코드에 주석을 상세하게 작성하는 것이다.
이 과정이 복잡하고 귀찮을 지라도 어제 짠 코드를 오늘 보면 까먹는 경우가 많고 남이 짠 코드를 리뷰할 때에도 주석이 상세히 달려있다면 이해하는데 큰 도움이 된다.