C # genel türleri için iyi bir adlandırma kuralı nedir? [kapalı]


16

Bu soruyu yığın taşması yerine burada sormaya karar verdim çünkü oldukça öznel.

C #, genellikle çok kötü adları ile genel türleri görüyorum. Özellikle, "T" yaygın olarak kullanılmaktadır, ancak tek başına anlamlı bir isim değildir. Örneğin:

class Fruit<T>
{
    T fruit;
}

Bu tipik bir yaklaşım olsa da, herkes buna karşı tavsiye eder mi? Ve eğer öyleyse, genel işlevler ve sınıflar için C # bağlamında genel türler için makul bir adlandırma kuralı ne olurdu?

Önceki örneğimde, genel türün Ther zaman Appleveya gibi bir meyve türü olması gerektiğini varsayalım Orange. Tipi Tyani belki daha iyi bir isim olurdu, bu meyve türü olduğunu çok açık hale getirmek için ihtiyacı FruitTypebiz ile bitirmek böylece:

class Fruit<FruitType>
{
    FruitType fruit;
}

Bu size sadece aradığım şey hakkında bir fikir vermek içindir. Bu sorun için kabul edilebilir bir "temel kural" nedir?


3
Bu yapıcı bir soru değil. Sadece posterin favori stili ile cevaplar alacak.
Michael K


2
@Michael bir takım cevaplar olacak ve kabul edilen cevap Robert'ın favorisi olacak, ancak diğer çeşitli cevaplar oylanacak.
StuperUser

5
@Michael Sübjektif bir soru sübjektif bir cevap alır. Soru hala yapıcıdır, çünkü bu sorun için çeşitli fikirler / çözümler isteyen herkes için bir referans noktası görevi görür. Cevap olarak işaretlediğim, tek ve sadece yararlı bilgi parçasını temsil etmiyor.
void.pointer

Belki de onu, öznel olmasına rağmen iyi bir kaynak olarak bir topluluk wiki'sine dönüştürmek?
tylermac

Yanıtlar:


22

Gerçekten öznel ... ish .
Bazı kişiler ibir for döngüsü değişkeni Tiçin mükemmel bir şekilde geçerli olduğundan , bazıları genel bir sınıftaki bir tür yer tutucusu için mükemmel bir şekilde geçerli olduğunu düşünür .

Ben şahsen bu yaklaşımı benimsiyorum, bu yaygın bir toplantı ve insanlar genellikle ne demek istediğinizi biliyorlar.

Tipin anlamlı olduğu yerde anlamlı bir isim kullanırdım, ancak genellikle T ile başlarım. Son zamanlarda genel bir sözlük sınıfı geliştirdim (sorma) ve beyan

public class Dictionary<TKey, TValue>

Ancak, türlerin aslında anlamsız olduğu bir Tuple gibi bir şey için, aşağıdakileri mükemmel bir şekilde kabul edilebilir buluyorum.

public class Tuple<T1, T2, T3>

2
Bunu hiç öznel bulmuyorum. ive Tilke olarak ölçülebilir (yani, döngü indeksleri farklı tanımlayıcılar elde ederse kaynak kodun anlaşılmasının artmış olup olmadığı ölçülebilir). Ölçülmesi zor olduğu için, her şey üzerinde “sübjektif” etiketi etiketlememiz gerektiği anlamına gelmez. Açık problemler olmadan geniş kullanım göz önüne alındığında, bunun gerçekten işe yaradığını ölçmeden bile söylemek oldukça makul.
Konrad Rudolph

2
@Konrad: Bir noktan var. . . ancak soru sübjektif olarak etiketlenmemiştir, asker halkın konvansiyonları adlandırma konusunda kendi tercihlerine sahip olduklarını varsayarak öznel bir konu olduğunu kabul etmektedir. Bu yüzden soru öznel olmayabilir (ve aslında doğru bir cevap olduğu için değil, Microsoft resmi kılavuzuna bağlantı veren cevap), konu özneldir, çünkü birisinin bir " ive Tvardır kötülük . Bir tek harf isimlerini hiç asla kullanmamalıyız" tipi cevap. Herkesi memnun etmek için bir ish ekledim :)
Binary Worrier

