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


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