Java için genel tür parametresi adlandırma kuralı (birden çok karakterli)?


125

Yazdığım bazı arayüzlerde, kodu daha okunaklı hale getirmek için jenerik tip parametrelerini birden fazla karakterle adlandırmak istiyorum.

Gibi bir şey....

Map<Key,Value>

Bunun yerine...

Map<K,V>

Ancak yöntemler söz konusu olduğunda, tür parametreleri java sınıfları gibi görünür ve bu da kafa karıştırıcıdır.

public void put(Key key, Value value)

Bu, Anahtar ve Değer sınıfları gibi görünüyor. Bazı gösterimler buldum veya düşündüm, ancak Sun'tan bir sözleşme veya genel bir en iyi uygulama gibisi yok.

Tahmin ettiğim veya bulduğum alternatifler ...

Map<KEY,VALUE>
Map<TKey,TValue>

9
Neden yeni bir kongre oluşturmak istiyorsunuz?
Amir Afghani

13
@AmirAfghani Sorudan: kodu daha okunaklı hale getirmek için.
SantiBailors

Teknik olarak,
IDE'deki

Yanıtlar:


182

Oracle, Java Tutorials> Generics> Generic Types bölümünde şunları önermektedir :

Tip Parametre Adlandırma Kuralları

Kural olarak, tür parametresi adları tek, büyük harflerdir. Bu, zaten bildiğiniz değişken adlandırma kurallarıyla keskin bir tezat oluşturuyor ve bunun iyi bir nedeni var: Bu kural olmasaydı, bir tür değişkeni ile sıradan bir sınıf veya arabirim adı arasındaki farkı söylemek zor olurdu.

En sık kullanılan tür parametresi adları şunlardır:

  • E - Element (Java Collections Framework tarafından yaygın olarak kullanılır)
  • K - Anahtar
  • N - Sayı
  • T - Tür
  • V - Değer
  • S, U, V vb. - 2., 3., 4. türler

Bu adların Java SE API ve bu dersin geri kalanında kullanıldığını göreceksiniz.

Geliştiriciler ve olası geliştiriciler arasındaki karışıklığı önlemek için buna bağlı kalırım.


14
Yeni akış çerçevesi ayrıca Rsonuç ve Aakümülatör için kullanır .
vandale

32
Blech, tek harfli adlandırma. Bu geleneği takip ediyorum çünkü gelenek tanımlayıcı isimlerden daha önemli, ama bulabildikleri en iyisi bu olması üzücü.
warbaker

4
@warbaker: Parametreli türleri gerçek sınıflardan ayırmanın iyi bir yolunu buluyorum. Aksi takdirde örneğin Elementin List<Element>parametreleştirilmiş bir tür mü yoksa bir sınıf mı olduğunu nasıl anlarsınız ?
BalusC

1
Bu geleneğe uymuyor BiFunction<T, U, R>. Olsaydı, olurdu BiFunction<T, S, R>.
michaelsnowden

4
Parametreli türleri gerçek sınıflardan ayırt etme endişesi neden? Bunlar şunlardır sınıflar. Ne olursa olsun, ne olarak tanımlandıklarını bulmak için dosyada bir yeri yukarı kaydırmanız gerekir. Ve ya bir içe aktarma ya da parametreli bir tür olacaktır.
Vectorjohn

47

ekleme Type

DZone sayfasındaki, Parametreli Tipler için Adlandırma Kuralları olan yorumlarda iyi bir tartışma bulunabilir .

Erwin Mueller'in yorumuna bakın. ÖnerisiType bana çok açık bir anlam ifade ediyor: Kelimeyi ekleyin .

