\ # 소프트웨어 구조 \ # Abstraction function and representation invariant (자바 추상 데이터 형식 과 인용 불 변수)
여기 서 우 리 는 먼저 다른 개념 인 인터페이스 를 도입 한다.
인 터 페 이 스 는 순수한 추상 류 라 고 할 수 있다. 여기 서 하 공 대 왕 충 걸 교수 가 인터페이스 에 대한 이 해 를 인용 했다.
인터페이스 = = = CSP 인증서, 회계사 증서, 변호사 증서
전 세계 모든 사람
장 삼 이 'CSP 인증서' 를 갖 고 있다 는 것 은 장 삼 이 CSP 인증서 가 요구 하 는 모든 능력 을 갖 추고 실현 했다 는 것 을 의미한다. = = =클래스 구현 인터페이스
장삼 이 또 '변호사 증' 을 가지 게 되 었 다 는 것 은 장삼 이 프로 그래 밍 도 할 줄 알 고 소송 도 할 줄 안다 는 것 을 의미한다.클래스 는 여러 개의 인 터 페 이 스 를 실현 하고 기능 그룹 을 실현 할 수 있다.
모 기업 (i. e. 클 라 이언 트) 은 회계 사 를 모집 해 야 한다. 회계 증 서 를 가 진 사람 을 찾 으 면 된다. 한 사람 이 모든 사람의 '회계 능력' 을 조사 하지 않 아 도 된다.(e.g. List a = new ArrayList(); List b = new LinkedList(); a 와 b 는 모두 '회계 증' 이 있 지만 회계 능력 의 실현 방식 이 다르다)
기업 에 있어 서 는 어떤 사람 이 '회계사' 의 각종 능력 을 구체 적 으로 어떻게 실현 하 는 지 에 대해 서 는 신경 쓰 지 않 기 때문이다. 그 는 이 사람 이 '회계사 증' 이 있 으 면 OK 하 는 것 에 만 신경 을 쓴다.
상상 하기 어렵 지 않다. 인 터 페 이 스 는 특정한 방법의 중요성 을 위해 존재 하지만 인 터 페 이 스 는 추상 적 인 방법 만 허용 하고 방법 을 실현 하지 않 는 다. 그러면 재 작성 하지 않 아 도 되 는 방법 이 여러 번 재 작성 되 어 코드 의 재 활용 (don 't write it again (DRY) 을 초래 할 수 있 고 abstract 류 에 서 는 이러한 상황 을 피 할 수 있 지만 상대 적 으로 어느 정도 위험 을 초래 할 수 있다.상황 에 따라 선택 하 세 요.
인용 불 변수: 여기 서 불 변 수 는 클래스 안의 외부 에서 수정 되 고 싶 지 않 은 값 을 말 합 니 다.다음은 밤 을 하나 들 어 보 겠 습 니 다.
public List getElts() { return elts; }
CharSet s = new CharSet();
s.getElts().add(a); // elts private ,
위의 이런 상황 을 rep exposure 라 고 하 는데, 우 리 는 어떤 방법 으로 이런 상황 의 발생 을 방지 할 수 있 습 니까?아래 에 밤 몇 개 들 어 주세요.
1. 변 하지 않 는 원소 되 돌리 기
Character choose()
{ return elts.elementAt(0); }
Character is immutable.
2. 방어 식 복사 (메모리 낭비)
List getElts()
{ return new ArrayList(elts); // or: return (ArrayList) elts.clone(); }
Mutating a copy doesn’t affect the original.
Don’t forget to make a copy on the way in!
3. 수정 할 수 없 는 복사 하기 (메모 리 를 낭비 하지 않 음)
List getElts()
{ return Collections.unmodifiableList(elts); }
Client cannot mutate Still need to make a copy on the way in
그렇다면 실전 에서 rep 가 유출 되 었 는 지 확인 하 는 방법 은 다음 과 같다.
법칙: 입구 와 출구 에서 변 수 를 바 꾸 었 는 지 확인 하면 우리 Debug 에 유리 합 니 다.
public void delete(Character c) {
checkRep();
elts.remove(c)
checkRep();
}
private void checkRep() {
for (int i = 0; i < elts.size(); i++) {
assert elts.indexOf(elts.elementAt(i)) == i;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 인터페이스의 계승1) 인터페이스 에는 추상 적 인 방법 과 상수 만 포함 할 수 있 고 이미 제 공 된 방법 은 포함 되 지 않 으 며 추상 류 는 일반 방법 2) 인 터 페 이 스 는 정적 방법 을 정의 할 수 없다. 추상 류 는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.