powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Single return notation
51 сообщений из 51, показаны все 3 страниц
Single return notation
    #38526241
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Если бы увидели такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public boolean getValue() {
    final boolean result = true;

    if (checkSomeCondition()) {
       // do some work here
       result = false;
    }

    if (result && checkAnotherCondition()) {
       // do another part of work here
    }
    
    return result;
}



стали бы вы его рефакторить таким образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public boolean getValue() {
    if (checkSomeCondition()) {
       // do some work here
       return false;
    }

    if (checkAnotherCondition()) {
       // do another part of work here
    }
    
    return true;
}



и если да, то почему? Гугление наводит на мысль, что сообщество расколото на два лагеря: сторонников и противников single return notation, как пример, данная статья и комментарии к ней:
8 Common Code Violations in Java

С другой стороны, здравый смысл подсказывает, что оба варианта допустимы в зависимости от кейса:
Code complete about return

А вы за или против single return notation?
...
Рейтинг: 0 / 0
Single return notation
    #38526253
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я бы даже не задумался об этом, а пошел заниматься более важными вещами
...
Рейтинг: 0 / 0
Single return notation
    #38526265
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Троллинг не пройдёт! Рефакторить или нет? Что бы по этом поводу сказал Uncle Bob?
...
Рейтинг: 0 / 0
Single return notation
    #38526293
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiticaРефакторить или нет?Да, т.к. не нравятся флажки, которые тянутся от "начала" и до "конца" блока/программы.
И вообще, слишком много логики для одного геттера.
(оператор GOTO - жЫв!)
P.S.
Нужно было организовать в виде голосования (опрос)
...
Рейтинг: 0 / 0
Single return notation
    #38526297
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitica,

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

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

Но если ваш метод сильно связан с предметной областью. И если предметная область достаточно динамическая и требования к ней часто меняются. И у вас в итогде один return где-то в середине метода, а другой в конце. При этом оба отвечают за вполне нормальный workflow, а не какое-то редкое поведение. Тогда будет лучше иметь единую точку выхода, чтобы проще было внести изменения и дополнения в код.
...
Рейтинг: 0 / 0
Single return notation
    #38526311
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanNiticaРефакторить или нет?Да, т.к. не нравятся флажки, которые тянутся от "начала" и до "конца" блока/программы.
И вообще, слишком много логики для одного геттера.
(оператор GOTO - жЫв!)
P.S.
Нужно было организовать в виде голосования (опрос)

Ок, спасибо. Не вижу смысла в опросе: очевидно, что рефакторить нужно :) Интересно рассуждение, почему всё же рефакторить, если вроде как есть неписанное правило: один метод - одна точка возврата.
...
Рейтинг: 0 / 0
Single return notation
    #38526314
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, спасибо! Вы практически один-в-один озвучили мои собственные рассуждения по этому поводу. Каждый кейс нужно, конечно, рассматривать индивидуально. Выше приведённый метод конечно же рефакторить. Но нужно быть готовым, что код ревью такой рефакторинг не всегда пройдёт :) если ревьюер будет как мантру твердить: one method = one return
...
Рейтинг: 0 / 0
Single return notation
    #38526375
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
public boolean getValue() {
    return checkSomeCondition() && checkAnotherCondition();
}
...
Рейтинг: 0 / 0
Single return notation
    #38526376
vimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори пропустуил комментарии что там еще код есть.
...
Рейтинг: 0 / 0
Single return notation
    #38526449
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiticaИнтересно рассуждение, почему всё же рефакторить, если вроде как есть неписанное правило: один метод - одна точка возврата.- Replace Nested Conditional with Guard Clauses
- К тому же, имхо, лучше оформлять ввиде " ASSERT 'ов" (для читабельности)
...
Рейтинг: 0 / 0
Single return notation
    #38526504
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitica
А вы за или против single return notation?

