객체와 자료 구조

문지은·2021년 10월 4일
0

clean code

목록 보기
6/10

우리는 남들이 변수에 의존하지 않게 만들고 싶기 때문에 변수를 비공개로 정의한다. 하지만 프로그래머들은 getter, setter를 이용해서 변수를 공개하곤 한다.

자료 추상화

자료를 세세하게 공개하기 보단 추상적인 개념으로 표현하는 것이 낫다.

// 직교 좌표계라는 것 드러남
public class Point {
    public double x;
    public double y;
}

// 직교 좌표계인지 알 수 없음
// 접근 정책을 강제
public interface Point {
    double getX();
    double getY();
    void setCartesian(double x, double y);
    .
    .
    .
}

getter, setter는 구현을 외부로 노출하게 한다. 구현을 감추기 위해서 추상 인터페이스를 이용해야 한다.

// 구체적 숫자값 반환
public interface Vehicle {
    double getFuelTankCapactiryInGallons();
    double getFallonsOfGasoline();
}

// 백분율이라는 추상적인 개념 사용
public interface Vehicle {
    double getPercentFuelRemainig();
}

자료/객체 비대칭

객체 : 자료를 숨기고 자료를 다루는 함수만 공개
자료 : 자료를 그대로 공개

// 절차 지향
public double area(Object shape) throws NoSuchShapeException
{
	if (shape instanceof Square) {
    		// 정사각형 넓이 구하는 코드
    	}
    	else if (shape instanceof Rectangle) {
        	// 직사각형 넓이 구하는 코드
        }
        else if (shape instanceof Circle) {
        	// 원 넓이 구하는 코드
        }
}

// 객체 지향
public class Square implements Shape {
    private Point topLeft;
    private double side;
    
    public double area() {
    	// 정사각형 넓이 구하는 코드
    }
}

절차적인 코드 : 자료 구조 변경 어렵. 새 함수 추가 쉬움.
객체지향 코드 : 새 함수 추가 어렵. 자료 구조 변경 쉬움.

디미터 법칙

: 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다.

클래스 C의 메서드 f가 호출할 수 있는 메서드의 범위 :

  • 클래스 C
  • f가 생성한 객체
  • f 인수로 넘어온 객체
  • C 인스턴스 변수에 저장된 객체
// 디미터 법칙 어김
ctxt.getOptions().getScratchDir().getAbsolutePath();

// ctxt가 자료구조라면 변수 바로 호출
ctxt.options.scratchDir.absolutePath;

// ctxt가 너무 많은 정보를 알고 있음
ctst.getAbsolutePathOfScratchDirectoryOption();

// 객체는 정보 제공보다 뭔가를 해야 함
ctxt.createScratchFileStream(classFileName);

자료 전달 객체 : DTO

활성 레코드는 DTO의 특수한 형태
DTO에 save, find 등의 비즈니스 규칙 메서드를 추가
이를 자료 구조로 취급하면 안된다!
-> 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체를 따로 선언해야 한다.

profile
백엔드 개발자입니다.

0개의 댓글