1
Bence bu gönderiye eklenen yorumlar, cevabın kendisi çok faydalı olmasına rağmen, çok değerli bir yanıt haline getiriyor. Therhangi bir kısıtlaması olmayan bir türden bahsederken TFruitmantıklı, bana mantıklı çünkü bana "Kısıtlaması olan bir meyve olduğu" yazıyor. Bu, genel tür parametrelerini adlandırmak için iyi bir "genel kural" gibi görünüyor. Teşekkürler!!
void.pointer

1
Sadece şunu belirtmek gerekirse , MSDN'den Kütüphane geliştiricileri için .NET Framework Tasarım Yönergeleri ile uyumludur . Bkz . Genel Tür Parametrelerinin İsimleri .
Grant Thomas

7

Bence haklısın, ama T oldukça standart haline geldi. Muhtemelen eski C ++ zamanlarından ve "T tipi" ifadelerinden kaynaklanmaktadır. Mümkün olduğunca açıklayıcı olmak için iyi bir uygulama olduğunu düşünüyorum, ancak bu özneldir.

Bir önek olarak T'yi seçebilirsiniz, tıpkı birçok insanın arayüzler için I'yi seçtiği gibi. Böylece

class Juice<TFruit> where TFruit...

benim düşünceme göre iyi bir isim olurdu. Çoğu durumda önekleri soneklere tercih ederim, çünkü tökezlerken ne gördüğünüzü hemen belli eder ve Intellisense gibi şeyleri aramak daha kolaydır. UI-Controls için de iyi bir uygulamadır, büyük olasılıkla türü her zaman bilirsiniz (örn. TextBox), ancak verdiğiniz açıklayıcı addan% 100 emin değilseniz.

Bunun olumsuz tarafı, tipin kendisi T ile başladığında kötü görünmesidir. Bu nedenle, genel tipin, aşağıdaki gibi özel durumlarda eklenmesi iyi bir şey olacaktır.

class SomeAlgorithm<TypeT> where TypeT : Type

Lütfen bunun sadece benim görüşüm olduğunu ve son derece öznel olduğunu unutmayın. Ama sanırım son ekin önekini tercih etmekle ilgili küçük bir noktam var.


Kullanımı Ttipi parametreleri için ve önek Iarayüz adları için olduğunu açıkça gerekli ( " DO Çerçeve Tasarım kılavuzunda ..." kuralları).
Richard

1
Burada kullanmanın TFruitmasaya getirdiği şey şüphelidir T. TTypeVeya gibi bir ad kullanmak TypeTkesinlikle saçmalıktır. Bu ekler hiçbir bilgi olursa olsun üzerinde sadece T. Aynı bilgi aktarılır.
Konrad Rudolph

@Konrad Rudolph: TypeT örneğime yakından bakın, System.Type ile uğraşırken özel bir vakayı kapsar. İsimlerim sadece tür için T kullanmaktan daha yüksek bir entropiye sahip olduğunu düşünüyorum, özellikle de jenerik de kısıtlıysa.
Falcon

7

Microsoft'un jeneriklerle ilgili resmi bir kılavuzu vardır: Sınıfların, Yapıların ve Arayüzlerin Adları ( burada ve kitap biçiminde alıntılanmıştır : Çerçeve Tasarım Yönergeleri ).

Özel sorunuzla ilgili olarak:

Tek harfli bir ad tamamen açıklayıcı değilse ve açıklayıcı bir ad değer katmazsa, genel tür parametrelerini açıklayıcı adlarla yapın.

IDictionary<TKey, TValue> 

bu yönergeyi izleyen arabirime bir örnektir.

Tek harfli bir parametreye sahip türler için tür parametresi adı olarak T harfini kullanmayı düşünün.

