이 수업을 고려하십시오 :
class ClassA{
private Thing[] things; // stores data
// stuff omitted
public Thing[] getThings(){
return things;
}
}
이 클래스는 데이터를 저장하는 데 사용하는 배열을 관심있는 클라이언트 코드에 노출합니다.
작업중 인 앱 에서이 작업을 수행했습니다. 나는 ChordProgression
일련의 Chord
s 를 저장하고 다른 것들을 하는 클래스를 가지고있었습니다 . Chord[] getChords()
코드 배열을 반환 하는 메서드가 있었습니다 . 데이터 구조가 배열에서 ArrayList로 변경되어야 할 때 모든 클라이언트 코드가 손상되었습니다.
이로 인해 다음과 같은 접근 방식이 더 좋습니다.
class ClassA{
private Thing[] things; // stores data
// stuff omitted
public Thing[] getThing(int index){
return things[index];
}
public int getDataSize(){
return things.length;
}
public void setThing(int index, Thing thing){
things[index] = thing;
}
}
데이터 구조 자체를 노출하는 대신, 데이터 구조에 제공되는 모든 오퍼레이션은 데이터 구조를 위임하는 공용 메소드를 사용하여이를 둘러싸는 클래스에 의해 직접 제공됩니다.
데이터 구조가 변경되면 이러한 메소드 만 변경하면되지만 변경 후에도 모든 클라이언트 코드가 계속 작동합니다.
배열보다 복잡한 컬렉션은 내부 데이터 구조에 액세스하기 위해 엔 클로징 클래스가 세 개 이상의 메서드를 구현해야 할 수도 있습니다.
이 접근법은 일반적입니까? 이거 어떻게 생각해? 다른 단점이 있습니까? 내부 데이터 구조에 위임하기 위해 엔 클로징 클래스가 최소한 세 개의 공개 메소드를 구현하도록하는 것이 합리적입니까?
get(index)
,add()
,size()
,remove(index)
,와remove(Object)
. 제안 된 기술을 사용하여이 ArrayList를 포함하는 클래스에는 내부 컬렉션에 위임하기위한 공용 메서드가 5 개 있어야합니다. 그리고 프로그램 에서이 클래스의 목적은이 ArrayList를 캡슐화하지 않고 다른 것을 수행하는 것입니다. ArrayList는 세부 사항입니다. [...]