클린코드대신
-
1. TDD 법칙 세 가지 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 2. 깨끗한 테스트 코드 유지하기 테스트 코드 깨끗해야하는 이유는 결국 유지보수성? 실제 코드가 진화하면 테스트 코드도 변해야 한다. 그런데 테스트 코드가 지저분할수록 변경하기 어려워진다. 테스트 슈트가 없으면 개발자는 자신이 수정한 코드가 제대로 도는지 확인할 방법이 없다. 테스트 슈트가 없으면 시스템 이쪽을 수정해도 저쪽이 안전하다는 사실을 검증하지 못한다. 3. 테스트는 유연성, 유지보수성, 재사용성을 제공하는 버팀목이 바로 ..
클린 코드 대신 읽어드립니다 _ 9. 단위 테스트(정리, 요약, 후기)1. TDD 법칙 세 가지 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 2. 깨끗한 테스트 코드 유지하기 테스트 코드 깨끗해야하는 이유는 결국 유지보수성? 실제 코드가 진화하면 테스트 코드도 변해야 한다. 그런데 테스트 코드가 지저분할수록 변경하기 어려워진다. 테스트 슈트가 없으면 개발자는 자신이 수정한 코드가 제대로 도는지 확인할 방법이 없다. 테스트 슈트가 없으면 시스템 이쪽을 수정해도 저쪽이 안전하다는 사실을 검증하지 못한다. 3. 테스트는 유연성, 유지보수성, 재사용성을 제공하는 버팀목이 바로 ..
2024.02.08 -
1. 오류 코드보다 예외를 사용하라 오류가 발생하면 예외를 던지는 편이 낫다. 그러면 호출자 코드가 더 깔끔해진다. 논리가 오류 처리와 뒤섞이지 않으니까. 예시 2. Try-Catch-Finally 문부터 작성하라 예외에서 프로그램 안에다 범위를 정의한다는 사실은 매우 흥미롭다. try-catch-finally문에서 try블록에 들어가는 코드를 실행하면 어느 시점에서든 실행이 중단된 후 catch 블록으로 넘어갈 수 있다. 어떤 면에서는 try 블록은 트랜잭션과 비슷하다. try 블록에서 무슨 일이 생기든지 catch 블록은 프로그램 상태를 일관성 있게 유지해야 한다. 그러므로 예외가 발생할 코드를 짤 떄는 try-catch-finally 문으로 시작하는 편이 낫다. 그러면 try 블록에서 무슨 일이 생..
클린 코드 대신 읽어드립니다 _ 7. 오류 처리 (정리, 요약, 후기)1. 오류 코드보다 예외를 사용하라 오류가 발생하면 예외를 던지는 편이 낫다. 그러면 호출자 코드가 더 깔끔해진다. 논리가 오류 처리와 뒤섞이지 않으니까. 예시 2. Try-Catch-Finally 문부터 작성하라 예외에서 프로그램 안에다 범위를 정의한다는 사실은 매우 흥미롭다. try-catch-finally문에서 try블록에 들어가는 코드를 실행하면 어느 시점에서든 실행이 중단된 후 catch 블록으로 넘어갈 수 있다. 어떤 면에서는 try 블록은 트랜잭션과 비슷하다. try 블록에서 무슨 일이 생기든지 catch 블록은 프로그램 상태를 일관성 있게 유지해야 한다. 그러므로 예외가 발생할 코드를 짤 떄는 try-catch-finally 문으로 시작하는 편이 낫다. 그러면 try 블록에서 무슨 일이 생..
2024.02.02 -
1. 디미터 법칙 디미터 법칙은 잘 알려진 휴리스티heuristic으로, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다. 객체는 자료를 숨기고 함수를 공객한다. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안 된다는 의미다. 디미터 법칙 위반의 예 final String outputDir = ctxt.getOptions().getScratchDir().getAboslutePath(); : getOptions() 함수가 반환하는 객체의 getScratchDir() 함수를 호출한 후 getScratchDir() 함수가 반환하는 객체의 getAbsoutePath() 함수를 호출하기 때문이다. 2. 기차 충돌 흔히 위와 같은 코드를 기차 충돌 train wreck이라 부른다. 여러 객차가 한 ..
클린 코드 대신 읽어드립니다 _ 6. 객체와 자료 구조 (정리, 요약, 후기)1. 디미터 법칙 디미터 법칙은 잘 알려진 휴리스티heuristic으로, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다. 객체는 자료를 숨기고 함수를 공객한다. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안 된다는 의미다. 디미터 법칙 위반의 예 final String outputDir = ctxt.getOptions().getScratchDir().getAboslutePath(); : getOptions() 함수가 반환하는 객체의 getScratchDir() 함수를 호출한 후 getScratchDir() 함수가 반환하는 객체의 getAbsoutePath() 함수를 호출하기 때문이다. 2. 기차 충돌 흔히 위와 같은 코드를 기차 충돌 train wreck이라 부른다. 여러 객차가 한 ..
2024.02.02 -
형식을 맞추는 목적 - 코드 형식은 의사소통의 일환이다. 의사소통은 전문 개발자의 일차적인 의무다. 1) 세로 밀집도 - 줄바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다. 즉, 서로 밀접한 코드 행은 세로로 가까이 놓여야 한다는 뜻이다. 2) 변수 선언 - 변수는 사용하는 위치에 최대한 가까이 선언한다. 3) 종속 함수 - 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 그러면 프로그램이 자연스럽게 읽힌다. 규칙을 일관적으로 적용한다면 독자는 방금 호출한 함수가 잠시 후 정의될리라는 사실을 예측한다. 4) 들여쓰기 무시하기 - 때로는 간단한 if문, 짧은 while문, 짧은 함수에서 들여쓰기 규칙을 무시하고..
클린 코드 대신 읽어드립니다 _ 5. 형식 맞추기 (정리, 요약, 후기)형식을 맞추는 목적 - 코드 형식은 의사소통의 일환이다. 의사소통은 전문 개발자의 일차적인 의무다. 1) 세로 밀집도 - 줄바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다. 즉, 서로 밀접한 코드 행은 세로로 가까이 놓여야 한다는 뜻이다. 2) 변수 선언 - 변수는 사용하는 위치에 최대한 가까이 선언한다. 3) 종속 함수 - 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 그러면 프로그램이 자연스럽게 읽힌다. 규칙을 일관적으로 적용한다면 독자는 방금 호출한 함수가 잠시 후 정의될리라는 사실을 예측한다. 4) 들여쓰기 무시하기 - 때로는 간단한 if문, 짧은 while문, 짧은 함수에서 들여쓰기 규칙을 무시하고..
2024.01.26 -
1. 실패를 만회하기 위한 주석 우리는 코드로 의도를 표현하지 못해, 그러니까 실패를 만회하기 위해 주석을 사용한다. 여기서 내가 실패라는 단어를 썼다는 사실에 주목한다. 진심이다. 주석은 언제나 실패를 의미한다. 때때로 주석 없이는 자신을 표현할 방법을 찾지 못해 할 수 없이 주석을 사용한다. 그래서 주석은 반겨 맞을 손님이 아니다. 그러므로 주석이 필요한 상황에 처하면 곰곰히 생각하기 바란다. 상황을 역전해 코드로 의도를 표현할 방법은 없을까? 코드로 의도를 표현할 때마다 스스로를 칭찬해준다. 주석을 달 때마다 자신에게 표현력이 없다는 사실을 푸념해야 마땅하다. 코드는 변화하고 진화한다. 일부가 여기서 저기로 옮겨지기도 한다. 조각이 나뉘고 갈라지고 합쳐지면서 괴물로 변한다. 불행하게도 주석이 언제나..
클린 코드 대신 읽어드립니다 _ 4. 주석 (정리, 요약, 후기)1. 실패를 만회하기 위한 주석 우리는 코드로 의도를 표현하지 못해, 그러니까 실패를 만회하기 위해 주석을 사용한다. 여기서 내가 실패라는 단어를 썼다는 사실에 주목한다. 진심이다. 주석은 언제나 실패를 의미한다. 때때로 주석 없이는 자신을 표현할 방법을 찾지 못해 할 수 없이 주석을 사용한다. 그래서 주석은 반겨 맞을 손님이 아니다. 그러므로 주석이 필요한 상황에 처하면 곰곰히 생각하기 바란다. 상황을 역전해 코드로 의도를 표현할 방법은 없을까? 코드로 의도를 표현할 때마다 스스로를 칭찬해준다. 주석을 달 때마다 자신에게 표현력이 없다는 사실을 푸념해야 마땅하다. 코드는 변화하고 진화한다. 일부가 여기서 저기로 옮겨지기도 한다. 조각이 나뉘고 갈라지고 합쳐지면서 괴물로 변한다. 불행하게도 주석이 언제나..
2024.01.19 -
1. 의도를 분명히 밝혀라. 변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다. 변수(혹은 함수나 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다. 1) 첫번째 예시 개선 전 int d; // 경과 시간(단위 : 날짜) 개선 후 int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays; 2) 두번째 예시 개선 전 읽히기는 하지만, 코드가 하는 일에 대해서 짐작하기 힘들다. 코드의 '맥락'이 코드에 명시적으로 드러나지 않는다. 해석) getThem이라는 메서드는, list1이라는 배열을 선언한다. theLi..
클린 코드 대신 읽어드립니다 _ 2. 의미 있는 이름 (정리, 요약, 후기)1. 의도를 분명히 밝혀라. 변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다. 변수(혹은 함수나 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다. 1) 첫번째 예시 개선 전 int d; // 경과 시간(단위 : 날짜) 개선 후 int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays; 2) 두번째 예시 개선 전 읽히기는 하지만, 코드가 하는 일에 대해서 짐작하기 힘들다. 코드의 '맥락'이 코드에 명시적으로 드러나지 않는다. 해석) getThem이라는 메서드는, list1이라는 배열을 선언한다. theLi..
2024.01.12