it-swarm-id.com

Apakah praktik yang buruk memiliki antarmuka untuk mendefinisikan konstanta?

Saya menulis satu set kelas tes junit di Jawa. Ada beberapa konstanta, misalnya string yang akan saya butuhkan di kelas tes yang berbeda. Saya berpikir tentang antarmuka yang mendefinisikan mereka dan setiap kelas tes akan mengimplementasikannya.

Manfaat yang saya lihat ada:

  • akses mudah ke konstanta: MY_CONSTANT dari pada ThatClass.MY_CONSTANT
  • setiap konstanta didefinisikan hanya sekali

Apakah pendekatan ini lebih baik atau buruk? Saya merasa seperti melakukan itu sedikit seperti menyalahgunakan konsep antarmuka.

Anda dapat menjawab secara umum tentang antarmuka/konstanta, tetapi juga tentang tes unit jika ada sesuatu yang istimewa tentangnya.

45
FabianB

Joshua Bloch menyarankan ini dalam bukunya berjudul Java Efektif:

Bahwa kelas menggunakan beberapa konstanta secara internal adalah detail implementasi. Menerapkan antarmuka konstan menyebabkan detail implementasi ini bocor ke API yang diekspor kelas. Tidak ada konsekuensi bagi pengguna kelas bahwa kelas mengimplementasikan antarmuka konstan. Bahkan, itu mungkin membingungkan mereka. Lebih buruk lagi, ini merepresentasikan komitmen: jika dalam rilis yang akan datang kelas diubah sehingga tidak perlu lagi menggunakan konstanta, ia masih harus mengimplementasikan antarmuka untuk memastikan kompatibilitas biner.

Anda bisa mendapatkan efek yang sama dengan kelas normal yang mendefinisikan konstanta, dan kemudian menggunakan import static com.example.Constants.*;

88
matt

Dalam kasus kami, kami melakukan ini karena nilai konstanta mewakili kontrak untuk status akhir yang harus disediakan oleh implementasi layanan. Menempatkan konstanta-konstanta ini di antarmuka menentukan status akhir sebagai bagian dari kontrak, dan jika ada implementasi antarmuka yang tidak menggunakannya, itu tidak akan melakukan tugasnya.

Konstanta TERKADANG adalah detail implementasi. KARENA mereka tidak. Seperti biasa, seorang insinyur perlu menggunakan otaknya untuk memutuskan apa yang harus dilakukan, dan tidak bergantung pada pola atau praktik penyapuan.

14
user144901

Saya tidak berpikir itu hal yang baik untuk memiliki antarmuka hanya untuk konstanta.

Tetapi jika sebuah antarmuka yang mendefinisikan perilaku (metode yang mengimplementasikan kelas harus diimplementasikan), memiliki konstanta, tidak apa-apa. Jika "membocorkan beberapa detail implementor" ke dalam API, itu karena memang sudah seharusnya. Mereka juga bocor bahwa implementor mengimplementasikan metode .foo() dan .bar().

Ambil contoh antarmuka Java.awt.Transparency. Ini memiliki konstanta OPAQUE, BITMASK dan TRANSLUCENT tetapi juga memiliki metode .getTransparency().

Jika perancang meletakkan konstanta-konstanta itu di sana, itu karena dia pikir itu akan cukup stabil untuk menjadi bagian dari antarmuka, seperti .getTransparency().

6

Sebuah perusahaan tempat saya bekerja banyak menggunakan antarmuka yang diimpor1 konstanta. Saya tidak merasa ada ruginya.

Pertanyaan Anda harus bertanya pada diri sendiri adalah, seberapa pentingkah namespacing untuk Anda? Dalam kasus konstanta, itu benar-benar semua kelas bertindak sebagai. Jika Anda memiliki ribuan konstanta, Anda mungkin tidak ingin semua konstanta itu selalu tersedia.

Yang paling keren tentang antarmuka adalah memberi Anda keuntungan dari bekerja dengan cara apa pun - membawa semua ruang nama yang Anda butuhkan, atau tidak satupun dari mereka (dan mengaksesnya secara eksplisit, dengan MyInterface.CONSTANT). Hampir sama dengan import static MyInterface.*, tapi sedikit lebih jelas.


1: Jika Anda tidak terbiasa dengan Java, maksud saya bukan kata kunci import, maksud saya hanya dibawa melalui implements MyConstantsInterface

2
Nicole

Berpikir itu adalah sudut pandang yang sebagian besar populer di tempat-tempat di mana desain berdasarkan kontrak berlaku.
Antarmuka adalah kontrak. Menempatkan konstanta dalam antarmuka berarti setiap kelas yang mematuhi kontrak menyetujui nilai/konsep yang diidentifikasi oleh konstanta.

2
CMR

Tidak, ini bukan praktik buruk umum.

Intinya adalah bahwa konstanta seperti artefak lainnya harus dimasukkan di bawah aturan visibilitas minimal dan tingkat abstraksi yang tepat.

Menggunakan sintaks hanya karena Anda bisa adalah masalah sebenarnya.

1
oopexpert

Saya berasal dari latar belakang yang sebagian besar dipengaruhi terutama oleh 'Ada cara' dan '. Bersih.' Saya akan mengatakan tidak, bahwa mungkin tidak terbaik untuk mendeklarasikan konstanta dalam antarmuka. Secara teknis tidak diizinkan dalam c #.

Alasan saya mengatakan tidak adalah bahwa antarmuka adalah bentuk kontrak yang mendefinisikan perilaku, bukan keadaan atau struktur. Konstanta menyiratkan semacam keadaan (primitif), atau aspek keadaan (komposit atau agregat).

Saya dapat menghargai dorongan untuk membuat nilai default dan standar yang tersedia untuk semua orang yang mengimplementasikan antarmuka, tetapi mungkin keadaan default akan lebih baik dijelaskan dalam objek atau template abstrak atau nilai, di mana default akan memiliki setidaknya konteks minimal.

Untuk panduan yang lebih teknis: unduh.Oracle.com/javase/1.5.0/docs/guide/language/static-import.html

1
JustinC