|
|
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Всем привет! Если бы увидели такой код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. стали бы вы его рефакторить таким образом: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. и если да, то почему? Гугление наводит на мысль, что сообщество расколото на два лагеря: сторонников и противников single return notation, как пример, данная статья и комментарии к ней: 8 Common Code Violations in Java С другой стороны, здравый смысл подсказывает, что оба варианта допустимы в зависимости от кейса: Code complete about return А вы за или против single return notation? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 21:17 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Лично я бы даже не задумался об этом, а пошел заниматься более важными вещами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 21:33 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Троллинг не пройдёт! Рефакторить или нет? Что бы по этом поводу сказал Uncle Bob? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 21:44 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
NiticaРефакторить или нет?Да, т.к. не нравятся флажки, которые тянутся от "начала" и до "конца" блока/программы. И вообще, слишком много логики для одного геттера. (оператор GOTO - жЫв!) P.S. Нужно было организовать в виде голосования (опрос) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 22:27 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Nitica, Сильно зависит от ситуации. Но вопрос верный. Если в вашем методе несколько точек выхода, нужно задать себе вопрос "а правильно ли я делаю, а стоит ли сделать единую точку выхода?". И принимать решение уже в зависимости от ответа. Если это небольшой утилитный метод, отвечающий, например за сравнение, или реализация equals и т.п., то несколько точек выходна сильно упрощают код. Возможна некоторая превалидация аргументов метода с возвратом или исключением в начале метода. А потом уже дальнейшей логикой. Тоже никаких проблем с этим не вижу. Но если ваш метод сильно связан с предметной областью. И если предметная область достаточно динамическая и требования к ней часто меняются. И у вас в итогде один return где-то в середине метода, а другой в конце. При этом оба отвечают за вполне нормальный workflow, а не какое-то редкое поведение. Тогда будет лучше иметь единую точку выхода, чтобы проще было внести изменения и дополнения в код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 22:33 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
UsmanNiticaРефакторить или нет?Да, т.к. не нравятся флажки, которые тянутся от "начала" и до "конца" блока/программы. И вообще, слишком много логики для одного геттера. (оператор GOTO - жЫв!) P.S. Нужно было организовать в виде голосования (опрос) Ок, спасибо. Не вижу смысла в опросе: очевидно, что рефакторить нужно :) Интересно рассуждение, почему всё же рефакторить, если вроде как есть неписанное правило: один метод - одна точка возврата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 22:47 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо! Вы практически один-в-один озвучили мои собственные рассуждения по этому поводу. Каждый кейс нужно, конечно, рассматривать индивидуально. Выше приведённый метод конечно же рефакторить. Но нужно быть готовым, что код ревью такой рефакторинг не всегда пройдёт :) если ревьюер будет как мантру твердить: one method = one return ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 22:52 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 00:36 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Сори пропустуил комментарии что там еще код есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 00:37 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
NiticaИнтересно рассуждение, почему всё же рефакторить, если вроде как есть неписанное правило: один метод - одна точка возврата.- Replace Nested Conditional with Guard Clauses - К тому же, имхо, лучше оформлять ввиде " ASSERT 'ов" (для читабельности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 04:28 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Nitica А вы за или против single return notation? проблема не стоит битого байта. если в функции код простой, то все равно, как писать, и так, и так понятно. если там есть какие то кажется, типа обязательного эпилога, то там стиль кода будет диктоваться этими требованиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 08:45 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
NiticaUsmanпропущено... Да, т.к. не нравятся флажки, которые тянутся от "начала" и до "конца" блока/программы. И вообще, слишком много логики для одного геттера. (оператор GOTO - жЫв!) P.S. Нужно было организовать в виде голосования (опрос) Ок, спасибо. Не вижу смысла в опросе: очевидно, что рефакторить нужно :) Интересно рассуждение, почему всё же рефакторить, если вроде как есть неписанное правило: один метод - одна точка возврата. такого правили нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 08:48 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
NiticaBlazkowicz, спасибо! Вы практически один-в-один озвучили мои собственные рассуждения по этому поводу. Каждый кейс нужно, конечно, рассматривать индивидуально. Выше приведённый метод конечно же рефакторить. Но нужно быть готовым, что код ревью такой рефакторинг не всегда пройдёт :) если ревьюер будет как мантру твердить: one method = one return so fuck code review! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 08:50 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
MasterZivso fuck code review! "Не любите кошечек? Это вы просто не умеете их готовить". Только что мой код жестоко отревьювили. В результате штук 10 классов поменяли своё имя и в результате всё стало более понятным (в процессе обобщения и рефакторинга некоторые имена да, сильно отстали от смысла). А если в команде нет согласия, или квалификация ревьюверов низка- то да, фак... По первоначальному вопросу- да, return "из середины" применим во вполне конкретных местах. И самое полезное- контроль входных параметров, или состояния. Не то- сразу вернули ответ (exception-то понятно). Если checkSomeCondition проверяет применимость getValue, то логично после него кидать ответ. А вообще метод выглядит некрасиво что до, что после рефакторинга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 11:23 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Nitica, ты бы лучше какой то более реальный пример дал, данный уж больно надуман. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 11:57 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
MasterZiv , Нормальный пример. Проблема заключается в том, что чем более "ненадуманным" является пример, тем больше ненужного контекста он вынужден за собой тянуть. Из-за чего воспринимать такой пример становится сложнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 12:25 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
cdtyjv MasterZiv , Нормальный пример. Проблема заключается в том, что чем более "ненадуманным" является пример, тем больше ненужного контекста он вынужден за собой тянуть. Из-за чего воспринимать такой пример становится сложнее. Хороший метод должен быть не сложнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2014, 15:00 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
MasterZivNitica, ты бы лучше какой то более реальный пример дал, данный уж больно надуман. Надуманный? Хе-хе. Это реальный пример, из реальной системы, метод написан уже несколько лет назад, и в продакшене :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 12:21 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
NiticaНадуманный? Хе-хе. Это реальный пример, из реальной системы, метод написан уже несколько лет назад, и в продакшене :) Код плохой, но не в return дело. "// do some work here" явно лишнее тут. Не должен геттер после вычисления значения что-то делать. Если этот кусок кода убрать, то код можно сильно упростить: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Если же почитать весь код и убрать не относящиеся к результату действия, то всё может стать ещё проще. Вообще же правильно сказано "если в языке все советуют делать ТАК, но можно и ПО ДРУГОМУ значит язык плохо спроектирован". В eiffel (и по его мотивам в Delphi) есть предопределённая переменная Result, что заставляет, по сути, делать single return :) В java этого, как и многого другого, нет, поэтому всё решается вкусом техлида. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 13:03 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Alexey TominНе должен геттер после вычисления значения что-то делать.Геттер может делать все, что угодно. Отходите от этих клише, что геттер/сеттер - это обязательно бессмысленные однострочечные. Именно из-за этих шаблонов над Java и смеются - громоздкость на пустом месте. Вот если бы метод getX() ничего не возвращал и был void, я бы еще мог сделать замечание по дизайну А так - все нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 13:09 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
cdtyjvГеттер может делать все, что угодно. Отходите от этих клише, что геттер/сеттер - это обязательно бессмысленные однострочечные. Именно из-за этих шаблонов над Java и смеются - громоздкость на пустом месте. Вот если бы метод getX() ничего не возвращал и был void, я бы еще мог сделать замечание по дизайну А так - все нормально. А я не согласен. Если метод что-то делает, то имя у метода должно быть говорящее о том что он делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 13:15 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
cdtyjvAlexey TominНе должен геттер после вычисления значения что-то делать.Геттер может делать все, что угодно. Отходите от этих клише, что геттер/сеттер - это обязательно бессмысленные однострочечные. Именно из-за этих шаблонов над Java и смеются - громоздкость на пустом месте. Геттер не должен менять состояние объекта, и, тем более, других объектов. Так что если результат известен, то после него должен выполнятся только return. Иначе- смеяться будет сам разработчик, причём очень нервным смехом. Когда поймает багу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 14:27 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Alexey TominГеттер не должен менять состояние объекта, и, тем более, других объектов.Ну я еще раз постараюсь донести мысль - откажитесь от этих штампов. Умение абстрагироваться от непонятно кем придуманных шаблонов - это очень важный навык хорошего программиста. Вот вы говорите, что геттер не может изменять состояния объекта. Действительно, в ряде случаев так и должно быть. Ну а что, если я хочу, что бы у меня был синглтон с отложеной инициализацией? тогда первый гет изменит состояние. Тот же Спринг это делает, и ниток не воет, наоборот - очень даже удобно. А если я делаю кэширующий прокси? Первым гетом я вызываю какую-нибудь тяжелую операцию, потом кэширую ее результат, и в следующий раз сразу его верну. Тоже изменение состояния. А почему я, например, не могу в геттер логировать или учитывать количество его вызовов? Это маразм зацикливаться на том, что геттер обязательно должен быть худым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 14:57 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
cdtyjvНу я еще раз постараюсь донести мысль - откажитесь от этих штампов. Умение абстрагироваться от непонятно кем придуманных шаблонов - это очень важный навык хорошего программиста. С этим сложно спорить. cdtyjvВот вы говорите, что геттер не может изменять состояния объекта. Действительно, в ряде случаев так и должно быть. Ну а что, если я хочу, что бы у меня был синглтон с отложеной инициализацией? тогда первый гет изменит состояние. Тот же Спринг это делает, и ниток не воет, наоборот - очень даже удобно. Для Java не актуально. cdtyjvА если я делаю кэширующий прокси? Первым гетом я вызываю какую-нибудь тяжелую операцию, потом кэширую ее результат, и в следующий раз сразу его верну. Тоже изменение состояния. А почему я, например, не могу в геттер логировать или учитывать количество его вызовов? А это всё ложиться на AOP. И делается отдельным слоем, а не самим геттером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 15:01 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38526314&tid=2127793]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 435ms |

| 0 / 0 |
