一般的な考え方は可能な限り隠れているため、変更が容易です。たとえば、インデックス作成が必要な場合(List.get(int index))、コレクションは.get(index)をサポートしていないため、リストでなければなりません。インデックスを作成する必要がない場合は、リストを使用しているという事実を隠す
たとえば、おそらく1ヵ月後にリストの代わりにセットを使用したいと思いますが、Setは.get(index)をサポートしていません。このリストを使用する人は、リストのインデックス機能を使用する可能性があり、他の誰かが.get()を使用した場所が破損するため、セットに切り替えるのが難しくなります。
一方、タイプを過度に隠すと、メソッドのコンシューマが型を知らなかったため、偶然のパフォーマンスの問題を引き起こす可能性があります。 atは実際にはリンクされたリストです(インデックスはO(n)です)。このリストのコンシューマが別のリストの各エントリを参照するとします。これは、実際に遅いO(n * m)のパフォーマンスになります。最初にリンクリストであることを宣伝した場合、リンクリストの消費者は、このリストに複数のインデックスを作成し、消費者がローカルコピーを作成することはおそらく良い考えではないことを認識します。
ライブラリのコード(あなたが設計しているものを想定)
public class Util {
public static List<String> makeData() {
return new LinkedList(Arrays.asList("dogs", "cats", "zebras", "deer"));
}
}
発信者のコード(ライブラリまたはメソッドを使用しています1を想定)
public static void main(String [] args) {
List<String> data = Util.makeData();
int [] indicesToLookUp = {1,4,2,3,0};
for(int idx : indicesToLookUp) {
if(idx < data.size()) {
// each index (LinkedList.get()) is slow O(N)
doSomethingWithEntry(idx, list.get(idx));
}
}
}
あなたはそれがあるため、呼び出し側のせいだと主張できました彼は誤ってリストがArrayList <>であると仮定し、リストのローカルコピーを作成しておく必要がありました。
これはとても良い答えすることができ、私はあなたの一票を上にあげます。しかし、私はあなたが "それは本当に遅いO(n * m)のパフォーマンスになることができる"と言及した最後のパラの意味を理解できませんでした。あなたはもっと良い方法でそれを理解するために私にそれに関する良い参考文献を教えていただけますか? – Joy
私の開発の逸話であるので、私はそれのためのリファレンスを持っていません。私は例を追加しようとします。私は最初の2つの段落についてもっと詳しく知っています:http://softwareengineering.stackexchange.com/questions/132019/what-is-the-value-in-hiding-the-details-through-abstractions-isnt-there-value 。彼らは私がしたよりもはるかに優れた仕事をしています。 – joseph