Конвенції про кодування - називання перерахунків


289

Чи існує угода про іменування перерахувань на Java?

Моя перевага полягає в тому, що перерахунок - це тип. Так, наприклад, у вас є перерахунок

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

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

Я проти називати це:

FruitEnum
NetworkConnectionTypeEnum

Я розумію, легко вибрати, які файли є перерахунками, але тоді у вас також буде:

NetworkConnectionClass
FruitClass

Також, чи є хороший документ, що описує те саме для констант, де їх декларувати тощо?


2
Будь ласка, зробіть це спільнотою Wiki. Оскільки єдиної прийнятної відповіді немає, і в іншому випадку вона закриється.
Олександр Погребняк

13
@ Олександр Погребняк Ні, відповідь є.
Том Хоутін - тайклін

Відповіді:


473

Енуми - це заняття і повинні дотримуватися конвенцій про класи. Примірники перерахунку є константами і повинні дотримуватися конвенцій про константи. Так

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

Немає жодної причини писати FruitEnum більше, ніж FruitClass. Ви просто витрачаєте чотири (або п’ять) символів, які не додають інформації.

Сама Java рекомендує такий підхід, і він використовується в їх прикладах .


22
Я почав називати свої перерахунки таким чином, але для читабельності зараз використовую Fruit.Apple замість Fruit.APPLE.

38
@Walter Чому так, щоб екземпляр enum виглядав так, що це клас підвищує читабельність?
DJClayworth

17
Технічно, перелічні екземпляри - це заняття. Тому вони можуть мати методи.
Тед Хопп

87
Ні, екземпляр перерахунку - це екземпляр. Перерахунок - клас.
DJClayworth

30
Ідея шаблону імен, що змушує мене набрати Fruit.APPLE.chew (), насправді помиляє мене. Крім того, хоча це було б дуже поганою практикою, APPLE не повинен бути постійним (незмінним). З просуванням переліків на повноцінні класи Java, я не впевнений, що використання конвенцій, розроблених для чогось, що навіть не було в c (Об'єкти, а не перерахунки), завжди має сенс
Білл К

76

Це, мабуть, не зробить мені багато нових друзів, але слід додати, що люди з C # мають інший настанов: Екземпляри перерахунків - це "справа Паскаля" (верхній / нижній регістр змішаний). Див. Дискусію щодо stackoverflow та вказівки щодо іменування типу переліку MSDN .

Оскільки ми обмінюємось інформацією із системою C #, я спокусився точно скопіювати їх перерахунки, ігноруючи конвенцію Java про «константи мають великі імена». Думаючи про це, я не бачу великої цінності в тому, щоб обмежитися великими літерами для екземплярів. Для деяких цілей .name () - це зручний ярлик для отримання читабельного зображення константи enum, а змішане ім'я регістру виглядатиме приємніше.

Отже, так, я наважуюся поставити під сумнів значення конвенції про іменування Java enum. Той факт, що "інша половина світу програмування" дійсно використовує інший стиль, змушує мене думати, що законно сумніватися у нашій власній релігії.


7
ПЕРЕКЛЮЧИТЬ, що справжні програмісти лише Java або C # і що їх кількість дорівнює. #sarcasm
Mindwin

14
C # - це інакше чудова мова, але це просто нерозумно. У C # все є значною мірою паскальним випадком, що в основному те саме, що взагалі немає конвенцій про іменування; ви нічого не отримуєте, дивлячись на ім’я. Ви не можете сказати, чи це клас, метод, властивість тощо.
Bassinator

3
Крім того, булевий - практично перерахунок, випадки бувають істинними та хибними, малі. Так що так, усі шапки некрасиві.
Флоріан F

@FlorianF, не плутайте булевий тип основного типу з класом Boolean ( docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html ). клас використовує верхній регістр
IvoC

24

Як уже зазначалося, екземпляри enum мають бути великими літерами відповідно до документів на веб-сайті Oracle ( http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html ).

Однак, переглядаючи навчальний посібник JavaEE7 на веб-сайті Oracle ( http://www.oracle.com/technetwork/java/javaee/downloads/index.html ), я натрапив на навчальний посібник «Книжковий магазин Дюка» та в класі ( tutorial\examples\case-studies\dukes-bookstore\src\main\java\javaeetutorial\dukesbookstore\components\AreaComponent.java), Я знайшов таке визначення enum:

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

Згідно з умовами, воно повинно виглядати так:

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;
    }
}

Так здається, навіть хлопці з Oracle іноді торгують з'їздом із зручністю.


13

У нашій кодовій базі; ми, як правило, оголошуємо переліків у класі, до якого вони належать.

Отже, для вашого прикладу Fruit, у нас був би клас Fruit, а всередині - Enum під назвою Fruits.

Посилання на нього у коді виглядає приблизно так: Fruit.Fruits.Apple, Fruit.Fruits.Pearтощо.

