Як позначити логічні розділи коду в коментарях Java?


92

Класи Java, як правило, поділяються на логічні "блоки". Чи існує конвенція для позначення цих розділів? В ідеалі це було б підтримано основними середовищами розробки.

Я особисто використовую цей метод:

//// Section name here ////

Однак у деяких редакторів, схоже, є проблеми з цим.

Як приклад, у коді Objective-C ви можете використовувати цей метод:

#pragma mark -
#pragma mark Section name here

У результаті з’явиться меню в XCode, яке виглядатиме так:

текст заміщення


4
як розробник iOS, саме це мені найбільше не вистачало, коли я починав працювати з Android Studio
Кріс Чен

1
проти: "Сучасні середовища розробки та мови це погана практика. Якщо вам доведеться секціонувати свій код, ви, мабуть, уже порушили Принцип єдиної відповідальності, і краще розділити його на різні класи / файли. Якщо є кілька редакторів, це, мабуть, через деякий час не синхронізується, оскільки деякі дотримуватимуться цього, деякі рефакторингуватимуть та реорганізовуватимуть код, або дії автоматичного збереження та форматування порушать його.
f.carlsen

проти: Я погоджуюсь з @ f.carlsen. Якщо ви структуруєте свій клас за допомогою коментарів, ви, швидше за все, порушите Принцип єдиної відповідальності .
schrieveslaach

Ненависникам: зателефонуйте мені, коли Java підтримує розширення класу в стилі Swift, де ви можете логічно розділити реалізації свого інтерфейсу на різні розділи. І так, клас може добре реалізувати кілька інтерфейсів одночасно.
Вільям Ентрікен

Відповіді:


66

Я особисто використовую 80-символьні лінійні роздільники, наприклад:

public class Client {

    //================================================================================
    // Properties
    //================================================================================

    private String name;
    private boolean checked;

    //================================================================================
    // Constructors
    //================================================================================

    public Client() {
    }

    public Client(String name, boolean checked) {
        this.name = name;
        this.checked = checked;
    }

    //================================================================================
    // Accessors
    //================================================================================

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

}

Звичайно, це може здатися трохи надмірним для такого маленького POJO, але, повірте, це виявилося дуже корисним у деяких величезних проектах, де мені довелося переглядати великі вихідні файли та швидко знаходити методи, які мене цікавили. Це також допомагає зрозуміти структура вихідного коду.

В Eclipse я створив набір користувацьких шаблонів (Java -> Редактор -> Шаблони у діалоговому вікні Налаштування Eclipse), які генерують ці смуги, наприклад. - sepa (SEParator для Accessors) - sepp (SEParator для властивостей) - sepc (SEParator для конструкторів) - і т.д.

Я також змінив стандартний шаблон "новий клас" (Java -> Стиль коду -> Шаблони коду на екрані Налаштування Eclipse)

Крім того, існує старий плагін Eclipse, який називається Coffee-bytes , що покращило спосіб складання Eclipse частин коду. Я не знаю, чи все ще це працює, але я пам’ятав, що можна було визначити довільні складні зони, додавши спеціальні коментарі, наприклад // [РОЗДІЛ] чи щось інше. Це може все ще працювати в останніх версіях Eclipse, тому погляньте.


145

Для intellij / android studio є дивовижне рішення.
Почніть з:
//region Description
і закінчіть на:
//endregion

Ярлик для цього є в меню, яке ви можете відкрити за допомогою Command+ Alt+ T(Mac) або Ctrl+ Alt+ T(Windows)

Ви також можете додати власну лінію для додаткового візуального відокремлення, якщо вона вам потрібна. Регіон можна скоротити та розширити за бажанням кнопками +/-, як будь-яка функція. Ви також можете переміщатися між регіонами за допомогою Command+ Alt+ Period( Ctrl+ Alt+ Period)

Джерело .

Приклад:

//region Parceler Implementation
//---------------------------------------------------------------------------------------
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeParcelable(this.die, 0);
    dest.writeParcelable(this.dieSprite, 0);
}

private DieVm(Parcel in) {
    this.die = in.readParcelable(Die.class.getClassLoader());
    this.dieSprite = in.readParcelable(Sprite.class.getClassLoader());
}

public static final Parcelable.Creator<DieVm> CREATOR = new Parcelable.Creator<DieVm>() {
    public DieVm createFromParcel(Parcel source) {
        return new DieVm(source);
    }

    public DieVm[] newArray(int size) {
        return new DieVm[size];
    }
};
//---------------------------------------------------------------------------------------
//endregion

Це неймовірно корисно Дякую Андрію. До речі, я використовую розкладку клавіатури eclipse, і я не думаю, що комбінації клавіш у мене працюють, але "// регіон" чудово працює
ThinkBonobo,

2
Я не бачу жодного способу, щоб це відображалося у поданні структури, тому я все ще використовую підроблені порожні члени (разом із придушенням невикористаного попередження).
Том

1
чи є спосіб показати ці регіони в Android Studio (Структурний вигляд)?
MiguelHincapieC

Посилання мертве; цей блог IntelliJ IDEA може бути корисним посиланням. У ньому також згадуються складні предмети у стилі NetBeans <editor-fold ...> .
Франклін Ю

найкраща відповідь
Michał Ziobro

14

