Kodlama Kuralları - Numaralandırma Adlandırma


289

Java'da numaralandırma adlandırma kuralı var mı?

Benim tercihim, bir enumun bir tür olmasıdır. Yani, örneğin, bir enum var

Fruit{Apple,Orange,Banana,Pear, ... }

NetworkConnectionType{LAN,Data_3g,Data_4g, ... }

Ben isimlendirmeye karşıyım:

FruitEnum
NetworkConnectionTypeEnum

Hangi dosyaların numaralandırıldığını seçmenin kolay olduğunu anlıyorum, ancak daha sonra da sahip olacaksınız:

NetworkConnectionClass
FruitClass

Ayrıca, sabitler, nerede bildirileceği vb. İçin de aynı şeyi açıklayan iyi bir belge var mı?


2
Lütfen bunu bir Topluluk Wiki'si yapın. Kabul edilebilir tek bir cevap olmadığı için, aksi halde kapanır.
Alexander Pogrebnyak

13
@Alexander Pogrebnyak Hayır, bir cevap var.
Tom Hawtin - tackline

Yanıtlar:


473

Numaralandırmalar sınıftır ve sınıf kurallarına uymalıdır. Bir enum örnekleri sabittir ve sabitlerin kurallarına uymalıdır. Yani

enum Fruit {APPLE, ORANGE, BANANA, PEAR};

FruitEnum'u FruitClass'tan daha fazla yazmaya gerek yok. Sadece bilgi eklemeyen dört (veya beş) karakter harcıyorsun.

Java'nın kendisi bu yaklaşımı önerir ve örneklerinde kullanılır .


22
Numaralandırmalarımı bu şekilde adlandırmaya başladım, ancak okunabilirlik için şimdi Fruit.APPLE yerine Fruit.Apple kullanıyorum.

38
@Walter Bir numaralandırma örneğinin neden bir sınıfın okunabilirliği artırdığı gibi görünmesini sağlıyorsunuz?
DJClayworth

17
Teknik olarak, enum örnekleri şunlardır sınıflar. Bu yüzden yöntemleri olabilir.
Ted Hopp

87
Hayır, bir enum örneği bir örnektir. Bir enum bir sınıftır.
DJClayworth

30
Bana Fruit.APPLE.chew () yazmamı sağlayan bir adlandırma deseni fikri gerçekten beni rahatsız ediyor. Ayrıca, çok kötü bir uygulama olsa da, APPLE'nin sabit (değişmez) olması gerekmez. Tam java sınıflarına enums tanıtımı ile c bile var olmayan bir şey için geliştirilen konvansiyonları kullanmak emin değilim (Objeler değil, enums) her zaman mantıklı
Bill K

76

Bu muhtemelen beni çok fazla yeni arkadaş edinmeyecek, ancak C # kişilerin farklı bir yönergesi olduğu da eklenmelidir: Enum örnekleri "Pascal davası" (büyük / küçük harf karışık). Bkz stackoverflow tartışma ve MSDN Sayım Tipi Adlandırma Yönergeleri .

Bir C # sistemi ile veri alışverişi yaparken, Java'nın "sabitlerinin büyük harf adları var" kuralını görmezden gelerek numaralarını tam olarak kopyalamaya cazipim. Bunu düşündüğümde, enum örnekleri için büyük harfle sınırlı olmanın fazla bir değerini görmüyorum. Bazı amaçlar için .name (), bir enum sabitinin okunabilir bir gösterimini elde etmek için kullanışlı bir kısayoldur ve karışık bir vaka adı daha güzel görünecektir.

Yani, evet, Java enum adlandırma kuralının değerini sorgulamaya cüret ediyorum. “Programlama dünyasının diğer yarısının” gerçekten de farklı bir stil kullandığı gerçeği beni kendi dinimizden şüphe etmenin meşru olduğunu düşündürüyor.


