본문 바로가기

분류 전체보기

[CleanCode] 10장 클래스 클래스 체계 🔹 클래스를 정의하는 표준 자바 관례 (순서) ◽ 변수 목록 - 정적 공개 상수 (public static final) - 정적 비공개 (private static final) - 비공개 인스턴스 변수 공개 변수 (공개 변수가 필요한 경우는 거의 없다) ◽ 공개 함수 - 비공개 함수는 자신을 호출하는 공개 함수 직후에 넣는다. - 추상화 단계가 순차적으로 내려간다. 캡슐화 변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만 반드시 숨겨야 한다는 법칙은 없다. 때로는 변수나 유틸리티 함수를 protected로 선언해 테스트 코드에 접근을 허용하기도 한다. 같은 패키지 안에서 테스트 코드가 함수를 호출하거나 변수를 사용해야 한다면 그 함수나 변수를 protected로 선언하거나 패키지 전체..
[CleanCode] 9장 단위 테스트 🔹 기존에는 단위 테스트란 자기 프로그램이 '돌아간다'는 사실만 확인하는 일회성 코드에 불과했다. 클래스와 메서드를 공들여 구현한 후 임시 코드를 급조해 테스트를 수행했는데 대개는 간단한 드라이버 프로그램을 구현해 자신이 짠 프로그램을 수동으로 실행했다. 💻 TDD(Test Driven Development) ◽ 테스트 주도 개발 (실제 코드를 짜기 전에 단위 테스트부터 짜라) ◽ 애자일과 TDD 덕택에 단위 테스트를 자동화하는 프로그래머들이 이미 많아졌으며 점점 늘어나는 추세이다. 그러나 많은 프로그래머들이 제대로 된 테스트 케이스를 작성해야 한다는 좀 더 중요한 사실을 놓쳐버렸다. TDD 법칙 세 가지 첫 번째 법칙 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 두 번째 법칙 컴..
[CleanCode] 8장 경계 🔹 시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다. 오픈소스를 이용하거나, 사내 다른 팀이 제공하는 컴포넌트를 이용하거나, 어떤 식으로든 이 외부 코드를 우리 코드에 깔끔하게 통합해야 한다. 이 장에서는 소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴본다. 외부 코드 사용하기 패키지 제공자나 프레임워크 제공자는 적용성을 최대한 넓히려 애쓴다. 더 많은 환경에서 돌아가야 더 많은 고객이 구매하니까. 반면 사용자는 자신의 요구에 집중하는 인터페이스를 바란다. 이런 차이로 시스템 경계에 문제가 생길 소지가 많다. 💻 java.util.Map Map이 제공하는 기능과 유연성은 확실히 유연하지만 그만큼 위험성도 크다. 예 : Map의 clear() 메서드 Map의 사용자라면 누구나 Map..
[CleanCode] 7장 오류 처리 오류 코드와 깨끗한 코드 오류 처리는 중요하다. 하지만 오류 처리 코드로 인해 프로그램 논리를 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다. 이 장에서는 고상하게 오류를 처리하는 기법과 고려사항 몇 가지를 소개한다. 오류 코드보다 예외를 사용하라 이전에는 예외를 지원하지 않는 프로그래밍 언어가 많았다. 따라서 오류 클래스를 설정하거나 호출자에게 오류 코드를 반환하는 방법이 전부였다. ✔ 나쁜예시 DeviceController.java (오류코드 사용) public class DeviceController { ... public void sendShutdown(){ DeviceHandle handle = getHandle(DEV1); // 디바이스 상태를 점검한다. if (handle != Devic..
[CleanCode] 6장 객체와 자료 구조 자료 추상화 구현을 감추려면 추상화가 필요하다. 그저 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지는 않는다. 그보다는 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다. 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다. 자료/객체 비대칭 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료구조는 자료를 그대로 공개하며 별다른 함수를 제공하지 않는다. 자료 구조를 사용하는 절차적인 코드는 기본 자..
[CleanCode] 5장 형식 맞추기 형식을 맞추는 목적 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 코드 형식을 맞추기위한 간단한 규칙을 정의하고 그 규칙을 착실히 따라야 한다. 팀으로 일한다면 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야 한다. 필요하다면 규칙을 자동으로 적용하는 도구를 활용한다. 코드 형식은 중요하다! 그러나 융통성 없이 맹목적으로 따르면 안된다. 코드 형식은 의사소통의 일환이다. 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 굉장히 높다. 따라서 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미친다. 맨 처음 잡아놓은 구현 스타일과 가독성 수준은 유지보수 용이성과 확장성에 계속 영향을 미친다. 원래 코드는 사라지더라도 개발자의 스타일과 규율은 사라지지 않는다. 적절한 행 길이를..
[CleanCode] 4장 주석 브라이언 W. 커니헨, P.J. 플라우거 "나쁜 코드에 주석을 달지 마라. 새로 짜라." 잘 달린 주석은 그 어떤 정보보다 유용하다. 그러나 우리가 프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면 주석은 필요하지 않다.그러므로 주석이 필요하면 상황을 역전해 코드로 의도를 표현할 방법은 없는지 생각하자! 부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다. 부정확한 주석은 독자를 현혹하고 오도한다. 더 이상 지킬 필요가 없는 규칙이나 지켜서는 안 되는 규칙을 명시한다. 코드는 자신이 하는 일을 진실되게 말한다. 코드만이 정확한 정보를 제공하는 유일한 출처다. 그러므로 우리는 (간혹 필요할지라도) 주석을 가능한 줄이도록 꾸준히 노력해야 한다. 주석은 나쁜 코드를 보완하지 못한다 코드에 주석을 ..
[CleanCode] 3장 함수 작게 만들어라! HtmlUtil.java re-refactoring public static String renderPageWithSetupsAndTeardowns( PageData pageData, boolean isSuite) throws Exception { if (isTestPage(pageData)) includeSetupAndTeardownPages(pageData, isSuite); return pageData.getHtml(); } ) HtmlUtils를 리팩토링한 코드도 위와 같이 더 간결하게 만들 수 있다. 함수의 길이와 가로 글자 수 요즘은 한 화면에 글꼴을 조절하면 가로 150자 세로 100줄도 들어간다. 따라서 가로 150자를 넘어서는 안된다. (반드시 한 화면에 들어가야 한다.)..