Bir elmaya elma, arabaya araba deyin. Söz konusu isim, bir veri türünün adı değil mi? ( OOP'de , bir sınıf esasen yeni bir veri türünü tanımlar.) Bu nedenle ona "Tür" deyin.

Orijinal gönderinin makalesinden alınan Mueller'in örneği:

public interface ResourceAccessor < ResourceType , ArgumentType , ResultType > {
    public ResultType run ( ResourceType resource , ArgumentType argument );
}

ekleme T

Yinelenen bir Soru, Andy Thomas tarafından bu Cevabı sağlar . Çok karakterli bir tür adının tek bir büyük harfle bitmesi gerektiğini öneren Google'ın stil kılavuzundan alıntıya dikkat edin T.


3
Bu cevabı beğendim. "Tür" eklemek çok net ve açıklayıcı adlara sahip olmanızı sağlar. İnsanların başka hiçbir gerekçe olmadan "bunu yap çünkü bu bir kongre" demelerinden bıktım. Kötü bir kongre ise, belki yenisine ihtiyacımız var.
Drew

16

Resmi adlandırma kuralının tek harf kullanılmasını önermesinin nedeni şudur:

Bu kural olmadan, bir tür değişkeni ile sıradan bir sınıf veya arabirim adı arasındaki farkı söylemek zor olurdu.

Modern IDE'lerde bu nedenin artık örneğin geçerli olmadığını düşünüyorum. IntelliJ Idea, normal sınıflardan farklı renklere sahip genel tür parametrelerini gösterir.

IntelliJ Idea 2016.1'de görüntülendiği şekliyle genel türe sahip kod IntelliJ Idea 2016.1'de görüntülendiği şekliyle genel türe sahip kod

Bu ayrım nedeniyle, genel türlerim için normal türlerle aynı kurala sahip daha uzun açıklayıcı adlar kullanıyorum . Gereksiz gürültü olduğunu düşündüğüm ve genel türleri görsel olarak ayırt etmek için artık gerekli olmadığından T veya Type gibi önek ve son ekleri eklemekten kaçınıyorum.

Not: Eclipse veya Netbeans kullanıcısı olmadığım için, benzer bir özellik sunup sunmadıklarını bilmiyorum.


Adlandırma kurallarını, aynı dosyayı okuyan / değiştiren her kişinin sahip olacağı araçların varsayılan yeteneklerine dayandırmazdım. Kişisel olarak kodlamam için bir IDE olmayan bir metin editörü (Sublime Text) kullanmayı seviyorum. Metin editörleri günümüzde genellikle sözdizimi renklendirmesine sahipler, ancak değişken adlarını doğru şekilde renklendirmek için gerekli olacağını düşündüğüm temel kod yapısını derinlemesine anlamıyorlar. Ve bu argümanı renge dayandırmak, doğası gereği renk görüşü zayıf olan insanlara özeldir (ben kırmızı-yeşil renk körlüğü olan erkeklerin%
8'inin bir parçasıyım

1
Renk görüşü zayıf olan insanlarla ilgili iyi bir nokta. IDE'leri kullanmama ile ilgili olarak - insanlar basit metin editörlerini kullanmayı tercih ederse, sorun değil, ancak IDE'lerin kendilerine sunduğu özellikleri daha hafif araçlar lehine gönüllü olarak feda ediyorlar. Bu, eksik olan özelliklerden sadece biri olabilir. Sonunda, tek bir harf yerine açıklayıcı bir isim kullanılıyorsa, IDE olmadan ve renk kodlaması olmadan isme göre anlamı söyleyebilmelisiniz. Renk kodlaması bunu daha hızlı hale getirir.
Vojtech Ruzicka

16

Evet, sınıf adlarından açıkça ayırt edildikleri sürece, tür değişkenleri için çok karakterli adlar kullanabilirsiniz.

Bu, 2004 yılında jenerik ilaçların piyasaya sürülmesiyle Sun tarafından önerilen sözleşmeden farklıdır. Ancak:

  • Birden fazla kongre var.
  • Çok karakterli adlar, Google'ın Java stili gibi diğer Java stilleriyle tutarlıdır .
  • Okunabilir isimler (sürpriz!) Daha okunabilir.

Okunabilirlik

Yazdığım bazı arayüzlerde, kodu daha okunaklı hale getirmek için genel tür parametresini birden fazla karakterle adlandırmak istiyorum.

Okunabilirlik iyidir.

Karşılaştırmak:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

için:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

veya Google'ın çok karakterli kuralına göre:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

Google stili

Google Java Stil Kılavuzu verir tek harfli isimler ve çoklu karakter sınıfı benzeri T. ile biten isimlerin hem

5.2.8 Değişken adlarını yazın

Her tür değişkeni iki stilden birinde adlandırılır:

  • İsteğe bağlı olarak tek bir sayı ile ve ardından tek bir harf, (örneğin E, T, X, T2)

  • Sınıflar için kullanılan formda bir isim (Bölüm 5.2.2, bkz Sınıf isimleri ), büyük harfle T (: örnekler takiben RequestT, FooBarT).

Sorunlar

"Bu kural olmadan, bir tür değişkeni ile sıradan bir sınıf veya arabirim adı arasındaki farkı söylemek zor olurdu." - Oracle eğiticilerinden, "Genel türler"

Yukarıda gördüğümüz gibi, tip parametrelerini sınıf isimlerinden ayırmanın tek yolu tek karakterli isimler değildir.

Neden JavaDoc'ta tür parametresinin anlamını belgelemiyorsunuz?

@paramJavaDoc öğelerinin daha uzun bir açıklama sağlayabileceği doğrudur . Ancak JavaDoc'ların mutlaka görünür olmadığı da doğrudur. (Örneğin, Eclipse'de tür parametresi adlarını gösteren bir içerik yardımcısı vardır.)

Çok karakterli tür parametre adları Oracle kuralına uymaz!

Sun'ın orijinal kurallarının çoğu Java programlamasında neredeyse evrensel olarak takip edilmektedir.

Ancak bu özel kongre değildir.

Rakip konvansiyonlar arasında en iyi seçim bir fikir meselesidir. Bu durumda Oracle'ın dışında bir kongre seçmenin sonuçları önemsizdir. Siz ve ekibiniz ihtiyaçlarınızı en iyi karşılayan bir kongre seçebilirsiniz.


15

Javadoc'u en azından genel sınıfınızın kullanıcılarına bir ipucu vermek için kullanabilirsiniz. Yine de beğenmedim (@ chaper29'a katılıyorum) ama dokümanlar yardımcı oluyor.

Örneğin,

/**
 * 
 * @param <R> - row
 * @param <C> - column
 * @param <E> - cell element
 */
public class GenericTable<R, C, E> {

}

Yaptığım diğer bir şey de, IDE'mi, kuralı bozan bir sınıfı yeniden düzenlemek için kullanmaktır. Ardından kod üzerinde çalışın ve yeniden tek harflere dönüştürün. Birçok tür parametresinin kullanılması benim için zaten kolaylaştırıyor.


1
Tür parametreleri için Javadoc yorumlarının genellikle bir zorunluluk olduğunu söyleyebilirim.
migu
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.