Jika saya memiliki variabel yang mengandung List
itu dapat berisi objek dari banyak jenis yang berbeda misalnya ArrayList
atau LinkedList
. Perbedaan antara a LinkedList
dan a ArrayList
cukup besar. Perilaku O besar metode sangat berbeda. Misalnya menyortir List
dan kemudian menggunakannya untuk melakukan pencarian biner sangat ok untuk ArrayList
tetapi tidak masuk akal dengan a LinkedList
.
java
object-oriented-design
Pagar
sumber
sumber
Jawaban:
Saya tidak akan mengatakannya.
Abstraksi yang bocor adalah yang memaksa Anda untuk berurusan dengan detail implementasi yang seharusnya abstrak. Tetapi kinerja selalu berbeda antara implementasi, jadi jika Anda menghitungnya sebagai bocor, maka tidak ada abstraksi yang tidak bocor.
Jika sesuatu dinyatakan
List
tanpa dokumentasi lebih lanjut, harus dipahami bahwa tidak ada jaminan tentang kinerja, dan jika Anda akan melakukan apa pun yang peka terhadap kinerja, Anda harus membuat salinan dan bekerja dengan itu.Juga, jangan lupa bahwa ada bahkan lebih umum antarmuka yang sering cukup dalam fungsi dan tidak menggoda Anda untuk membuat sebanyak asumsi tentang kinerja:
Collection
.sumber
Iterable
.Semua abstraksi non-sepele, sampai taraf tertentu, bocor. Yang mengatakan, saya tidak begitu yakin itu berlaku di sini. :-)
Abstraksi berkaitan dengan perilaku. Kecuali jika perilaku menentukan kinerja tertentu (yang
List
tidak dimiliki Java ) itu adalah detail implementasi - yaitu tidak relevan.Java tidak memungkinkan Anda menentukan kinerja minimum untuk antarmuka di luar dokumentasi, dan saya tidak mengetahui bahasa apa pun yang melakukannya - akan sangat sulit (mustahil?) Bagi kompiler untuk memverifikasi. Saya dapat melihat beberapa opsi jika kinerja menjadi perhatian:
BinarySearchPerformantList
(Yuck!) - yang menentukan persyaratan kinerja berbagai metode.Opsi 2 mungkin adalah abstraksi yang lebih baik, tetapi dilengkapi dengan overhead tambahan.
sumber
equals
untuk membandingkan objek.LinearSpace
danLogarithmicTime
kemudian menyatakan kelas sepertipublic class BinarySearch : ISearchStrategy<T>, LogarithmicTime
. Kelas lain dapat mengambil parameter sepertipublic T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }
untuk menegakkan batasan kinerja.Di Jawa, ada antarmuka RandomAccess yang didefinisikan sebagai daftar dengan waktu akses acak yang umumnya konstan (O (1) dapatkan, taruh dll). Jika Anda merasa bahwa modul Anda memerlukan daftar dengan karakteristik kinerja, pertimbangkan untuk menggunakan
RandomAccess
bukanList
. Jika Anda tidak merasa perlu untuk melakukan perubahan itu (dan sedikit yang melakukannya), maka mungkin List tidak begitu bocor.sumber
Anda benar, Daftar adalah abstraksi yang bocor. STL menggunakan ide konsep untuk memodelkan masalah khusus ini. Untuk menggunakan contoh Anda, sebuah
ArrayList
model Iterator Akses Acak sementara LinkedList memodelkan Iterator Teruskan . Konsep yang berbeda memiliki persyaratan kinerja yang berbeda, yang membuatnya sesuai untuk algoritma yang berbeda .sumber