|
|
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 15:21 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
cdtyjvНу это же маразм, "из пушки по воробьям" называется. Маразм это засорять бизнес-логику кешированием. Логика отдельно. Кеширование отдельно - оберткой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 15:28 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
cdtyjvAlexey TominГеттер не должен менять состояние объекта, и, тем более, других объектов.Ну я еще раз постараюсь донести мысль - откажитесь от этих штампов. Умение абстрагироваться от непонятно кем придуманных шаблонов - это очень важный навык хорошего программиста. Делая не так, как советуют, надо понимать, зачем. cdtyjvВот вы говорите, что геттер не может изменять состояния объекта. Действительно, в ряде случаев так и должно быть. Ну а что, если я хочу, что бы у меня был синглтон с отложеной инициализацией? Это принятое исключение из правил, связанный с отсутствием в java одноразовых функций (опять же eiffel). cdtyjvА если я делаю кэширующий прокси? Первым гетом я вызываю какую-нибудь тяжелую операцию, потом кэширую ее результат, и в следующий раз сразу его верну. Тоже изменение состояния. Не отличается от первого примера :) cdtyjv А почему я, например, не могу в геттер логировать или учитывать количество его вызовов? Опять же понятное исключение. Правила они общие. Их надо сначала понять, а потом понять их границы. Если же сразу говорить "откажитесь от шаблонов"- то будет плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:34 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
В первом исходнике - ошибка. final надо убрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:50 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
И с точки зрения 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:59 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
mayton , Это все полная хрень, по байткоду предсказать количество реальных инструкций невозможно. Помню. на хабре была статейка на эту тему, где смотрели на synchronized. Была гипотеза, дескать, sycnhronized метод будет работать быстрее чем synchronized(Object), так как в байткоде меньше инструкций. В итоге после PrintAssembly код оказался идентичным инструкция-в-инструкцию. Так что это все от лукавого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:17 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
В "рефакторинг" вкладывается много смыслов. Давайте вернёмся к автору и спросим а что собственно он хочет получить на выходе? Красивый код? Компактный код? Понятный код? Быстрый код? Быстрый бинарь? e.t.c. Я кинул свои 5 копеек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:25 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
maytonВ первом исходнике - ошибка. final надо убрать. Совершенно верно, прошу прощения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:38 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
maytonВ "рефакторинг" вкладывается много смыслов. Давайте вернёмся к автору и спросим а что собственно он хочет получить на выходе? Красивый код? Компактный код? Понятный код? Быстрый код? Быстрый бинарь? e.t.c. Я кинул свои 5 копеек. Спросим у Капитана очевидности: реорганизация кода, или рефакторинг, — изменение, вносимое во внутреннюю структуру программного обеспечения, чтобы упростить понимание и удешевить модификацию его кода, не изменяя его существующее поведение. См. Working Effectively with Legacy Code by Michael C. Feathers (2004) В итоге, да, хотим красивый, понятный, более дешёвый для модификации код. Про перфоманс вопрос не поднимался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:47 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
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. Естественно будет быстрее (выкидываем лишнюю локальную булевую переменную и проверку её значения). Но дельта настолько ничтожна, что можно пренебречь, вопрос был скорее про "красоту" кода изначально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:52 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
По красоте кода - лучше это переписать на Scala. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:54 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Niticaвопрос был скорее про "красоту" кода изначально. Красоты не наблюдается ни в одном из вариантов. Single return point проще модифицировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:55 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Alexey TominNiticaНадуманный? Хе-хе. Это реальный пример, из реальной системы, метод написан уже несколько лет назад, и в продакшене :) Код плохой, но не в return дело. "// do some work here" явно лишнее тут. Не должен геттер после вычисления значения что-то делать. Если этот кусок кода убрать, то код можно сильно упростить: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Если же почитать весь код и убрать не относящиеся к результату действия, то всё может стать ещё проще. Вообще же правильно сказано "если в языке все советуют делать ТАК, но можно и ПО ДРУГОМУ значит язык плохо спроектирован". В eiffel (и по его мотивам в Delphi) есть предопределённая переменная Result, что заставляет, по сути, делать single return :) В java этого, как и многого другого, нет, поэтому всё решается вкусом техлида. Дело не в геттере, я бы мог назвать метод и как-нибудь так: checkMyFavoriteConditions. И локальная непроинициализованная переменная в вашем примере свалит компиляцию :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:56 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
BlazkowiczNiticaвопрос был скорее про "красоту" кода изначально. Красоты не наблюдается ни в одном из вариантов. Single return point проще модифицировать. Агрументация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:57 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Вот ещё хорошо написано 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 13:57 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
NiticaДело не в геттере, я бы мог назвать метод и как-нибудь так: checkMyFavoriteConditions. Плохое название. Что _возвращает_ метод "check..."? NiticaИ локальная непроинициализованная переменная в вашем примере свалит компиляцию :) Я ж изменил комментарий- в первой половине if'а надо её выставить. Вообще хороший код это не сферический код в вакууме. Изменение имени метода, к примеру, может превратить хорошую функцию в безобразную :) Например checkMyFavoriteConditions логично быть void и, если что не так, кидаться exception'ом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 14:05 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Я всегда сопротивлялся подобным постановкам в вакууме. В данном примере особых рефакторингов придумывать можно много. Гораздо важнее проверить этот код на соответствие conventions принятых в команде разработки. И прислушиваться к тому кто делает review кода. По поводу performance и лишних мегафлопов. В практике встречаются случаи когда для получения данных нужно сделать предварительные транзакции чтения. Пойти в один datasource посмотреть. Потом пойти в другой e.t.c. Иногда эти условия одноранговые. Тоесть всё равно как проверять. Тогда этот код Код: java 1. можно перевернуть как Код: java 1. И поднять на этом серъёзное улучшение если отклик от функции checkAnotherCondition() будет достаточно быстрым (1 - мс). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 14:27 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
А если сделать так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Нормально, как считаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2014, 17:40 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Для такого варианта Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Мы имеем 12 элементарных инструкций JVM. Нормально. Но в коде у нас появились 2 инструкции goto. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Кстати по поводу операций с boolean. Все они отображаются на проверки на равенство 0 или не равенство нулю целому числу типа int (computational type int). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2014, 18:06 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
авторВы что, предлагаете мне из-за каких-то двух дополнительных строчек кода себе AOP прикручивать? Ну это же маразм, "из пушки по воробьям" называется. Тут проблема в убожестве явы как языка программирования. Вот как этот код выглядит на языке программирования coffeescript. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Отмечу, что логика запроса погоды полностью отделена от логики кэширования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 01:17 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪТут проблема в убожестве явы как языка программирования. Вот как этот код выглядит на языке программирования coffeescript. Код: sql 1. 2. Такие вещи можно сделать много где. А проще всего в eiffel - в заголовке функции пишешь once и она будет вызвана один раз, а потом будет выдаваться закэшированный результат. PS: в многопоточном коде это точно сработает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 10:37 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Alexey TominТакие вещи можно сделать много где. А проще всего в eiffel - в заголовке функции пишешь once и она будет вызвана один раз, а потом будет выдаваться закэшированный результат. т.е. программисту В КОДЕ нельзя написать один вызов руками и использовать результат во многих местах? Или я не понял этот сахар? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 12:05 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Йуный джавистЪ , Да, крутой язык, ничего не скажешь. Целую одну строчку return сэкономили!!! :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 12:07 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Про "убожество" Java нет никаких аргументов в топике. Или автор просто сказал о "наболевшем" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 12:21 |
|
||
|
Single return notation
|
|||
|---|---|---|---|
|
#18+
Petro123Alexey TominТакие вещи можно сделать много где. А проще всего в eiffel - в заголовке функции пишешь once и она будет вызвана один раз, а потом будет выдаваться закэшированный результат. т.е. программисту В КОДЕ нельзя написать один вызов руками и использовать результат во многих местах? Или я не понял этот сахар? Не понял. Обычная функция: Код: sql 1. 2. 3. 4. Сколько раз в коде встретится вызов- столько раз и будет вызвана. Одноразовая на каждый поток: Код: sql 1. 2. 3. 4. При первом вызове будет вызвана реально, при этом результат будет записан в невидимую переменную. все остальные разы просто будет прочитано значение оттуда. А вот одноразовая на приложение Код: sql 1. 2. 3. 4. По сути- встроенная в язык ленивая инициализация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 13:31 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38528519&tid=2127793]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 199ms |
| total: | 490ms |

| 0 / 0 |