проблема не стоит битого байта.
если в функции код простой, то все равно, как писать, и так, и так понятно. если там есть какие то кажется, типа обязательного эпилога, то там стиль кода будет диктоваться этими требованиями.
...
Рейтинг: 0 / 0
Single return notation
    #38526507
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiticaUsmanпропущено...
Да, т.к. не нравятся флажки, которые тянутся от "начала" и до "конца" блока/программы.
И вообще, слишком много логики для одного геттера.
(оператор GOTO - жЫв!)
P.S.
Нужно было организовать в виде голосования (опрос)

Ок, спасибо. Не вижу смысла в опросе: очевидно, что рефакторить нужно :) Интересно рассуждение, почему всё же рефакторить, если вроде как есть неписанное правило: один метод - одна точка возврата.

такого правили нет.
...
Рейтинг: 0 / 0
Single return notation
    #38526509
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiticaBlazkowicz, спасибо! Вы практически один-в-один озвучили мои собственные рассуждения по этому поводу. Каждый кейс нужно, конечно, рассматривать индивидуально. Выше приведённый метод конечно же рефакторить. Но нужно быть готовым, что код ревью такой рефакторинг не всегда пройдёт :) если ревьюер будет как мантру твердить: one method = one return

so fuck code review!
...
Рейтинг: 0 / 0
Single return notation
    #38526718
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivso fuck code review!

"Не любите кошечек? Это вы просто не умеете их готовить".
Только что мой код жестоко отревьювили. В результате штук 10 классов поменяли своё имя и в результате всё стало более понятным (в процессе обобщения и рефакторинга некоторые имена да, сильно отстали от смысла).
А если в команде нет согласия, или квалификация ревьюверов низка- то да, фак...

По первоначальному вопросу- да, return "из середины" применим во вполне конкретных местах.

И самое полезное- контроль входных параметров, или состояния. Не то- сразу вернули ответ (exception-то понятно).

Если checkSomeCondition проверяет применимость getValue, то логично после него кидать ответ.

А вообще метод выглядит некрасиво что до, что после рефакторинга.
...
Рейтинг: 0 / 0
Single return notation
    #38526768
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nitica,

ты бы лучше какой то более реальный пример дал, данный уж больно надуман.
...
Рейтинг: 0 / 0
Single return notation
    #38526787
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv ,
Нормальный пример. Проблема заключается в том, что чем более "ненадуманным" является пример, тем больше ненужного контекста он вынужден за собой тянуть. Из-за чего воспринимать такой пример становится сложнее.
...
Рейтинг: 0 / 0
Single return notation
    #38527056
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv MasterZiv ,
Нормальный пример. Проблема заключается в том, что чем более "ненадуманным" является пример, тем больше ненужного контекста он вынужден за собой тянуть. Из-за чего воспринимать такой пример становится сложнее.

Хороший метод должен быть не сложнее.
...
Рейтинг: 0 / 0
Single return notation
    #38528000
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivNitica,

ты бы лучше какой то более реальный пример дал, данный уж больно надуман.
Надуманный? Хе-хе. Это реальный пример, из реальной системы, метод написан уже несколько лет назад, и в продакшене :)
...
Рейтинг: 0 / 0
Single return notation
    #38528100
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiticaНадуманный? Хе-хе. Это реальный пример, из реальной системы, метод написан уже несколько лет назад, и в продакшене :)

Код плохой, но не в return дело.
"// do some work here" явно лишнее тут. Не должен геттер после вычисления значения что-то делать.
Если этот кусок кода убрать, то код можно сильно упростить:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
public boolean getValue() {
    boolean result;
    if (! checkSomeCondition() && checkAnotherCondition()) {
       // do another part of work here, set result true or false;
    } else {
       result = false;
    }
    return result;
}


Если же почитать весь код и убрать не относящиеся к результату действия, то всё может стать ещё проще.

