Saya tahu konvensi "Saya" sudah ada sejak COM, tetapi saya tidak pernah mengerti mengapa konvensi ini belum dipertimbangkan kembali seperti setiap konvensi penamaan lainnya sebelum .NET memilikinya.
Dari segi konsumsi, satu-satunya hal yang memisahkan antarmuka dari, katakanlah, kelas abstrak, adalah bahwa mereka dapat diturunkan secara berlipat ganda. Tapi semuanya setelah Visual Studio 2003 telah menunjukkan tanda tangan jenis di tooltips, jadi sama tidak bergunanya dengan semua notasi Hungaria lainnya yang telah dibuang.
Saya juga berpikir itu mungkin agar Anda dapat memiliki implementasi dasar antarmuka dengan nama yang sama, misalnya Message
mewarisi IMessage
, tetapi sebagian besar pustaka .NET telah menambahkan kata "Base" di akhir (misal System.Collections.ReadOnlyCollectionBase
) - dan ini lebih masuk akal semantik.
COM interop tampaknya menjadi alasan lain yang mungkin - tetapi bukan seolah-olah kelas pembungkus yang dihasilkannya benar-benar idiom .NET, jadi saya ragu bahwa itu adalah pertimbangan estetika.
Dalam salah satu proyek saya yang lebih baru, saya telah melupakan konvensi sepenuhnya, dan rasanya baik-baik saja. Apakah ada sesuatu yang saya lewatkan?
IList
adalah istilah umum untuk koleksi berurutan, bersebelahan, akses acak, sedangkan koleksiList
berurutan, bersebelahan, acak, tumbuh , tumbuh . Saya pikir F # memiliki tepat di aliasingList
untukResizeArray
; itu pasti nama yang jauh lebih deskriptif.IList
maka bisa sajaList
, jadi sepertinya itu juga bukan alasan.Jawaban:
Saya pikir ini mungkin satu-satunya kasus ketika awalan berguna.
Kelas dan antarmuka benar-benar memiliki semantik yang berbeda, dan karena keduanya tipe, mudah digabungkan.
Ketika saya melihat deklarasi kelas, saya bisa langsung tahu dari mana ia berasal dan apa yang mengimplementasikannya :
Akan lebih sulit untuk dipahami jika definisi itu terlihat seperti
Dan bagaimana Anda akan menelepon
ListClass
? Jelas itu bukan hanyaListBase
karena itu dapat digunakan sendiri.Jadi, kita harus menyelesaikan masalah yang baru saja kita temukan, atau mengadaptasi awalan yang memisahkan kelas dari antarmuka, itulah yang dilakukan oleh perancang .NET Framework.
Juga, secara pribadi saya merasa berguna ketika saya bisa tahu dari metode tanda tangan bahwa ia bekerja dengan antarmuka.
Ini seperti sinyal di kepala saya: hei, saya bisa menerapkan ini! Saya bisa memberi makan metode apa pun yang cocok dengan kontrak.
Tentu saja orang dapat berargumen bahwa itu tidak penting, tetapi ini adalah salah satu dari hal-hal kecil yang membuat awalan itu layak untuk saya. Ini sangat berguna ketika menulis banyak kode dengan wadah IoC ketika Anda terus-menerus bekerja dengan antarmuka dan perlu dengan mudah membedakan keduanya.
By the way, tidak hanya antarmuka memiliki awalan dalam sistem tipe .NET. Jangan lupa tentang parameter tipe umum:
Ini adalah situasi lain ketika sangat berguna untuk dapat membedakan antara kelas dan jenis lainnya.
sumber
class Dog extends Mammal implements MailmanChaser
. @Saeed Anda dapat memiliki kelas yang tidak mewarisi dari apa pun, jadi tipe pertama dalam daftar sebenarnya adalah antarmuka daripada kelas dasar.int[]
(atau objek lain dari jenis yang dapat ditransmisikan ) yang dapat dimutasikan tetapi tidak berbagi, dan yang merangkum kepemilikan bersama atas suatuint[]
itu, meskipun jenisnya akan memungkinkan mutasi, tidak ada yang diizinkan untuk bermutasi.Saya tidak berpikir Anda kehilangan apa pun, itu hanya kebiasaan historis.
Saya setuju dengan Anda juga dan telah menjatuhkan 'I' pada beberapa proyek kecil hingga menengah tanpa efek yang merugikan.
sumber
Saya pikir satu-satunya alasan, menurut Pedoman Penamaan Microsoft tentang Antarmuka dan Kelas , adalah bahwa, kadang-kadang Anda memiliki konflik antara nama antarmuka dan kelas yang mengimplementasikannya. Ini kembali ke fakta bahwa antarmuka sebenarnya kerangka, bukan daging, dan kelas pelaksana sebenarnya adalah daging (menyadari cetak biru). Dengan demikian, IAnimal hanya menggambarkan apa yang seharusnya dimiliki hewan , sementara Hewan dapat memberi tahu Anda apa yang dimilikinya .
Namun, saya pribadi sepenuhnya setuju dengan Anda pada titik bahwa kami bisa menggunakan Animal Base untuk antarmuka, dan Animal untuk kelas.
Di sisi lain, kadang-kadang ada dua hal yang sangat bertentangan, sehingga tim memutuskan untuk memberikan konvensi untuk mencegah konflik lebih lanjut, terlepas dari keputusan yang sudah dibuat. Misalnya, dalam ASP.NET MVC, baik Tampilan Parsial dan Tata Letak (halaman master), sama seperti Tampilan normal , sementara mereka melayani fungsi yang berbeda. Jadi, Microsoft meskipun menekankan untuk tidak menggunakan garis bawah dalam penamaan, menyarankan untuk menggarisbawahi Tata Letak dan Tampilan Parsial dengan garis bawah.
sumber
AnimalInterface
bukanAnimalBase
? Ini bukan kelas dasar, ini sebuah antarmuka.IAnimal
jauh lebih mudah dibaca daripadaAnimalInterface
. Nama verbal lebih disukai kecuali dalam kasus-kasus ketika konvensi singkat sederhana dapat digunakan untuk sesuatu yang cukup sering terjadi. Dan antarmuka adalah kasus seperti itu.