.NET'teki arabirimler için “I” önek adlandırma kuralının arkasındaki neden nedir?


10

COM "beri" ben "kongre etrafında olduğunu biliyorum, ama neden .NET önce diğer tüm adlandırma kuralları gibi yeniden düşünülmemiş olduğunu asla anlamadım.

Tüketim açısından, bir arabirimi, örneğin soyut bir sınıftan ayıran tek şey, bunların çoğul olarak miras alınabilmeleridir. Ancak Visual Studio 2003'ten sonraki her şey araç ipuçlarında tip imzaları gösterdi, bu yüzden atılan diğer tüm Macar gösterimleri kadar işe yaramaz.

Ayrıca aynı ada sahip arayüzün temel bir uygulamasına sahip olabileceğinizi düşündüm, örneğin Messagedevralma IMessage, ancak .NET kütüphanelerinin çoğu sonunda "Base" kelimesini eklemek için gitti (örneğin System.Collections.ReadOnlyCollectionBase) - ve bu daha anlamsal bir anlam ifade ediyor.

COM birlikte çalışma başka bir olası neden gibi görünüyor - ama sanki oluşturduğu sarıcı sınıfları mükemmel deyimsel .NET, bu yüzden bu estetik bir düşünce olduğundan şüphe değil.

Yeni projelerimden birinde kongreyi tamamen bıraktım ve gayet iyi hissettiriyor. Kaçırdığım bir şey var mı?


1
Bunları yerine getirmek için arayüz devralmazsınız, büyük fark.
Daniel Little

Ayrıca List ve ArrayList'in aksine IList ve List gibi bir tercih gibi görünüyor. Muhtemelen bunu yaptım çünkü IList bir ListBase değil ama gerçekten demek istediğimi alırsanız, bir ListInterface (bir liste arayüzü listesi değil).
Daniel Little

@Lavinski In .NET IListsıralı, bitişik toplama, rasgele erişim için genel bir terim iken Listsıralı, bitişik, rasgele erişim, büyüyen bir koleksiyon. Ben F # sağ aliasing içinde olduğunu düşünüyorum Listetmek ResizeArray; bu kesinlikle çok daha açıklayıcı bir isim. IListo zaman olabilirdi List, bu da bir sebep gibi görünmüyor.
Rei Miyasaka

2
IBaseBall ve IBaseBallBase bana BaseBallBase ve BaseBallBaseBase'den daha mantıklı geliyor (aptal örnek, biliyorum: D)
e-MEE

@ e-MEE eşit derecede saçma IRC sohbet protokolü için bir arayüz veya "doğru hatırlıyorsam" kısaltması olabilir IIRC olacaktır.
Rei Miyasaka

Yanıtlar:


12

Bence bu önekler yararlı olduğunda tek durum bu olabilir.

Sınıflar ve arayüzler gerçekten farklı semantiklere sahiptir ve her ikisi de tür olduğundan, karıştırılması kolaydır.
Bir sınıf bildirimi gördüğümde, derhal neyden türediğini ve neyi uyguladığını söyleyebilirim :

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

Tanımın nasıl göründüğünü anlamak daha zor olurdu

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

Peki nasıl ararsınız ListClass? Açıkçası sadece ListBasekendi başına kullanılabilir olduğu için değil .
Bu nedenle, ya yeni icat ettiğimiz bir sorunu çözmeliyiz ya da sınıfları arabirimlerden ayıran bir öneki uyarlamalıyız, .NET Framework tasarımcılarının yaptığı.

Ayrıca, yöntem imzasından arayüzlerle çalıştığını söyleyebildiğimde kişisel olarak yararlı buluyorum.

public void PrintLines (IEnumerable<string> source)

Kafama bir sinyal gibi: hey, bunu uygulayabilirim! Sözleşmeye uygun olan yöntemi kullanabilirim.

Tabii ki o kadar önemli olmadığını iddia edebiliriz ama bu benim için öneki buna değer yapan küçük şeylerden biri. Arayüzlerle sürekli çalışırken ve ikisi arasında kolayca ayrım yapmanız gerektiğinde IoC kaplarıyla çok sayıda kod yazarken özellikle kullanışlıdır.