Вообще же правильно сказано "если в языке все советуют делать ТАК, но можно и ПО ДРУГОМУ значит язык плохо спроектирован".
В eiffel (и по его мотивам в Delphi) есть предопределённая переменная Result, что заставляет, по сути, делать single return :)
В java этого, как и многого другого, нет, поэтому всё решается вкусом техлида.
...
Рейтинг: 0 / 0
Single return notation
    #38528109
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominНе должен геттер после вычисления значения что-то делать.Геттер может делать все, что угодно. Отходите от этих клише, что геттер/сеттер - это обязательно бессмысленные однострочечные. Именно из-за этих шаблонов над Java и смеются - громоздкость на пустом месте.
Вот если бы метод getX() ничего не возвращал и был void, я бы еще мог сделать замечание по дизайну А так - все нормально.
...
Рейтинг: 0 / 0
Single return notation
    #38528123
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvГеттер может делать все, что угодно. Отходите от этих клише, что геттер/сеттер - это обязательно бессмысленные однострочечные. Именно из-за этих шаблонов над Java и смеются - громоздкость на пустом месте.
Вот если бы метод getX() ничего не возвращал и был void, я бы еще мог сделать замечание по дизайну А так - все нормально.
А я не согласен. Если метод что-то делает, то имя у метода должно быть говорящее о том что он делает.
...
Рейтинг: 0 / 0
Single return notation
    #38528276
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvAlexey TominНе должен геттер после вычисления значения что-то делать.Геттер может делать все, что угодно. Отходите от этих клише, что геттер/сеттер - это обязательно бессмысленные однострочечные. Именно из-за этих шаблонов над Java и смеются - громоздкость на пустом месте.

Геттер не должен менять состояние объекта, и, тем более, других объектов.
Так что если результат известен, то после него должен выполнятся только return.

Иначе- смеяться будет сам разработчик, причём очень нервным смехом. Когда поймает багу.
...
Рейтинг: 0 / 0
Single return notation
    #38528361
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominГеттер не должен менять состояние объекта, и, тем более, других объектов.Ну я еще раз постараюсь донести мысль - откажитесь от этих штампов. Умение абстрагироваться от непонятно кем придуманных шаблонов - это очень важный навык хорошего программиста.
Вот вы говорите, что геттер не может изменять состояния объекта. Действительно, в ряде случаев так и должно быть.
Ну а что, если я хочу, что бы у меня был синглтон с отложеной инициализацией? тогда первый гет изменит состояние. Тот же Спринг это делает, и ниток не воет, наоборот - очень даже удобно.
А если я делаю кэширующий прокси? Первым гетом я вызываю какую-нибудь тяжелую операцию, потом кэширую ее результат, и в следующий раз сразу его верну. Тоже изменение состояния.
А почему я, например, не могу в геттер логировать или учитывать количество его вызовов?

Это маразм зацикливаться на том, что геттер обязательно должен быть худым.
...
Рейтинг: 0 / 0
Single return notation
    #38528374
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНу я еще раз постараюсь донести мысль - откажитесь от этих штампов. Умение абстрагироваться от непонятно кем придуманных шаблонов - это очень важный навык хорошего программиста.
С этим сложно спорить.

cdtyjvВот вы говорите, что геттер не может изменять состояния объекта. Действительно, в ряде случаев так и должно быть.
Ну а что, если я хочу, что бы у меня был синглтон с отложеной инициализацией? тогда первый гет изменит состояние. Тот же Спринг это делает, и ниток не воет, наоборот - очень даже удобно.

Для Java не актуально.

