Как отмечать логические участки кода в комментариях 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 он отображается другим цветом, отличным от ненавязчивого серого с комментариями.

superarts.org
источник
2

Современная IDE позволяет вам просматривать ваш код по-разному и даже реорганизовывать его. Eclipse даже позволяет вам просматривать определение кода, на котором установлен курсор, на другой панели.

Любая автоматическая реорганизация вашего кода приведет к нарушению такой разметки.

Если вы хотите сгруппировать, подумайте о том, чтобы объединить вещи, принадлежащие к одному классу, а вещи, не принадлежащие друг другу, - в разные классы.

Торбьёрн Равн Андерсен
источник
0

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

Лэй Гонсалес
источник
-18

Для IntelliJ мне нравится:

        public void ________________INIT__________________() {};

выглядит красиво в файловой структуре!

user170317
источник
3
Это кажется очень плохим решением. Зачем объявлять дополнительные методы, если ваша цель - организация кода?
nsg
1
Это сделано для того, чтобы весь файл был сегментирован в представлении структуры.
Tycho Pandelaar
1
это только один, который действительно выглядит в студии Android, предлагаю вам в качестве ответа, и я буду использовать
user170317
14
Худшее, что я когда-либо видел !! и это ПУБЛИЧНО! о_О
Cocorico
3
Это единственный ответ, который отображается в представлении структуры и работает в разных IDE. Сделайте его приватным, улыбнитесь и перенесите его, или не используйте его, если он вам не нравится, но не скрывайте этот ответ от других читателей, отбрасывая его до забвения.
Том