7
Yalnızca Java veya C # programcılarının gerçek programcılar olduğu ve sayılarının eşit olduğu TIL . #sarcasm
Mindwin

14
C #, aksi takdirde harika bir dildir, ancak bu sadece aptalca bir dildir. Temelde hiçbir adlandırma kuralına sahip olmakla aynı olmayan C # 'da her şey paskal durumda; bir isme bakarak hiçbir şey kazanmazsınız. Bunun bir sınıf, yöntem, mülk vb.
Olup

3
Ayrıca, boolean pratik olarak bir numaralandırmadır, örnekler doğru ve yanlıştır, küçük harfle. Yani evet, tüm kapaklar çirkin.
Florian F

@FlorianF, birincil boolean türünü Boolean sınıfıyla karıştırmayın ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). sınıf büyük harfli kongre kullanıyor
IvoC

24

Daha önce belirtildiği gibi, enum örnekleri Oracle web sitesindeki ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ) dokümanlara göre büyük harf olmalıdır .

Ancak, Oracle web sitesinde ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ) bir JavaEE7 öğreticisine bakarken , "Dük'ün kitapçı" öğreticisine ve bir sınıfa rastladım ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), Aşağıdaki numaralandırma tanımını buldum:

private enum PropertyKeys {
    alt, coords, shape, targetImage;
}

Sözleşmelere göre, şöyle görünmeliydi:

public enum PropertyKeys {
    ALT("alt"), COORDS("coords"), SHAPE("shape"), TARGET_IMAGE("targetImage");

    private final String val;

    private PropertyKeys(String val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return val;
    }
}

Öyle görünüyor ki Oracle'daki adamlar bile bazen rahatlıkla ticaret sözleşmesi yapıyorlar.


13

Kod tabanımızda; tipik olarak ait oldukları sınıftaki sıralamaları beyan ederiz.

Bu yüzden Meyve örneğiniz için, bir Meyve sınıfımız olacaktı ve bunun içinde Meyve olarak adlandırılan bir Enum vardı.

Kodda başvurmak şöyle görünür: Fruit.Fruits.Apple, Fruit.Fruits.Pear vb.

Sabitler aynı çizgiyi takip ederler, burada ya alakalı oldukları sınıfta tanımlanırlar (örneğin Fruit.ORANGE_BUSHEL_SIZE); veya "ConstantManager" adlı bir sınıfa (veya eşdeğeri; örneğin, ints için eşdeğer bir "null değer") uygularlarsa veyaConstantManager.NULL_INT ) . (yan not; tüm sabitlerimiz büyük harftir)

Her zaman olduğu gibi, kodlama standartlarınız muhtemelen benimkinden farklıdır; yani YMMV.


5
Nesne fabrikalarının günümüzde çoğullar kullanılarak adlandırıldığını Listsve örneğin Maps. Bence bu iyi bir kongre ve daha yaygın kullanımını tamamen destekliyorum.
Esko

Evet, kişisel kodlama standartlarıma benziyorlar, ancak işyeri kodlama standartlarımdan farklılar. İş için birçok standartımız yok, bu yüzden referans olarak kullanmak için iyi bir belge bulmaya çalışıyorum.

8
Fruit.Fruits.Appletam anlamıyla KURU prensibini kırarak bana çok ayrıntılı :-) Örneğin tercih ederim Fruit.Type.APPLE.
Péter Török

2
Bu yaklaşımı sevmiyorum. Bunun adı, bir Elma ya bir Meyvedir ya da en azından kafa karıştırıcıdır çünkü Apple'ın bir Meyve olmadığı açık değildir. Peter Type örneğini seviyorum. En azından APPLE'nin bir tür meyve olduğunu kendi kendine belgeliyor. Bütün bu meyve örneği biraz çürük kokuyor olsa da
Mark Peters