Eclipse визначає анотацію @category javadoc (прокрутіть до розділу з позначкою "Підтримка категорій"), що дозволяє фільтрувати за категоріями у вікні структури. Не зовсім те, що ти хочеш. Я здивований, що ніхто не написав плагін Eclipse, який пропонує такий вигляд, як ваш знімок екрана.


Однак у більшості подань Java можна відфільтрувати членів класу відповідно до їх категорій, щоб приховати як прикладів за замовчуванням геттери та сеттери.
Riduidel,

Поняття не маю, чому я не можу використовувати @category в Android Studio, чи знаєте ви, що я можу зробити, щоб досягти такої ж поведінки на ньому?
MiguelHincapieC

6

Мені це сподобалось і тоді, коли я використовував xcode. Для eclipse я використовую ctrl + o (швидкий контур) для навігації по класу Java.


6

Використання непотрібних коментарів / маркерів у коді для полегшення роботи може бути не найкращою практикою. Я мало уявляю про розробку xcode та java, але вся основна підтримка IDE у пошуку членів без будь-яких спеціальних маркерів, таких як eclipse, показує методи та членів, що використовують контурний вигляд, який можна викликати, використовуючи ctrl+OIntellij (який я віддаю перевагу використовувати більше на mac і мав видання спільноти) має ту ж концепцію структури, до якої можна швидко отримати доступ за допомогою (ctrl + f12). Отже, мій сенс полягає в тому, щоб не використовувати зайву розмітку в коді, оскільки всі (або принаймні добрі / розумні) IDE можуть це робити автоматично.


2
Погодьтеся, маркери розділів лише додають зорового безладу. Ваш клас повинен бути досить щільно зосередженим, щоб зробити ці речі неактуальними.
Пол Маккензі,

15
Звичайно, але наявність методів, згрупованих у логічні та розмічені розділи, може допомогти навести візуальний порядок щодо того, що в іншому випадку було б плоским списком методів. Іноді ви точно не знаєте, який метод вам потрібен, і приємно взяти відповідні методи одразу, і маєте уявлення, що ви бачите повний обсяг відповідного коду.
Брайан Рак,

4

Наскільки я знаю, не існує такого поняття як підтримувана специфікація для групування членів класу разом. Ви можете використовувати будь-яку домовленість про коментарі, яка вам подобається, але, швидше за все, вона не буде підтримана жодним інструментом.

Краще об’єднати пов’язаних членів в окремий клас шляхом успадкування або агрегування. Це вважається хорошим стилем ООП


5
Розбиття розділів коду здається можливим лише теоретично. Наприклад, візьмемо клас Клієнт з такими атрибутами, як ім'я та колекція "рахунки-фактури". Я хотів би мати можливість розділити це на розділ "ім'я", який містить геттери / сеттери для імені та розділ "рахунки-фактури", який містить методи додавання / видалення для рахунків-фактур. Здійснювати їх на ієрархію класів, яка може додавати лише по одному атрибуту на клас, здається недоцільним, тобто "NamedEntity", "NameAndAddressEntity", "Invoicable", ...
Фредерік,

3

На додаток до відповіді Андрія, щоб використовувати // регіон // ендрегіон, ми вставляємо [листи BigAscii] [1] у основні розділи коду. При швидкому прокручуванні це дійсно виділяється. Одним недоліком цього підходу є те, що я не можу його шукати, тому вам потрібно буде додати пошуковий термін трохи нижче «банера», як це зроблено нижче.

Блок-цитата

//    _      _____          _____                  _   _
//   | |    |  __ \   /\   |  __ \      /\        | | | |
//   | |    | |  | | /  \  | |__) |    /  \  _   _| |_| |__
//   | |    | |  | |/ /\ \ |  ___/    / /\ \| | | | __| '_ \
//   | |____| |__| / ____ \| |       / ____ \ |_| | |_| | | |
//   |______|_____/_/    \_\_|      /_/    \_\__,_|\__|_| |_|
//
//   Search here with: LDAP Auth

[1]: http://patorjk.com/software/taag/#p=display&c=c%2B%2B&f=Big&t=LDAP Auth


3

Я б використав javadoc ; або використовуйте наступне як простий "роздільник" (одинарний або 3 рядки):

/** RecyclerOnItemClickListener */

/** 
 * RecyclerOnItemClickListener
 */

Таким чином, в IDE він відображається в іншому кольорі, відмінному від ненав’язливого коментованого сірого.


2

Сучасна IDE дозволяє переглядати ваш код різними способами і навіть реорганізовувати його. Eclipse навіть дозволяє переглядати визначення коду, на якому знаходиться курсор, на іншій панелі.

Будь-яка автоматична реорганізація коду призведе до поломки такої розмітки.

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


0

Якщо ви можете згрупувати свої методи, зробіть інший клас спеціально для тієї концепції, яку ви хочете зафіксувати в розділі. Вперед, створення файлів безкоштовне.


-18

Для IntelliJ мені подобається:

        public void ________________INIT__________________() {};

виглядає досить в структурі файлів!


3
Це здається дуже поганим рішенням. Навіщо заявляти про додаткові методи, коли вашою метою є організація коду?
nsg

1
Це робить весь файл сегментованим у поданні Структура.
Tycho Pandelaar

1
це лише той, який справді виглядає в андроїд-студії, запропонуйте вам власне як відповідь, і я буду використовувати
user170317

13
Найгірше, що я коли-небудь бачив !! і це ПУБЛІЧНО! o_O
Кокоріко

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