\ # 소프트웨어 구조 \ # Abstraction function and representation invariant (자바 추상 데이터 형식 과 인용 불 변수)

추상 적 인 데이터 형: 데이터 구조 에서 수학 모델 과 이 수학 모델 을 정의 하 는 조작 을 말 하지만 자바 에서 추상 적 인 데이터 형 은 abstract 로 정의 하 는 함수 방법 을 말 합 니 다. 그러면 함수 체 가 없 는 방법 을 정의 하 는 것 은 어떤 역할 을 합 니까?
    여기 서 우 리 는 먼저 다른 개념 인 인터페이스 를 도입 한다.
    인 터 페 이 스 는 순수한 추상 류 라 고 할 수 있다. 여기 서 하 공 대 왕 충 걸 교수 가 인터페이스 에 대한 이 해 를 인용 했다.
인터페이스 = = = 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;
    }
}

좋은 웹페이지 즐겨찾기