Bu arada, .NET arabirim sisteminde yalnızca arabirimlerin önekleri yoktur. Genel tip parametrelerini unutmayın:

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

Bu, sınıflar ve başka türler arasında ayrım yapabilmenin son derece yararlı olduğu başka bir durumdur.


2
"Birinci sınıfın kalıtım, ikinci sınıfın ve dördüncü arayüzün arayüz olduğunu" bilerek kolayca anlayabilirsiniz.
Saeed Neamati

3
Bu mantıklı bir neden gibi görünüyor. Java basitçe listesini açıklamak için anahtar kelimeler kullanarak biraz daha güzel bunu çözmüş görünüyor: class Dog extends Mammal implements MailmanChaser. @Her şeyden miras almayan bir sınıfa sahip olabilirsiniz, bu nedenle listedeki ilk tür temel sınıftan ziyade bir arabirimdir.
Rei Miyasaka

Önde gelen bir konvansiyonun yararlı olacağı başka bir yer düşünebilsem de, kalın yazı bölümü için +1: int[]değişebilir ancak değiştirilemeyen bir (veya başka tür bir değişken nesnenin) özel mülkiyeti içine alan bir alanı ayırt etmek için pay ve bir kapsülleri bir sahipliğini paylaştığını int[]onun tip mutasyonu sağlayacak olsalar dahi bu, kimse mutasyona izin verilir.
supercat

6

Hiçbir şeyi kaçırdığını düşünmüyorum, bu sadece tarihsel bir alışkanlık.

Ben de sana katılıyorum ve ayrıca zarar verici etkisi olmayan birkaç küçük ve orta ölçekli projeye 'Ben'i bıraktım.


2
Yine de garip olan şey, bunun dışında neredeyse tüm eski konvansiyonları atmasıdır. Tarih de tam olarak açıklamıyor. Gerçekten sadece iç politika olmadıkça hala bir neden olması gerektiğini hissediyorum.
Rei Miyasaka

2

Microsoft'un Arabirimler ve Sınıflar Hakkında Adlandırma Yönergeleri'ne göre tek neden, bazen arabirimin adı ile bunu uygulayan sınıf arasında çakışmaların olmasıdır. Bu, arayüzlerin aslında et değil iskelet olduğu gerçeğine dayanır ve uygulayıcı sınıfı aslında ettir (planı tasvir ederek). Böylece, IAnimal sadece bir hayvanın neye sahip olması gerektiğini tanımlarken , Hayvan size neye sahip olduğunu söyleyebilir .

Ancak, ben şahsen tamamen basitçe kullanabileceği noktada size katılıyorum Hayvan Base arayüz için ve Hayvan sınıf için.

Öte yandan, bazen iki şey o kadar çelişkilidir ki, bir takım halihazırda verilmiş kararlara rağmen daha fazla çatışmayı önlemek için bir sözleşme yapmaya karar verir. Örneğin, ASP.NET MVC, hem Kısmi Görüntüleme ve Düzenleri (ana sayfa), sadece normal gibidir Görünüm farklı işlevler hizmet ederken,. Bu nedenle Microsoft, adlandırmada alt çizgi kullanmamaya vurgu yapmasına rağmen, Düzeni ve Kısmi Görünümleri alt çizgiyle alt çizgi olarak önerir .


Bunun AnimalInterfaceyerine yanlış olan ne AnimalBase? Bu bir temel sınıf değil, bir arayüz.
Scott Whitlock

3
ama AnimalInterface yerine IAnimal ile ilgili sorun nedir? kesinlikle başladığımız yere kadar gittik - ki bu sadece 'macarca' gösterimlerinin bazılarının yararlı olduğunu gösteriyor. Hepsini atmak (I ve T hariç) daha iyi bir sistem bulmak için düşünceli bir girişimden ziyade daha fazla pike idi.
gbjbaanb

2
@ScottWhitlock: Benim IAnimaliçin çok daha okunabilir AnimalInterface. Ayrıntılı adlar, yeterince sık meydana gelen bir şey için basit bir kısa kuralın kullanılabileceği durumlar dışında tercih edilir. Ve arayüzler böyle bir durum.
maaartinus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.