Saya sedang membaca situs web JDOM .
Mengapa API JDOM didefinisikan berdasarkan kelas konkret daripada antarmuka?
Jason Hunter merangkum argumen terhadap API berbasis antarmuka untuk JDOM:
Dengan antarmuka yang semuanya menjadi pabrik, elemen harus 'diimpor' ke dalam dokumen baru dan bukan hanya ditambahkan, fitur seperti serialisasi jangka panjang tidak dapat dijamin, dan daftarnya terus berlanjut.
Kami mulai dengan antarmuka sebenarnya. Selama peninjauan pra-rilis kami ke beberapa rekan kami menerima umpan balik kami harus mencoba kelas konkret. Kami melakukannya, dan desainnya jauh lebih baik.
Saya seorang desainer pemula. Semua saran yang saya dengar sampai sekarang menyarankan agar tidak menggunakan desain dengan kelas beton.
Mungkin menggunakan kelas beton yang sesuai di tempat-tempat tertentu. Apakah ada masalah kelas umum yang menggunakan kelas beton dalam desain oke?
sumber
Jawaban:
[EDIT] Situs web JDOM mengambil java.io.File sebagai contoh, tapi ini jelas merupakan desain berbasis antarmuka karena orang dapat memanipulasi contoh java.io.File seolah-olah itu hanya Serializable. Dalam situasi ini hanya "pencipta" yang tahu kelas konkret
sumber
Dari situs JDOM:
Artinya, sekitar waktu Java 1.3 diperkenalkan. Tidak ada jalan jatuh tempo dalam hal pengembangan Java - pengembang yang paling berpengalaman hanya memiliki 4 tahun menggunakan Java terbaik. Tidak ada wadah IoC yang digunakan secara luas, tidak ada Hibernate. Apache Struts baru saja memulai.
Itu semua untuk mengatakan bahwa Jason dan Brett salah. Banyak orang belum "mengerti". Jika mereka memiliki latar belakang C ++, well, Anda tidak perlu antarmuka di C ++ (well, mereka ada di C ++, tetapi Anda tidak benar-benar membutuhkannya, kan?), Mengapa sih menggunakannya di Jawa? Ya, ada banyak alasan bagus, yang bisa mengarahkan Anda ke orang lain.
Mereka jelas salah
Java tidak memungkinkan multiple inheritance of class, tetapi Java memungkinkan implementasi beberapa antarmuka. Itu bisa membuat perbedaan nyata.
sumber
Ingat, pertama, bahwa dalam Pengembangan Perangkat Lunak ada beberapa cara untuk memecahkan masalah, dan jika beberapa pengembang menggunakan teknik yang berbeda dari Anda, itu tidak berarti salah.
Salah satu kasus tersebut adalah "antarmuka" versus (basis) "kelas". Ada situasi di mana tujuan yang sama dapat dicapai dengan kedua teknik.
Untuk membuat berbagai hal, lebih rumit, ada beberapa penggunaan antarmuka, hanya untuk menyebutkan:
Pertanyaan Anda berlaku untuk poin pertama.
Saat Anda ingin mengembangkan hierarki kelas, bukan hanya satu kelas, dan beberapa kelas dimaksudkan untuk berbagi beberapa fitur tertentu, Anda mungkin ingin memulai dengan kelas dasar, bahkan jika itu dapat dilakukan dengan antarmuka.
Dan, tinggalkan antarmuka untuk skenario lain.
Contoh yang baik adalah perpustakaan widget (kontrol).
Saya sarankan, lihatlah ke bahasa pemrograman lain bagaimana mereka menggunakan antarmuka & kelas seperti: PHP, Delphi (Object Pascal), C #.
Bersulang.
sumber
Anda biasanya menginginkan antarmuka untuk apa pun yang dilewatkan sebagai parameter atau dikembalikan, pada dasarnya sehingga Anda dapat memisahkan kelas dari dependensinya.
JADI, jika kita mencari kelas, kita tidak pernah lulus dengan normal kecuali pengecualian muncul dalam pikiran. Saya bukan pengembang Java, tetapi tentu saja dalam bahasa lain yang serupa saya tidak berpikir saya telah melihat antarmuka yang ditentukan untuk pengecualian.
sumber
Aturan desain API benar-benar hal yang spesifik. Saya tidak yakin Anda harus menyimpulkan apa pun dari FAQ itu dalam hal bagaimana Anda harus merancang kode sehari-hari Anda.
Untuk kode reguler Anda, masih benar bahwa Anda akan lebih sering menggunakan antarmuka atau pewarisan kelas abstrak daripada IMO pewarisan vanilla.
Untuk mendapatkan pemahaman yang baik tentang aturan itu, Anda harus menempatkan diri Anda bukan dari sudut pandang kelas turunan vs superclassnya, tetapi dari sudut pandang suatu objek yang memiliki ketergantungan pada objek lain. Hampir selalu lebih baik untuk bergantung pada abstraksi daripada implementasi konkret karena memungkinkan Anda untuk menerima seluruh rangkaian kelas yang berbeda sebagai dependensi, bergantung pada kontrak mereka dan bukan detail implementasi mereka.
Penggunaan pertama untuk ini sering dalam unit test - jika Anda benar-benar ingin unit menguji kelas Anda dalam isolasi lengkap, Anda melakukannya terhadap implementasi palsu dari dependensi Anda yang berbeda dari implementasi nyata yang akan digunakan dalam produksi.
sumber