Apa alasan di balik konvensi penamaan awalan "I" untuk antarmuka di .NET?

10

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 Messagemewarisi 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?

Rei Miyasaka
sumber
1
Anda tidak mewarisi antarmuka untuk memenuhinya, perbedaan besar.
Daniel Little
Juga sepertinya preferensi seperti IList dan List sebagai kebalikan dari List dan ArrayList. Mereka mungkin melakukannya karena IList bukan ListBase tetapi benar-benar ListInterface (bukan daftar antarmuka jenis), jika Anda mendapatkan apa yang saya maksud.
Daniel Little
@Lavinski In .NET IListadalah istilah umum untuk koleksi berurutan, bersebelahan, akses acak, sedangkan koleksi Listberurutan, bersebelahan, acak, tumbuh , tumbuh . Saya pikir F # memiliki tepat di aliasing Listuntuk ResizeArray; itu pasti nama yang jauh lebih deskriptif. IListmaka bisa saja List, jadi sepertinya itu juga bukan alasan.
Rei Miyasaka
2
IBaseBall dan IBaseBallBase lebih masuk akal bagi saya daripada BaseBallBase dan BaseBallBaseBase (contoh konyol, saya tahu: D)
e-MEE
@ e-MEE sama konyolnya adalah IIRC, yang bisa berupa antarmuka untuk protokol obrolan IRC, atau akronim untuk "jika saya ingat dengan benar".
Rei Miyasaka

Jawaban:

12

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 :

public sealed class ActivityCollection : List<Activity>, 
    IList<Activity>, ICollection<Activity>, IEnumerable<Activity>, 
    IList, ICollection, IEnumerable

Akan lebih sulit untuk dipahami jika definisi itu terlihat seperti

public sealed class ActivityCollection : ListClass<Activity>, 
    List<Activity>, Collection<Activity>, Enumerable<Activity>, 
    List, Collection, Enumerable

Dan bagaimana Anda akan menelepon ListClass? Jelas itu bukan hanya ListBasekarena 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.

public void PrintLines (IEnumerable<string> source)

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:

public delegate TResult Func<in T, out TResult>(
    T arg
)

Ini adalah situasi lain ketika sangat berguna untuk dapat membedakan antara kelas dan jenis lainnya.

Dan
sumber
2
Anda dapat dengan mudah memahami bahwa dengan mengetahui bahwa "kelas pertama adalah warisan, kelas kedua dan seterusnya adalah antarmuka".
Saeed Neamati
3
Ini sepertinya alasan yang masuk akal. Jawa tampaknya telah dipecahkan itu sedikit lebih baik dengan hanya menggunakan kata kunci untuk memperjelas daftar: 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.
Rei Miyasaka
+1 untuk bagian boldface, meskipun saya bisa memikirkan tempat lain di mana konvensi berbasis awalan akan sangat membantu: untuk membedakan antara bidang yang merangkum kepemilikan eksklusif dari int[](atau objek lain dari jenis yang dapat ditransmisikan ) yang dapat dimutasikan tetapi tidak berbagi, dan yang merangkum kepemilikan bersama atas suatu int[]itu, meskipun jenisnya akan memungkinkan mutasi, tidak ada yang diizinkan untuk bermutasi.
supercat
6

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.

Chris Lee
sumber
2
Namun yang aneh adalah bahwa mereka membuang hampir setiap konvensi usang kecuali yang ini. Sejarah juga tidak cukup menjelaskannya. Saya masih merasa pasti ada alasan, kecuali itu benar-benar hanya politik internal - tetapi bahkan kemudian, saya benar-benar tidak dapat melihat alasan bahwa ada orang yang akan marah karena saya dijatuhkan.
Rei Miyasaka
2

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.

Saeed Neamati
sumber
Apa yang salah dengan AnimalInterfacebukan AnimalBase? Ini bukan kelas dasar, ini sebuah antarmuka.
Scott Whitlock
3
tapi apa yang salah dengan IAnimal daripada AnimalInterface? tentu saja kami telah pergi jauh ke tempat kami mulai - yang hanya menunjukkan bahwa beberapa notasi 'hungaria' berguna. Membuang mereka semua (kecuali untuk I dan T) lebih bersifat kesal daripada upaya yang bijaksana untuk menemukan sistem yang lebih baik.
gbjbaanb
2
@ScottWhitlock: Bagi saya, IAnimaljauh lebih mudah dibaca daripada AnimalInterface. 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.
maaartinus