Sebagian besar bahasa OO mengawali nama antarmuka mereka dengan huruf besar I, mengapa Java tidak melakukan ini? Apa alasan untuk tidak mengikuti konvensi ini?
Untuk menunjukkan apa yang saya maksud, jika saya ingin memiliki antarmuka pengguna dan implementasi pengguna saya akan memiliki dua pilihan di Jawa:
- Class = Pengguna, Antarmuka = UserInterface
- Class = UserImpl, Interface = Pengguna
Di mana di sebagian besar bahasa:
Kelas = Pengguna, Antarmuka = IUser
Sekarang, Anda mungkin berpendapat bahwa Anda selalu dapat memilih nama yang paling deskriptif untuk implementasi pengguna dan masalahnya hilang, tetapi Java mendorong pendekatan POJO untuk berbagai hal dan sebagian besar wadah IOC menggunakan DynamicProxies secara luas. Kedua hal ini bersama-sama berarti bahwa Anda akan memiliki banyak antarmuka dengan implementasi POJO tunggal.
Jadi, saya kira pertanyaan saya bermuara pada: "Apakah layak mengikuti konvensi penamaan Antarmuka yang lebih luas terutama mengingat kemana arah Java Frameworks menuju?"
sumber
NetworkInterface
,DialogInterface
, dllJawaban:
Saya lebih suka tidak menggunakan awalan pada antarmuka:
Awalan menyakitkan keterbacaan.
Menggunakan antarmuka pada klien adalah cara terbaik standar untuk memprogram, sehingga nama antarmuka harus sesingkat dan senyaman mungkin. Kelas implementasi harus lebih buruk untuk mencegah penggunaannya.
Ketika mengubah dari kelas abstrak ke antarmuka konvensi pengkodean dengan awalan saya menyiratkan penggantian nama semua kejadian kelas --- tidak baik!
sumber
Apakah memang ada perbedaan antara:
dan
jika semua yang kita bicarakan adalah penamaan konvensi?
Secara pribadi saya lebih suka TIDAK mendahului antarmuka dengan
I
karena saya ingin menjadi pengkodean ke antarmuka dan saya menganggap itu lebih penting dalam hal konvensi penamaan. Jika Anda memanggil antarmukaIUser
maka setiap konsumen kelas itu perlu tahu ituIUser
. Jika Anda memanggil kelasUserImpl
maka hanya kelas dan wadah DI Anda yang tahu tentangImpl
bagian tersebut dan konsumen hanya tahu mereka bekerja dengan aUser
.Kemudian lagi, saat-saat saya terpaksa menggunakan
Impl
karena nama yang lebih baik tidak muncul dengan sendirinya sudah sangat sedikit karena implementasi diberi nama sesuai dengan implementasi karena di situlah penting, misalnyasumber
Mungkin ada beberapa alasan Java umumnya tidak menggunakan konvensi IUser.
Bagian dari pendekatan Berorientasi Objek adalah bahwa Anda tidak harus tahu apakah klien menggunakan antarmuka atau kelas implementasi. Jadi, walaupun List adalah sebuah antarmuka dan String adalah kelas yang sebenarnya, sebuah metode dapat dilewati keduanya - tidak masuk akal untuk secara visual membedakan antarmuka.
Secara umum, kita sebenarnya akan lebih suka menggunakan antarmuka dalam kode klien (misalnya, Daftar ke ArrayList). Jadi tidak masuk akal untuk membuat antarmuka yang menonjol sebagai pengecualian.
Konvensi penamaan Java lebih memilih nama yang lebih panjang dengan arti sebenarnya dari awalan gaya Hongaria. Sehingga kode itu akan terbaca mungkin: Daftar mewakili daftar, dan Pengguna mewakili pengguna - bukan IUser.
sumber
Ada juga konvensi lain, yang digunakan oleh banyak proyek open source termasuk Spring.
Saya pribadi tidak suka awalan "Saya" karena alasan sederhana bahwa ini merupakan konvensi opsional. Jadi jika saya mengadopsi ini apakah IIOPConnection berarti antarmuka untuk IOPConnection? Bagaimana jika kelas tidak memiliki awalan "Aku", kemudian aku tahu itu bukan antarmuka .. jawabannya di sini adalah tidak, karena konvensi tidak selalu diikuti, dan pemolisian mereka akan menciptakan lebih banyak pekerjaan yang disimpan oleh konvensi itu sendiri.
sumber
Seperti yang dikatakan poster lain, biasanya lebih baik memiliki antarmuka yang menentukan kemampuan bukan tipe. Saya cenderung untuk tidak "mengimplementasikan" sesuatu seperti "Pengguna," dan inilah mengapa "IUser" sering tidak benar-benar diperlukan dengan cara yang dijelaskan di sini. Saya sering melihat kelas sebagai kata benda dan antarmuka sebagai kata sifat:
Terkadang kata sifat tidak masuk akal, tapi saya masih akan menggunakan antarmuka untuk memodelkan perilaku, tindakan, kemampuan, properti, dll, ... bukan tipe.
Juga, Jika Anda benar-benar hanya akan membuat satu Pengguna dan menyebutnya Pengguna lalu apa gunanya memiliki antarmuka IUser? Dan jika Anda akan memiliki beberapa jenis pengguna yang berbeda yang perlu mengimplementasikan antarmuka umum, apa yang menambahkan "Aku" ke antarmuka menghemat Anda dalam memilih nama implementasi?
Saya pikir contoh yang lebih realistis adalah bahwa beberapa jenis pengguna harus dapat masuk ke API tertentu. Kita dapat mendefinisikan antarmuka Login, dan kemudian memiliki kelas induk "Pengguna" dengan SuperUser, DefaultUser, AdminUser, AdministrativeContact, dll suclasses, beberapa di antaranya akan atau tidak akan mengimplementasikan antarmuka Login (Loginable?) Sesuai kebutuhan.
sumber
indefinite transitive verbs
8 ^ PBob Lee berkata sekali dalam sebuah presentasi:
jadi, Anda memulai dengan satu implementasi yaitu tanpa antarmuka. nanti Anda memutuskan, well, ada kebutuhan untuk antarmuka di sini, jadi Anda mengubah kelas Anda menjadi antarmuka.
maka itu menjadi jelas: kelas asli Anda disebut Pengguna. antarmuka Anda sekarang disebut Pengguna. mungkin Anda memiliki UserProdImpl dan UserTestImpl. jika Anda mendesain aplikasi dengan baik, setiap kelas (kecuali yang instantiate Pengguna) tidak akan berubah dan tidak akan melihat bahwa tiba-tiba mereka dapat melewati sebuah antarmuka.
jadi semakin jelas -> Antarmuka Pengguna implementasi UserImpl.
sumber
Dalam C # itu
Jawa akan mengatakan
Karena itu, saya tidak berpikir konvensi hampir sama pentingnya dalam java untuk antarmuka, karena ada perbedaan eksplisit antara warisan dan implementasi antarmuka. Saya akan mengatakan hanya memilih konvensi penamaan yang Anda inginkan, selama Anda konsisten dan menggunakan sesuatu untuk menunjukkan kepada orang-orang bahwa ini adalah antarmuka. Belum selesai java dalam beberapa tahun, tetapi semua antarmuka hanya akan berada di direktori mereka sendiri, dan itu adalah konvensi. Tidak pernah benar-benar memiliki masalah dengannya.
sumber
Dalam pengalaman saya, konvensi "I" berlaku untuk antarmuka yang dimaksudkan untuk memberikan kontrak ke kelas, terutama ketika antarmuka itu sendiri bukan gagasan abstrak kelas.
Misalnya, dalam kasus Anda, saya hanya berharap untuk melihat
IUser
apakah satu-satunya pengguna yang ingin Anda miliki adalahUser
. Jika Anda berencana untuk memiliki berbagai jenis pengguna -NoviceUser
,,ExpertUser
dll. - Saya berharap untuk melihatUser
antarmuka (dan, mungkin,AbstractUser
kelas yang mengimplementasikan beberapa fungsi umum, sepertiget/setName()
).Saya juga harapkan interface yang mendefinisikan kemampuan -
Comparable
,Iterable
, dll - diberi nama seperti itu, dan tidak sepertiIComparable
atauIIterable
.sumber
Mengikuti prinsip-prinsip OO yang baik, kode Anda harus (sejauh mungkin / praktis) bergantung pada abstraksi daripada kelas konkret. Sebagai contoh, umumnya lebih baik menulis metode seperti ini:
dari ini:
Jika Anda mengikuti ide ini, maka saya berpendapat bahwa kode Anda akan lebih mudah dibaca jika Anda memberikan nama antarmuka seperti "Pengguna" dan "BankAccount" (misalnya), daripada "IUser", "UserInterface", atau variasi lainnya.
Satu-satunya bit kode yang harus peduli dengan kelas beton yang sebenarnya adalah tempat di mana kelas beton dibangun. Segala sesuatu yang lain harus ditulis menggunakan antarmuka.
Jika Anda melakukan ini, maka nama kelas beton "jelek" seperti "UserImpl" harus disembunyikan dengan aman dari sisa kode, yang dapat terus menggunakan nama antarmuka "bagus".
sumber
= v = Awalan "I" juga digunakan dalam kerangka kerja Wicket, di mana saya terbiasa dengan cepat. Secara umum, saya menyambut setiap konvensi yang mempersingkat nama kelas Java yang tidak praktis. Ini merepotkan, bagaimanapun, bahwa semuanya diurutkan berdasarkan abjad di bawah "I" di direktori dan di Javadoc.
Praktek pengkodean gawang mirip dengan Swing, di mana banyak instance kontrol / widget dibangun sebagai kelas dalam anonim dengan deklarasi metode inline. Yang menjengkelkan, ini berbeda 180 ° dari Swing dalam Swing yang menggunakan awalan ("J") untuk kelas implementasi.
Sufiks "Impl" adalah singkatan yang sangat kecil dan tidak bisa digunakan secara internasional. Kalau saja kita setidaknya pergi dengan "Imp" itu akan lebih manis (dan lebih pendek). "Impl" digunakan untuk IOC, terutama Spring, jadi kami agak terjebak dengannya untuk saat ini. Itu mendapat sedikit schizo mengikuti 3 konvensi berbeda dalam tiga bagian berbeda dari satu basis kode, meskipun.
sumber
Apakah ini konvensi penamaan yang lebih luas dalam arti sebenarnya? Saya lebih pada sisi C ++, dan tidak benar-benar di Jawa dan keturunan. Berapa banyak komunitas bahasa yang menggunakan konvensi I?
Jika Anda memiliki konvensi penamaan standar toko yang tidak menggunakan bahasa di sini, gunakan saja. Jika tidak, ikuti konvensi penamaan bahasa.
sumber