본문 바로가기

책읽기

(31)
객체와 자료 구조 변수는 보통 private 형으로 정의한다. 캡슐화를 통해 외부에서 접근하지 못하게 한다. 의존성을 없애서 구현을 맘대로 변경하기 위해서다. 1. 자료 추상화 포인트 라는 자료구조를 나타내는 클래스가 있다. public class Point { public double x; public double y; } 이 클래스의 인스턴스 변수는 public 으로 선언되어 값에 직접 접근이 가능하다. 이는 클래스간의 의존성을 높이고 결합도를 높인다. 그래서 인스턴스 변수를 priavte으로 바꾸고 추상 인터페이스를 만들었다. public interface Point { double getX(); double getY(); void setCartesian(double x, double y); double getR()..
형식 맞추기 형식이 맞춰진 코드는 깔끔하고, 일관적이고, 꼼꼼하다고 느껴진다. 질서정연한 코드는 이해하기 좋고 편하게 읽을 수 있다. 오늘 작성한 코드는 내일 바뀔 확률이 매우 높다. 복잡하고 난잡한 코드를 짠다면 시간이 지날수록 거대해지고, 보기 힘들어 질 것이다. 하지만 코드스타일과 규율은 변하지 않는다. 형식을 맞추고 스타일을 맞추면 코드가 커져도 일정한 형태를 띄고, 편하게 읽을 수 있다. 1. 적절한 행 길이를 유지하라. fitensse는 테스트 자동화 도구로 총 라인이 5만줄인 큰 프로젝트이다. 하지만 이 프로젝트의 1/3의 파일당 평균 행 길이는 40 ~ 100줄이다. 가장 행이 많은 파일은 400줄이다. 아무리 큰 프로젝트라도 적은 줄로 구현이 가능하다. 1-1. 산문 기사처럼 작성하라. 좋은 기사는 ..
주석 주석은 거짓말을 한다. 프로그램이 변하고 진화함에 따라 프로그래머가 주석을 매번 유지. 보수하기는 불가능하다. 따라서 시간이 지날수록 주석은 거짓말을 하게 되고, 쓸모없어지고, 있으면 안되는 존재가 된다. 주석은 잘 작성된 코드로 대체할 수 있다. 코드로 모든 것을 표현하도록 연습해야 한다. 좋은 주석 1. 법적인 주석 법적인 정보, 예를 들어 저작권이나 소유권을 나타내는 정보는 글 머리에 주석으로 작성한다. 2. 정보를 제공하는 주석 기본적인 정보를 주석으로 제공하면 편리하다. 하지만 클래스를 이용하거나 함수, 변수명으로 정보를 제공하도록 노력해야 한다. 도저히 방법이 없다면 주석으로 정보를 제공한다. 3. 의도를 설명하는 주석 예를 들어, 에라토스테네스의 채 알고리즘을 구현할 때, 시간복잡도를 줄이기..
Clean한 함수 1. 작게 만들어라. 20줄도 길다. 하나의 함수는 5줄 이내면 충분하다. 2. 한 가지 일 만 하게하라. 함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다. 하나의 함수 안에서 추상화 수준이 하나인 단계만 수행한다면, 그 함수는 하나의 일만 한다. >> 하나의 함수 안에서는 동일한 추상화 수준을 유지한다. 기존의 코드에서 의미있는 이름으로 새로운 함수를 추출할 수 있다면, 그 함수는 하나의 일만 하고 있는 것이 아니다. 3. 함수당 추상화 수준은 하나로. 추상화 수준이 높은 것 : 함수가 포함하는 기능, 그 함수의 뒤에서 일어나는 일이 많다는 것. ex) getHtml() 추상화 수준이 낮은 것 : 그 함수 하나로 작은 기능 하나가 실행되는 것 ex) .append..
의미있는 이름 짓기 1. 의도를 분명히 밝혀라. 좋은 이름으로 절약하는 시간 > 좋은 이름을 위해 고민하는 시간 존재 이유, 수행기능, 사용방법들을 알기 위한 주석이 필요하다면 이름으로 의도를 충분히 드러내지 못한 것이다. 2. 그릇된 정보를 피하라. 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안됨. (ex. hp = 유닉스 운영체제의 종류. 직각삼각형의 빗변(hypotenuse)를 hp라고 표현하면 그릇된 정보를 전달할 가능성이 있다.) List 자료형을 사용하지 않는다면, accountList처럼 이름에 List를 사용하면 안된다. 단순히 accounts면 충분. (List 자료형도 List를 붙이는 것은 좋지 않다.) 유사한 개념은 일관성있는 유사한 표기법을 사용한다. 어디는 addNumber(),..
클린 코드란 로버트 C 마틴의 클린코드 책 발췌 1. 우아한 코드 : 보기에 즐거운 코드 (가독성이 좋은 코드) 2. 효율적인 코드(속도, CPU, RAM) 3. 세세한 부분까지 철저한 오류처리가 된 코드 4. 한가지를 잘 하는 코드 5. 다른 사람이 고치기 쉬운 코드 6. 의미있는 이름이 있는 코드 7. 의존성이 최소인 코드 8. 모든 테스트(단위테스트, 인수테스트)를 통과 9. 중복이 없는 코드 - 추상 메서드 - 추상 클래스 10. 시스템 내 모든 설계 아이디어를 표현한다. - 의미있는 이름 같이 - 메서드 추출 리펙토링 - 기능을 기술하는 메소드 하나 + 기능을 수행하는 메서드 여러개 로 메서드를 나누는 리펙토링 11. 코드를 읽으면서 다음 내용이 짐작이 되고, 짐작한 내용이 읽히는 코드 보이스카우트 규칙 >..
TDD_9 14장 바꾸기. $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 $5 + $5에서 Money반환하기 //해결//Bank.reduce(Money) //수행예정//Money에 대한 통화 변환을 수행하는 Reduce Reduce(Bank, String) 이젠 달러 뿐만아니라 프랑을 달러로 바꾸는 과정을 진행한다. 은행에 환율을 지정하고, 프랑을 달러로 변환하고 알맞게 환전되었는지 확인하면 되겠다. 우리는 2프랑을 1달러로 바꿀 수 있는 2:1비율로 환율을 설정할 것이다. 컴파일 에러를 잡기위해 Bank에 addRate() 추가하고 테스트를 완료시키기 위해현재 bank의 reduce가 Money를 부르고 있으므로 Money의 reduce를 수정해본다. 음.. 테스트는 초록막대를..
TDD_8 13장 진짜로 만들기 $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 지금까지 $5 + $5 = $10을 해결하고 있었다. 하지만 코드에 중복이 있기에 완료표시를 할 수 없다. 현재 Bank클래스로 만든 bank인스턴스의 메소드 reduce는 amount가 10인 Money형 객체를 반환하고 있다. 이와 테스트코드의 five.plus(five)는 중복코드라고 볼 수 있다. reduce메소드에서 적절한 Money객체를 반환하도록 해야 한다. $5 + 10CHF = $10 (1:2의 환율일 경우) $5 + $5 = $10 $5 + $5에서 Money반환하기 우리의 코드를 잘 보면 plus메소드는 Money객체를 생성시켜서 Expression형으로 반환한다. 따라서 plus는 ..