서론
요즘 코드의 질에 대해 고민을 많이 하는 것 같다.
물론 지금 해야할 것은 자바코드의 질과 양을 많이 늘리는게 가장 중요한 것 같지만..
회사에서 일을 하며 변수명, 주석등이나 처음 룰을 정한 것을 지키지않아 수정한 코드들도 상당히 많았다.
그래서 출근 시 그나마 들고다니기 쉽고, 꼭 한번 보고싶던 클린코드를 들고다니며 보고 있다.
보다보니 생각보다 사설이 많이 들어가 재밌고 아~ 맞아맞아~ 비교해보니 정말 그러네~ 같은 생각이 많이 든다.
1장 클린코드란?
클린 코드란 무엇일까?
저자가 물어본 프로그래머들의 공통적인 말은 바로
- 의존성이 적고
- 의도한 한가지 기능에 충실하고
- 읽기 쉬운 코드
인 것 같다.
2장 의미 있는 이름
2장에서 가장 중요한 요점은 다른사람도 알기 쉬운 의미 있는 이름을 짓는 것을 고려하라 인 것 같다.
3장 함수
3장에선 함수하나는 작게 만들어야하고 한가지 일을 하며, 함수인수를 최대한 줄여야 한다고 한다.
또 if로 감싸며 오류코드를 하는거보다 예외처리를 해서 보기 좋게 짜는게 좋다고 한다.
또 try/catch는 추하므로 이 블록에 대한 것도 따로 메소드로 뺴는 것이 더 보기 좋다고했다..
확실히 보기 좋은 것 같다.
4장 주석
주석은 정말 필요한 것 이외엔 달지말자..
저자 같은 경우 주석을 혐오하는 수준이었다.
딱 봤을때 명칭이 명확하지않거나 코드가 읽기 힘들다면 주석을 많이 달아줬었는데..
확실히 처음부터 잘 짜는 것이 중요한 것 같다.
5장 형식 맞추기
5장은 약간 당연한 것들, 보기 좋은 것들 이었다
보기좋게 거리는 띄우고 길면 아래로.. 가독성을 높이는 요소가 많았다.
당연하다지만 예전엔 귀찮아서 잘 안하던 것들이다..
6장 객체와 자료구조
6장은 interface를 쓰거나 기능이나 변수는 보여주지않고 기능만 동작하게 함 객체에 신경쓰면 자료구조를 지키기힘들기에 적절한 분배가 필요한 것 같음 다시 한번 읽어보는게 좋겠다.
7장 오류 처리
오류 처리 시 예외의 반환에 대해 말 하고 있음 try/catch문을 먼저 작성하고 안의 로직을 따로 짜길 권장한다. 의미있는 예외를 짜길 권장한다. 또한 null을 반환하지말고 또한 null의 전달을 지양하며 Collectons.emptyLsit() 등을 사용하길 권장한다. 여러모로 다시 봐야할 것 같다
8장 경계
외부코드를 사용할때는 우리쪽 코드를 작성하기 전(적용전)에 간단한 테스트케이스를 작성해 외부 코드를 익히고 예상대로 동작하는지 확인하는 과정이 중요하다. 또한 우리가 통제하는 인터페이스를 구현하고, 다른 쪽이 구현할 API를 분리하고 다른 팀의 API를 활용 시 Adapter 패턴을 이용해 API 사용을 캡슐화 하여 API가 바뀔 때 수정할 코드를 한 곳으로 모은다..
경계에 위치하는 코드를 분리하고 기대치를 정의하는 테스트케이스를 작성하여 분리시킨다.
Adapter 패턴 :
9장 단위 테스트
TDD 법칙 세가지,
실패하는 단위테스트를 작성할 때 까지 실제 코드를 작성하지마라
컴파일은 실패하지않으면서 실행이 실패하는 정도만 단위 테스트를 작성
현재 실패하는 테스트를 통과할 정도로만 실제코드 작성
예상되는 결과값의 테스트코드를 미리 작성하여 실제코드를 맞춰 작성.. 실제 개발을 했을때 적용하기 좀 힘들었다.
자꾸 까먹거나하기때문에.. 이제는 좀 지켜보려 한다.
테스트코드도 지저분한 코드는 수정하기 어렵다. 테스트코드는 유연성,유지보수성,재사용성을 제공하며 테스트 커버리지가 높을수록 코드의 안정성은 올라간다.
꺠끗한 테스트코드는 가독성이 가장 중요하다
필자는 테스트당 Assert 하나라는 단일 규칙을 선호한다
이는 테스트 함수마다 한 개념만 테스트한다는 생각이다.
10장 클래스
클래스는 작게 만들어야 한다.
함수가 물리적인 행 수로 따졌다면 클래스는 본인의 기능(RDD 맡은 기능)을 센다
그래서 클래스작명은 클래스 줄이기의 첫번째이다.
단일 책임 원칙는 객체지향에서 가장 중요한 개념중 하나다
큰 클래스 하나보다 작은 클래스 하나가 더 중요하다!
클래스의 변수는 변수사가 작고 메서드가 변수를 많이 사용할 수록 응집도가 높다.
몇몇 메소드만 사용하는 변수가 많은건 바람직하지않고 이는 새로운 클래스로 쪼개야한다는 것이다.
11장 시스템
시스템 생성과 사용을 분리해야 한다고 한다. 준비(애플리케이션 객체를 제작하고 의존성을 서로 연결)과 런타임로직(준비과정이후 이어지는) main에서