클린코드

    [클린 코드] 오류 처리(1)

    오류 코드보다 예외를 사용 아래 코드는 오류 플래그를 설정하거나 호출자에게 오류 코드를 반환하는 방법으로 작성되어 있다. public class DeviceController{ ... public void sendShutDown(){ DeviceHandle handle = getHandle(DEV1); //디바이스 상태 점검 if(handle != DeviceHandle.INVALID){ //레코드 필드에 디바이스 상태 저장 retrieveDeviceRecord(handle); //디바이스가 일시정지 상태가 아니라면 종료 if(record.getStatus() != DEVICE_SUSPENDED){ pauseDevice(handle); clearDeviceWorkQueue(handle); closeDev..

    [클린 코드] 객체와 자료구조(4)

    자료 전달 객체 자료 구조체의 기본적인 형태는 공개 변수만 있고 함수가 없는 클래스이다. 이런 자료 구조체를 자료 전달 객체(DTO, Data Transfer Object)라 한다 DTO는 데이터베이스에 저장된 가공되지 않은 정보를 어플리케이션 코드에서 사용할 객체로 변환되는 단계에서 가장 처음 사용된다. 좀 더 일반적인 형태는 '빈(bean)'구조이다. 아래 코드를 보면 private 변수를 조회/설정 함수로 조작한다. 이는 사이비 캡슐화로 별다른 의미없는 행동이다. public class Address{ private String street; private String city; public Address(String strret, String city){ this.street = street; t..

    [클린 코드] 객체와 자료구조(3)

    디미터 법칙 디미터 법칙은 모듈은 자신이 조작하는 객체의 속내용을 몰라야 한다는 법칙이다. 앞의 포스팅에서 봤듯이, 객체는 자료를 숨기고 함수를 공개한다. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안 된다는 의미이다. 좀 더 정확히 표현하면 디미터 법칙은 클래스 C의 메소드메서드 f는 다음과 같은 객체의 메소드만 호출해야 한다. 다음 코드는 디미터 법칙을 어기는 듯이 보인다. getOptions() 함수가 반환하는 객체의 getScratchDir() 함수를 호출한 후 getScratchDir() 함수가 반환하는 객체의 getAbsolutePath() 함수를 호출하기 때문이다. final String outputDir = ctxt.getOptions().getScratchDir().getAbsolut..

    [클린 코드] 객체와 자료구조(2)

    자료/객체 비대칭 객체는 추상화 후로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다. 위 두 정의는 본질적으로 상반된다. 사소한 차이일지라도 그 차이가 미치는 영향은 매우 크다. 아래 코드를 보면 Geometry 클래스는 세 가지 도형 클래스를 다룬다. 각 도형 클래스가 간단한 자료구조이고, 아무런 메소드도 제공하지 않는다. 다만 도형이 동작하는 방식은 Geometry 클래스에서 정의한다. public class Square{ public Point topLeft; public double side; } public class Rectangle{ public Point topLeft; public double height; public ..

    [클린 코드] 객체와 자료구조(1)

    자료 추상화 아래 두 클래스는 모두 2차원 점을 표현한다. 차이점은 한 클래스는 구현을 외부로 노출하고 다른 클래스는 구현을 완전히 숨겼다. //6-1) 구체적인 Point 클래스 public class Point{ public double x; public double y; } //6-2) 추상적인 Point 클래스 public interface Point{ double getX(); double getY(); void setCartesian(double x, double y); double getR(); double getTheta(); void setPolar(double r, double theta); } 6-2 코드는 어떤 좌표계를 사용하는지 알 길이 없지만 인터페이스는 자료 구조를 명백하게 표..

    [클린 코드] 형식 맞추기(2)

    수직거리 서로 밀접한 개념은 세로로 가까이 두어야 한다. 같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리로 연관성을 표현한다. 여기서 말하는 연관성이란 한 개념을 이해하는데 다른 개념이 더 중요한 정도이다. 연관성이 깊은 두 개념이 멀리 떨어져 있으면 코드를 읽는 사람이 소스 파일과 클래스를 여기저기 뒤지게 된다. 변수 선언 변수는 사용하는 위치에 최대한 가까이 위치해야 한다 만들어낸 함수가 매우 짧을경우 지역 변수는 각 함수 맨 처음에 선언하는 것도 하나의 방법이겠다. 아래 코드는 JUnit 4.3.1에서 가져온 다소 긴 함수이다. private static void readPreferences(){ InputStream is = null; try{ is = new FileInputStream(g..