코딩에 도움이 되는 요소
(일반) 협업 + 유지보수에 필요한 과정 클린 코드를 알아보자
너어디사니
2024. 5. 6. 20:24
클린코드란??
- 가독성이 좋고 유지보수 하기 좋은 코드
- 나중에 다시 읽었을 때 다른 사람이 읽었을 때에도 이해하기 쉬운 코드
- 한 번 작성된 코드가 보통 많이 읽히므로 작성하기 쉬운코드 보다 읽기 쉬운 코드가 좋은 코드
- 리펙토링
- 기존의 코드를 변경해서 코드의 구조를 개선 시키고 가독성을 향상 시키는 프로세스
- 결과의 변경 없이 구조만 개선 시키는 방법
- 리펙토링을 진행하는 시점
- 기능 개발을 끝낸 후
- 코드 리뷰를 받으면서 토의를 할 때
- 새로운 기능을 추가하기 전
- 코드가 뒤죽박죽 섞여있을 경우(가독성이 낮거나 이해도가 떨어질 경우)
- 클린 코드 작성 요령
- 코딩 컨벤션
- 다른 사람들도 이해하기 쉽게 코드를 작성하는 규칙
- 코드의 가독성이 증가해서 나중에 봐도 쉽게 이해가 가능하다
- 유지 보수가 용이하다
- 효율적인 협업이 가능하다
-
- 주로 변수, 메소드의 이름을 지정할 때 사용
- seoulFood (O) seoul_food (X) seoulfood (X)
-
- 주로 상수의 이름을 지정할 때 사용
- seoul_food (O) SeoulFood (X)
-
- 주로 클래스의 이름을 지정할 때 사용
SeoulFood (O) Seoul_Food (X)
- 유용한 단축키: reformat code
- Control + Alt + L (Windows) Command + Option + L (Mac)
- 유용한 단축키: optimaze all imports
- 쓰지 않는 Import를 깔끔하게 정리 해 준다
Control + Alt + O (Windows) Control + Option + O (Mac)
- 이름을 잘 작성하는 방법
- 의도를 밝히는 이름을 짓기
- 오해할 수 있는 정보를 주지 않기
- 모두가 이해알 수 있는 이름으로 짓기
- 규칙에 맞게 품사를 사용
- 클래스, 프로퍼티의 이름 : 명사
- 함수 이름 : 동사
- ex
- // bad // 변수 이름에서 의도를 알기 어려움. val d = ZonedDatetime.now() // good val requestDatetime = ZonedDatetime.now() // bad // list 자료구조를 사용하지 않으면서 변수 이름에 list를 포함하면 좋지 않음. val userList = mapOf( "logan" to User(1), "frank" to User(2), "molly " to User(3), ) // good // 자료구조를 나타내지 않으면서 여러 대상을 나타내려면 // s를 붙여 복수형으로 사용, 혹은 group을 붙인다. val userGroup = mapOf( "logan" to User(1), "frank" to User(2), "molly " to User(3), ) // Bad class SaveProgress { fun progress() { val currentStep = getStep() repository.save(currentStep) } } // Good class ProgressSaver { fun save() { val currentStep = getStep() repository.save(currentStep) } }
- 주석을 잘 작성하는 방법
- 코드의 의도를 드러내게끔 작성한다
- 학습할때는 주석을 작성하면 좋다
- 좋은 주석
- 계획을 설명하는 주석
- 정책을 설명하는 주석
- 학습을 위한 주석
- 나쁜 주석
- 코드를 설명하는 주석
- 오해를 일으키는 주석
- 코딩 컨벤션
- 테스트
- 개발자의 로직을 보고 문제가 발생할 수 있는 부분을 예측할 수 있다
- 제품을 베포하기 전에 QA를 거쳐서 버그를 찾아낼 수 있다
- 베포된 제품들을 모니터링 시스템을 보고 알 수 있다
- 고객의 제보를 보고 알 수 있다
- 테스트 코드
- 프로그램의 기능과 동작을 확인하기 위한 코드
- 코드의 안정성과 신뢰성을 확보
- 코드 변경 시에 예상치 못한 버그를 발견하고 유지보수성을 높일 수 있다
- 테스트 코드의 장점
- 문제를 보다 빨리 발견할 수 있다
- 문제 확인을 자동화 할 수 있다
- 요구사항을 문서화 역할을 한다
- 리펙토링을 자신감 있게 진행할 수 있다
- BehaviorSpec
- 특정 기능이나 원하는 동작을 명시적으로 정의하는 것
- Behavior-Driven Development (BDD) 스타일 이라고도 한다
- assert 문을 활용해서 검증이 가능하다
class SomeTest : BehaviorSpec({ Given("어떤 조건이 주어졌을 때") { When("어떤 기능을 실행하면") { Then("어떤 결과가 나타난다.") { true shouldBe true } } } })
- 테스트 코드가 지켜야 할 규칙
- Fast : 테스트는 빠르게 동작해야 한다
- Independent : 각 테스트는 서로 의존해서는 안되고 독립적으로, 아무 순서로 실행시켜도 괜찮아야 한다
- Repeatable : 테스트는 어떤 환경에서도 반복이 가능해야 한다
- Self-Validating : 테스트 성공 or 실패 값을 bool 값으로 결과를 내어 검증해야 한다
- Timely : 테스트 하려는 실제 코드를 구현하기 직전에 구현해야 한다