cdtyjvА если я делаю кэширующий прокси? Первым гетом я вызываю какую-нибудь тяжелую операцию, потом кэширую ее результат, и в следующий раз сразу его верну. Тоже изменение состояния.
А почему я, например, не могу в геттер логировать или учитывать количество его вызовов?
А это всё ложиться на AOP. И делается отдельным слоем, а не самим геттером.
...
Рейтинг: 0 / 0
Single return notation
    #38528376
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvAlexey TominГеттер не должен менять состояние объекта, и, тем более, других объектов.
Это маразм зацикливаться на том, что геттер обязательно должен быть худым.
Передёргиваете.
...
Рейтинг: 0 / 0
Single return notation
    #38528421
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА это всё ложиться на AOP. И делается отдельным слоем, а не самим геттером.ну опять двадцать пять Не успели с одним штампом разобраться, так вы другой уже выкатываете. Какой нафиг AOP? Кто сказал, что это должен делать только AOP? Кто сказал, что у меня вообще есть AOP? Что бы смотреть в его сторону, надо сначала заиметь достаточное количество гемороя, от которых меня AOP избавит. Поэтому, например, для транзакций AOP подходит круто - методов много, они постоянно изменяются, логика AOPа везде одинаковая, все круто.
А если у меня нет такого количества гаморроя? Вот я хочу кэшировать удаленные вызовы одного единственного сервиса, и обновлять их раз в N секунд:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public class WeatherService {
    /** Remote weather service. */
    private RemoteWeatherService svc;

    /** Cached weather. */
    private Weather cachedWeather;

    /** Cached weather craetion timestamp. */
    private long timestamp;

    /** Time-to-live for cache weather. */
    private long ttl;

    /**
     * Get current weather.
     *
     * @return Current weather.
     */
    public Weather getWeather() {
        if (cachedWeather == null || System.currentTimeMillis() - timestamp > ttl)
            cachedWeather = svc.currentWeather();

        return cachedWeather;
    }
}

Вы что, предлагаете мне из-за каких-то двух дополнительных строчек кода себе AOP прикручивать? Ну это же маразм, "из пушки по воробьям" называется.
...
Рейтинг: 0 / 0
Single return notation
    #38528433
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНу это же маразм, "из пушки по воробьям" называется.
Маразм это засорять бизнес-логику кешированием. Логика отдельно. Кеширование отдельно - оберткой.
...
Рейтинг: 0 / 0
Single return notation
    #38528519
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvAlexey TominГеттер не должен менять состояние объекта, и, тем более, других объектов.Ну я еще раз постараюсь донести мысль - откажитесь от этих штампов. Умение абстрагироваться от непонятно кем придуманных шаблонов - это очень важный навык хорошего программиста.

Делая не так, как советуют, надо понимать, зачем.


cdtyjvВот вы говорите, что геттер не может изменять состояния объекта. Действительно, в ряде случаев так и должно быть.
Ну а что, если я хочу, что бы у меня был синглтон с отложеной инициализацией?

Это принятое исключение из правил, связанный с отсутствием в java одноразовых функций (опять же eiffel).

cdtyjvА если я делаю кэширующий прокси? Первым гетом я вызываю какую-нибудь тяжелую операцию, потом кэширую ее результат, и в следующий раз сразу его верну. Тоже изменение состояния.

Не отличается от первого примера :)

cdtyjv А почему я, например, не могу в геттер логировать или учитывать количество его вызовов?

Опять же понятное исключение. Правила они общие. Их надо сначала понять, а потом понять их границы. Если же сразу говорить "откажитесь от шаблонов"- то будет плохо.
...
Рейтинг: 0 / 0
Single return notation
    #38528547
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом исходнике - ошибка. final надо убрать.
...
Рейтинг: 0 / 0
Single return notation
    #38528562
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И с точки зрения JVM второй метод короче на 4 инструкции. Возм. будет работать быстрее в циклах и под нагрузкой.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  public boolean getValue1();
    Code:
       0: iconst_1      
       1: istore_1      
       2: aload_0       
       3: invokevirtual #1                  // Method checkSomeCondition:()Z
       6: ifeq          11
       9: iconst_0      
      10: istore_1      
      11: iload_1       
      12: ifeq          22
      15: aload_0       
      16: invokevirtual #2                  // Method checkAnotherCondition:()Z
      19: ifeq          22
      22: iload_1       
      23: ireturn       

  public boolean getValue2();
    Code:
       0: aload_0       
       1: invokevirtual #1                  // Method checkSomeCondition:()Z
       4: ifeq          9
       7: iconst_0      
       8: ireturn       
       9: aload_0       
      10: invokevirtual #2                  // Method checkAnotherCondition:()Z
      13: ifeq          16
      16: iconst_1      
      17: ireturn       

