프로 그래 밍 기본기 (4)

3262 단어 프로 그래 밍
프로 그래 밍 기본기 (4)
데이터 구조 와 대상
데이터 구조
OO 세계 에서 데이터 구 조 는 능력 이 없 는 순수한 실 체 를 의미 하 는데 이런 상황 은 매우 드물다 (순수한 데이터 구조의 집적 을 의미 하기 때문이다).
예:
public struct Point {
public double X {get; set;}
public double Y {get; set;}
private double x;
private double y;
}

1. 우 리 는 그것 으로 점 을 저장 할 수 있다. 이 점 은 모든 모양 의 일부분 일 수 있다.
2. 그 어떠한 능력 도 갖 추 지 못 하고 데이터 에 대한 통합 일 뿐이다.
3. 장점: 수정 행 위 는 쉽다. 여기 서 데 이 터 를 대표 하기 때문에 여러 곳 에서 인용 해도 영향 을 주지 않 는 다.단점: 데이터 구 조 를 수정 하 는 것 이 어렵 고 여러 곳 에서 인용 하면 많은 부분 에 영향 을 줄 수 있다.
대상
대상 은 인터페이스 와 밀접 한 관 계 를 가진다. 상례 에 대응 하 는 인터페이스 예시:
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}

1. 데이터 가 봉인 되 었 습 니 다.
2. 일부 대상 의 능력 을 노출 하여 사용 할 수 있 으 나 패 키 징 기반
3. 장점: 데이터 구조 가 봉인 되 어 있 기 때문에 데이터 구 조 를 수정 하 는 것 이 쉽다.인 터 페 이 스 는 대상 능력 (행위) 목록 으로 원가 가 비교적 크다 (open - close 원칙, 보통 인터페이스 만 증가).
결론:
프로 세 스 디자인 으로 인해 function 을 수정 할 때 데이터 구조 (순수 실체 류) 를 수정 하지 않 아 도 됩 니 다.OO 디자인 은 기 존의 function 을 수정 하지 않 고 클래스 를 추가 하 는 방식 으로 기능 을 확장 할 수 있 습 니 다.
프로 세 스 디자인 은 데이터 구 조 를 수정 하 는 것 이 매우 어렵다. 왜냐하면 모든 인용 부분 이 고 쳐 야 하기 때문이다.OO 디자인 은 인 터 페 이 스 를 바 꾸 는 것 이 매우 번 거 롭 습 니 다. 모든 관련 유형 이 바 뀌 어야 하기 때 문 입 니 다. (따라서 경 량 인 터 페 이 스 를 일찍 고려 하고 개발 과정 은 인터페이스 만 증가 합 니 다)
지루 한 호출 을 피하 다.
다음 줄 코드 를 보십시오.
string outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

분명히 재 구성 하면:
string outputDir = GetAbsolutePath();
 
private string GetAbsolutePath(){
return ctxt.getOptions().getScratchDir().getAbsolutePath();
}

코드 의 의도 가 뚜렷 하고 호출 자 도 매우 편리 하 다.
Return ErrorCode 대신 예외 던 지기 사용 하기
1. ErrorCode 는 전체적인 level 로 정의 가 매우 전면적 이지 않 으 면 수정 하면 전체 국면 에 영향 을 주 고 이상 류 를 추가 하 는 것 이 비교적 쉽다.
2. 중복 정의 가 나타 나 기 쉽다
3. 이상 은 wrapper 를 사용 하여 오류 처리 와 business 간 의 결합 을 접 할 수 있 지만 errorcode 를 사용 하면 결합 을 풀 수 없습니다.
Wrapper Exception
이 코드 보기:
try {
port.open();
} catch(DeviceResponseException e) {
reportPortError(e);
logger.log("Deviceresponse exception", e);
} catch(ATM1212UnlockedException e) {
reportPortError(e);
logger.log("Unlockexception", e);
} catch (GMXErrore) {
reportPortError(e);
logger.log("Deviceresponse exception");
}

만약 여러 곳 에서 port. open 함 수 를 호출 해 야 한다 면, 곳곳에 이런 catch chain 이 있다.해결 방법 은 port 를 wrap 하고 catch chain 을 wrap 하 는 것 입 니 다.
public class LocalPort {
private ACMEPort innerPort;
public LocalPort(int portNumber) {
innerPort =new ACMEPort(portNumber);
}
 
public void open() {
try {
innerPort.open();
} catch(DeviceResponseException e) {
throw new PortDeviceFailure(e);
} catch(ATM1212UnlockedException e) {
throw new PortDeviceFailure(e);
} catch(GMXError e) {
109 Definethe Normal Flow
throw new PortDeviceFailure(e);
}
}
…
}

이렇게 하면 호출 된 코드 의 의 도 를 매우 명확 하 게 할 수 있다.
try {
port.open();
} catch(PortDeviceFailure e) {
reportError(e);
logger.log(e.getMessage(),e);
}

Wrapper 는 사실 Adapter 모드 의 응용 중 하나 로 이상 을 제외 하고 제3자 library 와 다른 API 호출 을 wrap 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기