목록클린코드 (9)
혼자 정리
10장 클래스 클래스 구성 자바 컨벤션을 따르는 클래스 구성 순서는 대략 다음과 같다. public static 상수 private static 변수 private instance 변수 public 인스턴스 변수가 필요한 경우는 거의 없다. 공개 함수 비공개 함수는 그 다음에 이런 식의 구성은 앞 장에서 다룬 stepdown rule을 잘 따르기 때문에 신문 기사를 읽는 것처럼 프로그램을 읽을 수 있게 해준다. (stepdown rule : 위에서부터 읽어 내려갈 때 추상화 단계가 한 단계씩 순차적으로 내려가는 것) Encapsulation 캡슐화를 위해 변수나 메서드를 private으로 유지하는 것이 좋긴 하지만 그것이 절대적인 것은 아니다. 테스트를 위해 변수나 함수에 접근해야될 때가 있는데 그 때는..
9장 단위 테스트(Unit Test) The Three Laws of TDD 실패하는 유닛 테스트를 쓰기 전까지는 프로덕션 코드를 쓰지 않는다. 실패하는 유닛 테스트를 한 번에 하나 이상 작성하지 않는다. 현재 실패하는 유닛 테스트를 통과하기에 충분한 정도를 넘어서는 프로덕션 코드를 작성하지 않는다. Keeping Tests Clean 빠른 테스트를 위해 보통은 테스트 코드를 클린 코드로 짤 생각을 하지 않는다. 하지만 dirty tests는 없는 것보다 나을 것이 없다. 테스트를 지금만 할 것이 아니기 때문이다. 프로덕션 코드도 지속적으로 수정이 될 것이고 그 때마다 더러운 테스트 코드를 고치는데 걸리는 시간은 계속 늘어나게 된다. 그렇다고 테스트를 하지 않으면 프로덕션 코드 일부분의 수정으로 시스템이..
7장 오류 처리 오류 처리는 중요하지만 오류 처리 코드 때문에 프로그램의 논리를 파악하기 어려워지는 것이 좋지 못하다. 7장에서는 이를 방지하는 기법들을 살펴 본다. 오류 코드보다 예외를 사용하라 예외 던지는 것을 지원하지 않던 프로그래밍 언어에서는 다음처럼 오류 코드를 통해 오류를 처리해야 했다. public class DeviceController { ... public void sendShutDown() { DeviceHandle handle = getHandle(DEV1); // Check the state of the device if (handle != DeviceHandle.INVALID) { // Save the device status to the record field retrieveD..
이번 단원에서는 지속적으로 객체(object)와 자료구조(data structure)를 언급한다. 이는 단순히 클래스와 구조체를 구분하는 문제가 아니다(둘 다 클래스를 사용해서 표현할 수 있다) 객체는 추상화 뒤로 자료를 숨기고 자료를 다루는 함수만 제공한다. 반면, 자료구조는 자료를 그대로 오픈하여 별다른 함수를 제공하지 않는다. 자료 추상화 2차원 점을 표현하는 예시 두 가지를 통해 자료 구조와 객체를 구분해보자. public class Point { public double x; public double y; } 첫번째 예시는 자료 구조를 그대로 드러낸다. 따라서 사용자가 내부가 어떻게 생겼는지 알고 있어야 제대로 사용할 수 있다. 위 코드에서 public접근자를 private으로 바꾸고 gette..
코드 형식을 맞추기 위해 규칙을 정하고 규칙을 잘 따르자. 팀으로 일한다면 팀이 합의해 규칙을 정하고 모두 그 규칙을 따르자 왜 형식을 맞추는지? 의사소통을 원활하게 하기 위해 내가 짠 코드를 나중에 누군가 보고 유지보수, 확장하기 위해서는 가독성이 좋아야 한다. → 가독성 좋은 형식 처음 구현할 때 잡은 형식은 추후에도 크게 바뀌지 않으니 처음 형식을 잡는 것이 중요 원활한 소통을 장려하는 코드 형식에 대해 보자 세로 형식 맞추기(Vertical Formatting) (자바 기준으로) JUnit, FitNesse, Time and Money등의 프로젝트에서 500줄을 넘기는 파일이 없고 대다수가 200줄 미만. 모든 프로젝트가 그런 건 아니지만 대개의 프로젝트는 500줄을 넘기지 않고 대부분 200줄 ..
4장 주석 주석은 '필요악'이다 주석을 유지 보수하는 것은 쉽지 않으니 오래될수록 코드와 동떨어지게 된다 → 없는 것보다 못하게 될 수 있음 가능하다면 코드에 제대로 된 정보를 담아서 해결하자 주석은 나쁜 코드를 보완하지 못한다 나쁜 코드를 주석을 통해 보완하는 것보다 코드를 정돈하는 것이 더 효율적이다. 코드로 의도를 표현하라! 물론 확실히 코드만으로 의도를 설명하기 어려운 경우도 있다. 그래서 많은 개발자들이 자신의 코드도 그런 경우라고 생각하는데 잘 생각해보면 해결책이 있는 경우가 더 많으니 코드로 해결해보자. ex) // 직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) if (employ..
FitNesse에서 길고, 중복이 많고, 이상한 문자열과 낯설고 모호한 자료 유형, API가 많은 코드를 부정적인 예시로 보여줌 (3-1) public static String testableHtml( PageData pageData, boolean includeSuiteSetup ) throws Exception { WikiPage wikiPage = pageData.getWikiPage(); StringBuffer buffer = new StringBuffer(); if (pageData.hasAttribute("Test")) { if (includeSuiteSetup) { WikiPage suiteSetup = PageCrawlerImpl.getInheritedPage( SuiteResponder...
2장 의미 있는 이름 의도를 분명히 밝혀라 변수(혹은 함수나 클래스)의 존재 이ㅠ는? 수행 기능은? 사용 방법은? 이러한 질문들에 따로 주석이 필요치 않게 이름을 지어야 한다. ex1) int d; // 경과 시간(단위: 날짜) 대신 다음과 같이 쓰는 것이 조금 더 명확하다.int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays; ex2) public List getThem() { List list1 = new ArrayList(); for (int[] x : theList) if (x[0] == 4) list1.add(x); return list1; } 위의 코드는 독자가 다음 정보를 안다고 가정..
1장 깨끗한 코드 코드는 사라지지 않는다 시간이 갈수록 프로그래밍 언어에서 추상화 수준은 점차 높아질 것으로 예상. ex) DSL(Domain Specific Language) : 도메인 특화 언어로 특정 문제를 해결하기 위해 만든 프로그래밍 언어나 명세 언어 But, 기계에게 요구사항을 이해시키려면 어느 수준에서는 하나하나 상세한 요구사항을 알려줘야 한다. → 코드는 요구사항을 표현하는 언어, 기계를 원하는 목적으로 작동하게 하려면 어느 순간에는 상세한 요구사항(명확한 코드)이 필요 나쁜 코드 당장 돌아가는 코드를 짜는 것에 급급하면 나중에 프로그램 유지/보수에 분명 큰 어려움을 만들게 된다. "지금은 일단 돌아가게 하고 나중에 고치자.." → 지금 짠 코드를 나중에 고칠 시간은 오지 않는다. 코드를 ..