powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Single return notation
25 сообщений из 51, страница 1 из 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
25 сообщений из 51, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Single return notation
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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