Константи слідують за тим самим рядком, де вони або визначаються в класі, до якого вони відповідають (так щось подібне Fruit.ORANGE_BUSHEL_SIZE); або якщо вони застосовують загальносистемні (тобто еквівалентні "нульові значення" для ints) у класі, названому "ConstantManager" (або еквівалент; подібний ConstantManager.NULL_INT). (бічна примітка; всі наші константи знаходяться у верхньому регістрі)

Як завжди, ваші стандарти кодування, ймовірно, відрізняються від моїх; так YMMV.


5
Хочу додати, що, здається, зараз об'єктивні фабрики називають множинами, наприклад, Listsта Maps. На мою думку, це хороша умова, і я повністю підтримую її більш широке використання.
Есько

Так, вони схожі на мої персональні стандарти кодування, але відрізняються від моїх стандартів кодування на робочому місці. У нас не так багато стандартів для роботи, тому я намагаюся знайти хороший документ, який можна використовувати в якості посилання.

8
Fruit.Fruits.Appleдля мене занадто багатослівний, буквально порушуючи принцип DRY :-) Я вважаю за краще, наприклад Fruit.Type.APPLE.
Péter Török

2
Мені не подобається такий підхід. Як це називається, Apple або є - фруктами, або, принаймні, збиває з пантелику, оскільки не ясно, що Apple - це не фрукт. Мені подобається приклад типу Петра. Принаймні тоді це самодокументування того, що APPLE - це тип фрукта. Хоча цей приклад із цілих фруктів пахне якось гнилим ...
Марк Петерс

1
Мені це теж не подобається. Якщо клас "Фрукти" являє собою фрукт (і він повинен), то що може представляти "Фрукти"? Якщо Fruit (клас) дійсно є класом для спілкування з Fruit, його слід перейменувати на "FruitHandler" або "FruitManager".
DJClayworth

7

Вони все ще є типами, тому я завжди використовую ті самі умови іменування, які я використовую для класів.

Я, безумовно, нахмурився б, щоб ввести ім’я "Class" або "Enum". Якщо у вас є і a, FruitClassі FruitEnumтоді щось інше не так, і вам потрібні більш описові назви. Я намагаюся думати про тип коду, який би призвів до необхідності обох, і, здається, повинен бути Fruitбазовий клас із підтипами замість enum. (Це лише мої власні домисли, хоча у вас може виникнути інша ситуація, ніж те, що я уявляю.)

Найкраща посилання, яку я можу знайти для іменування констант, походить з підручника « Змінні» :

Якщо вибране ім’я складається лише з одного слова, напишіть це слово всіма малими літерами. Якщо воно складається з декількох слів, з великої літери напишіть кожне наступне слово. Назви gearRatio та currentGear - основні приклади цієї конвенції. Якщо ваша змінна зберігає постійне значення, наприклад, статичний кінцевий int NUM_GEARS = 6, умовна умова змінюється незначно, використовуючи великі літери і відокремлюючи наступні слова символом підкреслення. За умовою, символ підкреслення ніколи не використовується в іншому місці.


Довідка щодо іменування констант знаходиться на oracle.com/technetwork/java/javase/documentation/…
Christoffer Hammarström

1

Якщо я можу додати 0,02 долара, я вважаю за краще використовувати PascalCase як значення перерахунків у С.

В C вони в основному глобальні, і PEER_CONNECTED стає дійсно стомлюючим на відміну від PeerConnected.

Подих свіжого повітря.

Буквально це змушує мене дихати легше.

У Java можна використовувати нераціональні імена enum, поки ти статично імпортуєш їх з іншого класу.

import static pkg.EnumClass.*;

Тепер ви можете використовувати некваліфіковані імена, які ви вже кваліфікували по-іншому.

Наразі я (думаю) про перенесення деякого коду С на Java і наразі 'розірваний' між вибором Java-конвенції (яка є більш багатослівною, більш тривалою та потворною) та моїм стилем C.

PeerConnected стане PeerState.CONNECTED, за винятком операторів перемикання, де це З'єднано.

Зараз для останньої конвенції можна сказати багато, і це виглядає приємно, але певні "ідіоматичні фрази", такі як if (s == PeerAvailable)стати подібними if (s == PeerState.AVAILABLE)та ностальгічно, для мене це втрата сенсу.

Я думаю, що я все ще віддаю перевагу стилю Java через ясність, але мені важко дивитися на кричущий код.

Тепер я розумію, що PascalCase вже широко використовується на Java, але дуже заплутаною ситуацією насправді цього не було б, просто невдало.


0
enum MyEnum {VALUE_1,VALUE_2}

(приблизно) як сказати

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 }
}

тож я здогадуюсь, що всі літери суворо правильніші, але все ж я використовую умову назви класу, оскільки я ненавиджу всі шапки куди завгодно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.