...
Рейтинг: 0 / 0
Single return notation
    #38528590
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton ,
Это все полная хрень, по байткоду предсказать количество реальных инструкций невозможно. Помню. на хабре была статейка на эту тему, где смотрели на synchronized. Была гипотеза, дескать, sycnhronized метод будет работать быстрее чем synchronized(Object), так как в байткоде меньше инструкций. В итоге после PrintAssembly код оказался идентичным инструкция-в-инструкцию.
Так что это все от лукавого.
...
Рейтинг: 0 / 0
Single return notation
    #38528603
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В "рефакторинг" вкладывается много смыслов. Давайте вернёмся к автору и спросим
а что собственно он хочет получить на выходе? Красивый код? Компактный код? Понятный код?
Быстрый код? Быстрый бинарь? e.t.c.

Я кинул свои 5 копеек.
...
Рейтинг: 0 / 0
Single return notation
    #38529531
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonВ первом исходнике - ошибка. final надо убрать. Совершенно верно, прошу прощения.
...
Рейтинг: 0 / 0
Single return notation
    #38529553
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonВ "рефакторинг" вкладывается много смыслов. Давайте вернёмся к автору и спросим
а что собственно он хочет получить на выходе? Красивый код? Компактный код? Понятный код?
Быстрый код? Быстрый бинарь? e.t.c.

Я кинул свои 5 копеек.
Спросим у Капитана очевидности:
реорганизация кода, или рефакторинг, — изменение, вносимое во внутреннюю структуру программного обеспечения, чтобы упростить понимание и удешевить модификацию его кода, не изменяя его существующее поведение. См. Working Effectively with Legacy Code by Michael C. Feathers (2004)
В итоге, да, хотим красивый, понятный, более дешёвый для модификации код. Про перфоманс вопрос не поднимался.
...
Рейтинг: 0 / 0
Single return notation
    #38529562
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonИ с точки зрения JVM второй метод короче на 4 инструкции. Возм. будет работать быстрее в циклах и под нагрузкой.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  public boolean getValue1();
    Code:
       0: iconst_1      
       1: istore_1      
       2: aload_0       
       3: invokevirtual #1                  // Method checkSomeCondition:()Z
       6: ifeq          11
       9: iconst_0      
      10: istore_1      
      11: iload_1       
      12: ifeq          22
      15: aload_0       
      16: invokevirtual #2                  // Method checkAnotherCondition:()Z
      19: ifeq          22
      22: iload_1       
      23: ireturn       

  public boolean getValue2();
    Code:
       0: aload_0       
       1: invokevirtual #1                  // Method checkSomeCondition:()Z
       4: ifeq          9
       7: iconst_0      
       8: ireturn       
       9: aload_0       
      10: invokevirtual #2                  // Method checkAnotherCondition:()Z
      13: ifeq          16
      16: iconst_1      
      17: ireturn       



Естественно будет быстрее (выкидываем лишнюю локальную булевую переменную и проверку её значения). Но дельта настолько ничтожна, что можно пренебречь, вопрос был скорее про "красоту" кода изначально.
...
Рейтинг: 0 / 0
Single return notation
    #38529567
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По красоте кода - лучше это переписать на Scala.
...
Рейтинг: 0 / 0
Single return notation
    #38529569
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niticaвопрос был скорее про "красоту" кода изначально.
Красоты не наблюдается ни в одном из вариантов.
Single return point проще модифицировать.
...
Рейтинг: 0 / 0
Single return notation
    #38529572
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey TominNiticaНадуманный? Хе-хе. Это реальный пример, из реальной системы, метод написан уже несколько лет назад, и в продакшене :)

