2015년 4월 21일 화요일

[Clean Code] Chapter06-09


Clean Code ch.06 ~ 09

Chapter.06 객체와 자료구조

  • 변수를 private 선언을 하더라도 각 값마다 get,set 함수를 제공한다면 구현을 외부로 노출하는 셈이다. 변수 사이에 함수라는 계층을 넣는다고 구현이 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다. 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정의 의미의 클래스다.

    구체적인 Vehicle 클래스

      public interface Vehicle{
          double getFeulTankCapacityInGallons();
          double getGallonsOfGasoline();
      }
    

    추상적인 Vehicle 클래스

      public interface Vehicle{
          double getPercentFuelRemaining();
      }
    
  • 객체와 자료구조

    • 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개
    • 자료구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.

      객체 지향적인 도형 클래스

      public class Squae implements Shape{
        private Point topLeft;
        private double side;
      
        public double area(){
        return side*side;
        }
      }
      
      public class Rectangle implements Shape{
        private Point topLeft;
        private double height;
        private double width;
      
        public double area(){
        return height*width;
        }
      }
      
    • 자료구조를 사용하는 절차적인 코드는 기존 자료구조를 변경하지 않으면서 새 함수를 추가 하기 쉽지만 새로운 자료구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다.
    • 객체지향코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다. 새로운 함수를 추가하기 어렵다. 그러면 모든 클래스를 고쳐야 한다.
  • 디미터 법칙

    • 한 객체가 다른 객체의 구조를 알지 못하도록 한다.
    • 객체의 모든 메소드는 다음에 해당하는 메소드만 호출 할 수 있다
      • 객체 자신의 메소드
      • 메소드의 매개변수로 넘어온 인자의 메소드
      • 메소드 내부에서 생성 된 객체의 메소드
      • 메소드가 포함하고 있는 객체의 메소드
  • 자료전달 객체

    • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다. 이런 자료 구조체를 때로는 자로 전달 객체 Data Transfer Object라 한다.
  • 객체는 동작을 공개하고 자료를 숨긴다. 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다.
  • 자료구조는 별다른 동작 없이 자료를 노출한다. 그래서 새 동작을 추가하기는 쉬우나 기존 함수에 새 자료구조를 추가하기는 어렵다.

Q.객체와 자료구조?
여기서 말하는 자료구조는 C언어에서의 자료구조.
Q.디미터법칙 : 디미터 버칙에서 허용된 메서드가 반환하는 객체의 메서드는 호출하면 안된다?
최근에는 라이브러리 정리가 잘 처리됨에 따라서 괜찮음..


Chapter 07. 오류처리

  • 오류 코드보다 예외(try-catch)를 사용
  • 미확인 예외를 사용

    • 확인된 예외는 OCP open closed principle 원칙을 위반. (OCP: 소프트웨어 개발 작업에 이용된 많은 모듈 중에 하나에 수정을 가할 때 그 모듈을 이용하는 다른 모듈을 줄줄이 고쳐야 한다면, 이와 같은 프로그램은 수정하기가 어렵다. 개방-폐쇄 원칙은 시스템의 구조를 올바르게 재조직(리팩토링)하여 나중에 이와 같은 유형의 변경이 더 이상의 수정을 유발하지 않도록 하는 것이다. 개방-폐쇄 원칙이 잘 적용되면, 기능을 추가하거나 변경해야 할 때 이미 제대로 동작하고 있던 원래 코드를 변경하지 않아도, 기존의 코드에 새로운 코드를 추가함으로써 기능의 추가나 변경이 가능하다.)
  • 예외에 의미를 제공

    • 오류메시지에 정보를 담에 예외와 함께 던진다. 실패한 연산 이름과 실패 유형 언급
  • 호출자를 고려해 예외 클래스를 정의

    • 호출하는 라이브러리 API를 감싸면서 예외 유형 하나를 반환.
  • null 반환 하지 마라

    • null을 반환하고 싶다면 그 대신 예외를 던지거나, 특수 사례 객체를 반환한다. 사용하려믄 외부 API가 null을 반환한다면 감싸기 메서드를 구현해 예외르 던지거나 특수 사례 객체를 반환하는 방식을 고려

감싸기메서드?


Chapter 08. 경계

외부 코드를 우리코드에 깔끔하게 통합해야한다. 이 장에서는 소프트웨어의 경계를 깔끔하게 처리하는 기법.

  • 외부라이브러리를 사용하려면 문서를 읽으며 사용법을 결정한다.
  • 외부라이블러리를 테스트한다.
  • 경계에 위치하는 코드는 깔끔히 분리한다. 통제가 불가능한 외부 패키지에 의존하는 대신 통제가 가능한 우리 코드에 의존하는편이 좋다.
  • 외부패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자. 새로운 클래스로 경계를 감싸거나 아니면 ADAPTER패턴을 사용해 우리가 원하느 인터페이스를 패키지가 제공하는 인터페이스로 변환하자.

Chapter 09. 단위테스트

  • TDD의 세가지 법칙

    • 실패하는 단위 테스트를 작성할때까지 실제 코드를 작성하지 않는다
    • 컴파일은 실패하지 않으면서 실행이 실패하는 정도만 단위테스트 작성한다
    • 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
  • 테스트는 FIRST

    • Fast
    • Independent
    • Repeatable
    • Self-Validating
    • Timely
  • Test 당 assert 하나

출저 클린코드. by밥아저씨

댓글 없음:

댓글 쓰기