Açıklayıcı tip parametre adlarını T harfiyle önek uygulayın.

Parametre adında bir type parametresine yerleştirilen kısıtlamaları belirtmeyi düşünün. Örneğin, ISession ile sınırlandırılmış bir parametreye TSession denilebilir.



@Richard: Yorumunuzu dikkate alarak cevabımı ayarladım, teşekkürler!
Matthieu

2

Jeneriklerin tüm amacı işlevselliği temsil etmektir - genel sınıf bir şey yapar, argümanı başka bir şey yapar. Ders kitabı örneği genel bir koleksiyon: koleksiyon 'şeyleri' saklar, ancak bunların ne olduğu umurumda değil. Bu nedenle, genel bir ad (sic!) Belirli bir mantığa sahiptir - açıklayıcı olmasını istemiyoruz, çünkü adın "bu genel tür argümanı" dışında açıklanacak hiçbir şey yoktur.T kapsamlı bir şekilde kapsadığı (dikkate alınarak sözleşmesi). Açıklayıcı olmak iyidir, ancak aşırı açıklayıcı olmak, orada olmayan kısıtlamaları önerir.

Bununla birlikte, bazen, genel bir sınıf veya yöntem birden fazla tür parametresine sahiptir ve bu noktada, onlara daha açıklayıcı adlar vermek mantıklıdır, böylece rolleri belirginleşir. Buna iyi bir örnek, hem anahtar hem de değerin genel olduğu bir anahtar / değer toplama türü olabilir; Onları çağıran Tve S(veya Qya da her neyse) diyelim ki, onları çağıran daha az yararlı olabilir, olacaktır KeyTypeve ValueTypeya TKeyve TVal.


1

Cevap gerçekten özneldir. Bununla birlikte, kodun kendi kendini belgelemesi gerektiği için bir soru olarak değeri vardır ve muhtemelen bunu yapmanın daha iyi yollarını öğrenebiliriz.

Aşağıda öğrendiğim ve takip ettiğim sözleşmeler var:

  • Genel tip parametreleri hiçbir zaman somut sınıflarla karıştırılmamalıdır. Bu, genellikle Tne olursa olsun, genellikle ön arayüzler gibi bir önsözü teşvik eder I.

  • Bir sınıf veya yöntemdeki tek bir genel tip parametresi genellikle etiketlenmelidir T. Bu, C ++ şablonlarına dayanan, evrensel olarak anlaşılmış bir konudur.

  • Aynı sınıf veya yöntem bildirimindeki birden fazla genel tip parametresinin tümü T ile başlamalı, ancak bazı kısa ama anlaşılabilir araçlarla ayırt edilmelidir. TInve TOutörneğin, kuvvetle yazılmış bir genel girdiyi kabul eden ve kuvvetle yazılmış bir genel çıktı üreten bir yöntem için ortak ve iyi anlaşılmış GTP'lerdir.

  • Net'in Tuple gibi bir sınıf için veya Func, Predicate ve Action gibi delege türleri gibi birden çok farklılaştırılmış ancak dikkat çekici olmayan türler T1, T2, T3 vb. Olarak etiketlenebilir. Bununla birlikte, "dikkat çekici" GTP bildirimleri / veya çok spesifik tür kısıtlamaları) daha açıklayıcı bir şeye sahip olmalıdır.

  • Bir kapsayıcı sınıfın genel türünden farklı olan bir yöntemin tek bir genel türü, bir sınıf veya yöntemdeki birden çok türle ilgili önceki kuralı izleyebilir veya VEYA tür farklı olmaktan farklıysa, farklı bir verilebilir. tek harf, genellikle Uveya V. Bu yine C ++ şablonlarına dayanan bir kuraldır.

  • Ne yaparsanız yapın, tutarlı tutun; ikinci sınıf ilkinde iç içe geçmediği sürece ikinci sınıfta ikinci sınıfta kullanım için uygun olmadığında GTP'yi bir sınıf Tve sonraki sınıf için etiketlemeyin .TParamT

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.