Код плохой, но не в return дело.
"// do some work here" явно лишнее тут. Не должен геттер после вычисления значения что-то делать.
Если этот кусок кода убрать, то код можно сильно упростить:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
public boolean getValue() {
    boolean result;
    if (! checkSomeCondition() && checkAnotherCondition()) {
       // do another part of work here, set result true or false;
    } else {
       result = false;
    }
    return result;
}


Если же почитать весь код и убрать не относящиеся к результату действия, то всё может стать ещё проще.

Вообще же правильно сказано "если в языке все советуют делать ТАК, но можно и ПО ДРУГОМУ значит язык плохо спроектирован".
В eiffel (и по его мотивам в Delphi) есть предопределённая переменная Result, что заставляет, по сути, делать single return :)
В java этого, как и многого другого, нет, поэтому всё решается вкусом техлида.

Дело не в геттере, я бы мог назвать метод и как-нибудь так: checkMyFavoriteConditions. И локальная непроинициализованная переменная в вашем примере свалит компиляцию :)
...
Рейтинг: 0 / 0
Single return notation
    #38529577
Nitica
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczNiticaвопрос был скорее про "красоту" кода изначально.
Красоты не наблюдается ни в одном из вариантов.
Single return point проще модифицировать.
Агрументация?
...
Рейтинг: 0 / 0
Single return notation
    #38529578
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё хорошо написано
http://stackoverflow.com/a/733858 17.1 return

Minimize the number of returns in each routine . It's harder to understand a routine if, reading it at the bottom, you're unaware of the possibility that it *return*ed somewhere above.

Use a return when it enhances readability . In certain routines, once you know the answer, you want to return it to the calling routine immediately. If the routine is defined in such a way that it doesn't require any cleanup, not returning immediately means that you have to write more code.
...
Рейтинг: 0 / 0
Single return notation
    #38529590
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiticaДело не в геттере, я бы мог назвать метод и как-нибудь так: checkMyFavoriteConditions.

Плохое название. Что _возвращает_ метод "check..."?

NiticaИ локальная непроинициализованная переменная в вашем примере свалит компиляцию :)

Я ж изменил комментарий- в первой половине if'а надо её выставить.

Вообще хороший код это не сферический код в вакууме. Изменение имени метода, к примеру, может превратить хорошую функцию в безобразную :)

Например checkMyFavoriteConditions логично быть void и, если что не так, кидаться exception'ом.
...
Рейтинг: 0 / 0
Single return notation
    #38529626
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я всегда сопротивлялся подобным постановкам в вакууме. В данном примере
особых рефакторингов придумывать можно много. Гораздо важнее проверить
этот код на соответствие conventions принятых в команде разработки.
И прислушиваться к тому кто делает review кода.

По поводу performance и лишних мегафлопов. В практике встречаются случаи
когда для получения данных нужно сделать предварительные транзакции чтения.
Пойти в один datasource посмотреть. Потом пойти в другой e.t.c.
Иногда эти условия одноранговые. Тоесть всё равно как проверять.

Тогда этот код

Код: java
1.
if (! checkSomeCondition() && checkAnotherCondition())


можно перевернуть как

Код: java
1.
if (checkAnotherCondition() && !checkSomeCondition() )


И поднять на этом серъёзное улучшение если отклик от функции checkAnotherCondition()
будет достаточно быстрым (1 - мс).
...
Рейтинг: 0 / 0
Single return notation
    #38531096
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если сделать так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
do{
    if(!condition1()) break;
    //actions...
    if(!condition2()) break;
    //actions specific to condition 2
    ...
    return true;
}while(false);
return false;



Нормально, как считаете?
...
Рейтинг: 0 / 0
Single return notation
    #38531112
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для такого варианта

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    public boolean getValue3() {
        do{
            if(!checkSomeCondition()) break;
            //actions...
            if(!checkAnotherCondition()) break;
            //actions specific to condition 2
            return true;
        }while(false);
        return false;
    }