1
Ben de bundan hoşlanmıyorum. Eğer 'Meyve' sınıfı bir meyveyi temsil ediyorsa (ve olmalıdır) o zaman 'Meyveler' neyi temsil edebilir? Fruit (sınıf) gerçekten Fruit ile başa çıkmak için bir sınıfsa, "FruitHandler" veya "FruitManager" olarak yeniden adlandırılmalıdır.
DJClayworth

7

Hala türler, bu yüzden her zaman sınıflar için kullandığım aynı adlandırma kurallarını kullanıyorum.

Kesinlikle bir adı "Sınıf" veya "Enum" koymak kaşlarını çattı. Hem CSV varsa FruitClassve bir FruitEnumbaşka sonra bir sorun olduğunu ve daha açıklayıcı isim istiyoruz. Her ikisi de ihtiyaç yol açacaktır kod tür düşünmeye çalışıyorum ve bir olması gerektiği gibi görünüyorFruit ve bir enum yerine alt tipleri ile temel sınıf . (Bu sadece benim spekülasyonum, hayal ettiğimden farklı bir durumun olabilir.)

Sabitleri adlandırmak için bulabildiğim en iyi başvuru Değişkenler öğreticisinden geliyor :

Seçtiğiniz ad yalnızca bir kelimeden oluşuyorsa, bu kelimeyi tüm küçük harflerle yazın. Birden fazla kelimeden oluşuyorsa, sonraki her kelimenin ilk harfini büyük yazınız. GearRatio ve currentGear isimleri bu sözleşmenin başlıca örnekleridir. Değişkeniniz statik son int NUM_GEARS = 6 gibi sabit bir değer depolarsa, kural her harf büyük yazılır ve sonraki kelimeleri alt çizgi karakteriyle ayırır. Kural olarak, alt çizgi karakteri asla başka bir yerde kullanılmaz.



1

Benim $ 0.02 ekleyebilir, ben PascalCase C enum değerleri olarak kullanmayı tercih.

C'de temel olarak küreseldirler ve PEER_CONNECTED, PeerConnected'ın aksine gerçekten yorucu olur.

Temiz havayı solu.

Kelimenin tam anlamıyla, daha kolay nefes almamı sağlıyor.

Java'da, başka bir sınıftan statik olarak içe aktardığınız sürece ham enum adlarını kullanmak mümkündür.

import static pkg.EnumClass.*;

Şimdi, zaten farklı bir şekilde nitelendirdiğiniz niteliksiz adları kullanabilirsiniz.

Şu anda (C) bazı C kodunu Java'ya taşımak ve şu anda Java konvansiyonu (daha ayrıntılı, daha uzun ve daha çirkin) ve C tarzımı seçmek arasında 'yırtılmış' olduğunu düşünüyorum.

PeerConnected, CONNECTED olan anahtar ifadeleri dışında PeerState.CONNECTED olur.

Şimdi ikinci konvansiyon için söylenecek çok şey var ve bu hoş görünüyor ama nostaljik if (s == PeerAvailable)gibi if (s == PeerState.AVAILABLE)ve "niyotik" gibi bazı "deyimsel ifadeler" bu benim için bir anlam kaybı.

Ben hala netlik nedeniyle Java stilini tercih düşünüyorum ama çığlık kodu bakarak zor anlar var.

Şimdi PascalCase'in Java'da zaten yaygın olarak kullanıldığını, ancak gerçekten kafa karıştırıcı olmayacağını çok kafa karıştırıcı olduğunu fark ediyorum.


0
enum MyEnum {VALUE_1,VALUE_2}

(yaklaşık) demek gibi

class MyEnum {

    public static final MyEnum VALUE_1 = new MyEnum("VALUE_1");
    public static final MyEnum VALUE_2 = new MyEnum("VALUE_2");

    private final name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String name() { return this.name }
}

bu yüzden tüm büyük harflerin kesinlikle daha doğru olduğunu düşünüyorum, ama yine de sınıf adı kuralını kullanıyorum çünkü tüm büyük harflerden her yerde nefret ediyorum

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.