В каком порядке определяются геттеры и сеттеры? [закрыто]

14

Есть ли лучшая практика для заказа, чтобы определить геттеры и сеттеры в? Кажется, есть две практики:

  • пары геттер / сеттер
  • сначала геттеры, потом сеттеры (или наоборот)

Чтобы проиллюстрировать это различие, приведем пример Java-пары для получения / установки:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

И вот пример Java для первых получателей, затем установщиков:

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

Я думаю, что последний тип порядка более понятен как в коде, так и в диаграммах классов, но я не знаю, достаточно ли этого, чтобы исключить другой тип порядка.

Н.Н.
источник

Ответы:

8

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

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

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

Бенедикт
источник
Хотели бы вы привести еще один аргумент, почему функции, работающие с одними и теми же членами, должны храниться вместе?
NN
Добавил несколько причин.
Бенедикт
25

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

axblount
источник
7
Согласитесь полностью. Это происходит под заголовком «не потеть маленький материал», который должен быть стандарт кодирования правило каждого # 0 (это является правилом # 0 в «C ++ Стандарты кодирования» от Herb Sutter и Андре Alexandrescu.)
Дэвид Hammen
Я уверен, что люди много спорили о том, какой большой палец они должны использовать, чтобы поразить пробел)))
superM
@ Майкл, я тоже правша. Я пытался использовать только левую, но это было чрезвычайно сложно, и мой набор текста замедлился до ползания.
Axblount
@axblount Я правша, но всегда использую мой большой палец левой руки. Просто попробовал мое право и получил тот же опыт, который вы описали. Я также по какой-то причине набираю «y» левой рукой.
KChaloux
6

Это также может зависеть от языка. В Java нет никакого реального преимущества для любого порядка, но в C #, например, у вас есть понятие «свойства», которые группируют геттер и сеттер вместе, так что это как бы навязывает этот порядок. В языке, подобном C ++, где вам может потребоваться различная видимость для методов получения и установки (например, частный установщик, открытый метод получения), вы, вероятно, поступите противоположным образом, поскольку модификатор видимости дается один раз для нескольких методов, а не индивидуально для каждого. ,

Даррел Хоффман
источник
5

Насколько я знаю, нет единого соглашения. В разделе Oracle Java Code Conventions по организации файлов явно не упоминается размещение методов получения и установки, но в нем говорится:

Эти методы должны быть сгруппированы по функциональности, а не по объему или доступности.

Это не дает никаких указаний - я могу утверждать, что любое размещение соответствует этим критериям.

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

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

Это может иметь значение только в том случае, если вы читаете код за пределами вашей IDE. Примером может быть использование внешнего инструмента просмотра кода или просмотр дельт из вашей системы контроля версий.

Лучшее решение - просто согласовать файлы в проекте. Найдите стандарт, задокументируйте его и придерживайтесь его.

Томас Оуэнс
источник
1

Сгруппируйте геттер и сеттер для одного поля попарно.

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

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

М. Дадли
источник
Итак, вы аргументируете, что получатели для поля должны быть соединены с получателями для этого поля, потому что это упрощает обзор того, как обрабатываются определенные поля в классе?
NN
Это и концептуальная модель того, что такое класс. Занятия должны быть организованы в основном по функциональности. При создании класса вы можете решить, что ему нужно публично видимое, изменяемое поле. Это концептуальная «функциональность», а не синтаксическое выражение через методы получения и установки.
М. Дадли
0

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

user281377
источник
Я в курсе этого. Однако, например, в Eclipse вы можете выбирать между различными порядками .
NN
Правильно. Опция по умолчанию «Поля в парах получателя / установщика» кажется более полезной, потому что вы можете добавить больше полей и сгенерировать больше методов доступа позже, не беспокоясь о том, какой метод куда, просто поместите оба в конце.
user281377