Мы имеем 12 элементарных инструкций JVM. Нормально. Но в коде у нас появились 2 инструкции goto.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public boolean getValue3();
    Code:
       0: aload_0       
       1: invokevirtual #1                  // Method checkSomeCondition:()Z
       4: ifne          10
       7: goto          22
      10: aload_0       
      11: invokevirtual #2                  // Method checkAnotherCondition:()Z
      14: ifne          20
      17: goto          22
      20: iconst_1      
      21: ireturn       
      22: iconst_0      
      23: ireturn    



Кстати по поводу операций с boolean. Все они отображаются на проверки на равенство 0 или не равенство нулю
целому числу типа int (computational type int).
...
Рейтинг: 0 / 0
Single return notation
    #38531307
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВы что, предлагаете мне из-за каких-то двух дополнительных строчек кода себе AOP прикручивать? Ну это же маразм, "из пушки по
воробьям" называется.

Тут проблема в убожестве явы как языка программирования. Вот как этот код выглядит на языке программирования coffeescript.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
cache = (func, ttl) ->
  val = undefined
  timestamp = 0
  ->
    newTimestamp = System.currentTimeMillis()
    if newTimestamp - timestamp > ttl
      timestamp = newTimestamp
      val = func()
    else
      val

WeatherService =
  getWeather: cache RemoteWeatherService.currentWeather


Отмечу, что логика запроса погоды полностью отделена от логики кэширования.
...
Рейтинг: 0 / 0
Single return notation
    #38531455
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪТут проблема в убожестве явы как языка программирования. Вот как этот код выглядит на языке программирования coffeescript.
Код: sql
1.
2.
cache = (func, ttl) ->
...




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

PS: в многопоточном коде это точно сработает?
...
Рейтинг: 0 / 0
Single return notation
    #38531613
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominТакие вещи можно сделать много где. А проще всего в eiffel - в заголовке функции пишешь once и она будет вызвана один раз, а потом будет выдаваться закэшированный результат.
т.е. программисту В КОДЕ нельзя написать один вызов руками и использовать результат во многих местах?
Или я не понял этот сахар?
...
Рейтинг: 0 / 0
Single return notation
    #38531614
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ ,
Да, крутой язык, ничего не скажешь. Целую одну строчку return сэкономили!!! :-)
...
Рейтинг: 0 / 0
Single return notation
    #38531643
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про "убожество" Java нет никаких аргументов в топике. Или автор просто
сказал о "наболевшем" ?
...
Рейтинг: 0 / 0
Single return notation
    #38531744
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Alexey TominТакие вещи можно сделать много где. А проще всего в eiffel - в заголовке функции пишешь once и она будет вызвана один раз, а потом будет выдаваться закэшированный результат.
т.е. программисту В КОДЕ нельзя написать один вызов руками и использовать результат во многих местах?
Или я не понял этот сахар?

Не понял.
Обычная функция:
Код: sql
1.
2.
3.
4.
 get_value: OBJECT is
        do
            ...
        end



Сколько раз в коде встретится вызов- столько раз и будет вызвана.

Одноразовая на каждый поток:
Код: sql
1.
2.
3.
4.
 get_value: OBJECT is
        once -- !!!
            ...
        end



При первом вызове будет вызвана реально, при этом результат будет записан в невидимую переменную. все остальные разы просто будет прочитано значение оттуда.

А вот одноразовая на приложение
Код: sql
1.
2.
3.
4.
 get_value: OBJECT is
        once("PROCESS") -- !!!
            ...
        end



По сути- встроенная в язык ленивая инициализация.
...
Рейтинг: 0 / 0
Single return notation
    #38531774
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominСколько раз в коде встретится вызов- столько раз и будет вызвана.
ну дак я для этого и пишу такой код.
Если мне нужно закешировать значение, то я пишу
Переменная_А = DataSet.GetCountRecord
а потом её использую. Т.к. DataSet.GetCountRecord - тяжеловесная.
Теперь как напишете вы такой код?
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Single return notation
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]