Как отмечать логические участки кода в комментариях Java?


93

Классы Java обычно делятся на логические «блоки». Есть ли соглашение о маркировке этих разделов? В идеале он будет поддерживаться основными IDE.

Я лично использую такой метод:

//// Section name here ////

Однако у некоторых редакторов, похоже, с этим возникают проблемы.

Например, в коде Objective-C вы можете использовать этот метод:

#pragma mark -
#pragma mark Section name here

Это приведет к появлению меню в XCode, которое выглядит следующим образом:

альтернативный текст


4
Как разработчик iOS, это то, чего мне больше всего не хватало, когда я начинал с Android Studio
Крис Чен

1
проголосовано против: с современными IDE и языками это плохая практика. Если вам нужно разбить код на разделы, вы, вероятно, уже нарушаете принцип единой ответственности, и лучше разделить его на разные классы / файлы. Если существует несколько редакторов, через некоторое время он, скорее всего, будет рассинхронизирован, так как некоторые последуют этому, некоторые реорганизуют и реорганизуют код или автоматические действия по сохранению и форматированию нарушат его.
f.carlsen

проголосовали против: я согласен с @ f.carlsen. Если вы структурируете свой класс с помощью комментариев, вы, скорее всего, нарушите принцип единой ответственности .
schrieveslaach

Ненавистникам: позвоните мне, когда Java поддерживает расширения классов в стиле Swift, где вы можете логически разделить реализации интерфейса на разные разделы. И да, класс может хорошо реализовать несколько интерфейсов одновременно.
Уильям Энтрикен

Ответы:


68

Я лично использую разделители строк из 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 -> Editor -> Templates в диалоге настроек Eclipse), которые генерируют эти полосы, например. - sepa (SEParator for Accessors) - sepp (SEParator for Properties) - sepc (SEParator for Constructors) - и т. д.

Я также изменил стандартный шаблон «нового класса» (Java -> Стиль кода -> Шаблоны кода на экране настроек Eclipse).

Также есть старый плагин Eclipse под названием Coffee-bytes , который улучшил способ сворачивания частей кода в Eclipse. Я не знаю, работает ли это до сих пор, но я вспомнил, что можно определить произвольные складные зоны, добавив специальные комментарии, например // [SECTION] или что-то в этом роде. Он может по-прежнему работать в последних версиях Eclipse, так что взгляните.


146

Для студии intellij / android есть отличное решение.
Начинайте с:
//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 01

14

Eclipse определяет аннотацию javadoc @category (прокрутите до раздела, отмеченного «Поддержка категорий»), которая позволяет фильтровать по категориям в обзоре структуры. Не совсем то, что вам нужно. Я удивлен, что никто не написал плагин Eclipse, который предлагает вид, подобный вашему снимку экрана.


Однако в большинстве представлений java можно фильтровать члены класса в соответствии с их категориями, чтобы, например, скрыть их как методы получения и установки по умолчанию.
Riduidel 04

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

6

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


6

Использование ненужных комментариев / маркеров в коде для облегчения работы может быть плохой практикой. Я мало знаю о разработке xcode и java, но вся основная поддержка IDE в поиске членов без каких-либо специальных маркеров, таких как eclipse, показывает методы и члены, использующие вид схемы, который можно запускать с помощью ctrl+OIntellij (который я предпочитаю использовать больше на Mac и имел Community edition тоже) имеет ту же концепцию структуры, и к ней можно быстро получить доступ с помощью (ctrl + f12). Итак, я хочу сказать, что не используйте ненужную разметку в коде, поскольку все (или, по крайней мере, хорошие / нормальные) IDE могут делать это автоматически.


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

15
Конечно, но сгруппированные в логические и выделенные разделы методы могут помочь навести визуальный порядок в том, что в противном случае было бы простым списком методов. Иногда вы не знаете, какой именно метод вам нужен, и приятно использовать все связанные методы сразу и иметь некоторое представление о том, что вы видите весь связанный с ним код.
Брайан Рак

4

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

Лучше сгруппировать связанные члены в отдельный класс посредством наследования или агрегирования. Это считается хорошим стилем ООП


5
Разделение кода кажется возможным только в теории. Например, возьмите класс Client с такими атрибутами, как имя и коллекцию «invoices». Я хотел бы иметь возможность разделить это на раздел «имя», который содержит методы получения / установки для имени и раздел «счета-фактуры», который содержит методы добавления / удаления для счетов-фактур. Кажется непрактичным разделить их на иерархию классов, которая может добавлять только один атрибут для каждого класса, то есть «NamedEntity», «NameAndAddressEntity», «Invoicable», ...
Фредерик

3

В дополнение к предоставленному ответу Андрея, чтобы использовать // region // endregion, мы вставляем [буквы 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
это только один, который действительно выглядит в студии Android, предлагаю вам в качестве ответа, и я буду использовать
user170317

14
Худшее, что я когда-либо видел !! и это ПУБЛИЧНО! о_О
Cocorico

3
Это единственный ответ, который отображается в представлении структуры и работает в разных IDE. Сделайте его приватным, улыбнитесь и перенесите его, или не используйте его, если он вам не нравится, но не скрывайте этот ответ от других читателей, отбрасывая его до забвения.
Том
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.