このクラスを考慮してください:
class ClassA{
private Thing[] things; // stores data
// stuff omitted
public Thing[] getThings(){
return things;
}
}
このクラスは、データを保存するために使用する配列を、関心のあるクライアントコードに公開します。
作業中のアプリでこれを行いました。sのChordProgression
シーケンスを格納するクラスがありましたChord
(その他の処理も行います)。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;
}
}
データ構造自体を公開する代わりに、データ構造によって提供されるすべての操作は、データ構造に委任するパブリックメソッドを使用して、データ構造を囲むクラスによって直接提供されるようになりました。
データ構造が変更された場合、これらのメソッドのみを変更する必要がありますが、変更後もすべてのクライアントコードは機能します。
配列よりも複雑なコレクションでは、内部データ構造にアクセスするためだけに3つ以上のメソッドを実装するために、囲むクラスが必要になる場合があることに注意してください。
このアプローチは一般的ですか?これについてどう思いますか?他にどんな欠点がありますか?内部データ構造に委任するために、少なくとも3つのパブリックメソッドを実装クラスで実装することは合理的ですか?
get(index)
、add()
、size()
、remove(index)
、とremove(Object)
。提案された手法を使用して、このArrayListを含むクラスには、内部コレクションに委任するために5つのパブリックメソッドが必要です。プログラムでのこのクラスの目的は、このArrayListをカプセル化することではなく、何か他のことを行うことです。ArrayListは単なる詳細です。[...]