Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> два примера кода: какой лучше использовать, с точки зрения java 
V
    Опции темы
le_chat
Дата 8.8.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



Доброго времени суток.

Есть два примера простого кода - примерная схема так сказать.
Не могу определится какую лучше использовать... Первая мне больше нравится - если метод большой то у него будет только одна точка выхода - наверно его будет проще понять другим разработчикам.
Но хотелось бы узнать мнение профессионалов.  smile

Код

    private ArrayList<String> strings;
    
    public String getParam(String prefex){

        String param = null;
        
        for (String value: strings){

            if ( value.startsWith( prefex ) ){
                  param = value;
                  break;
            }
        }
        return param;
    }


вот второй
Код

    private ArrayList<String> strings;

    public String getParam(String prefex){

        for (String value: strings){
            if ( value.startsWith( prefex ) ){
                return value;
            }
        }
        return null;
    }


упс, точно немного ошибся smile

Это сообщение отредактировал(а) le_chat - 8.8.2007, 18:57
PM MAIL   Вверх
Mayk
Дата 8.8.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Цитата(le_chat @  8.8.2007,  22:35 Найти цитируемый пост)
Первая мне больше нравится - если метод большой то у него будет только одна точка выхода - наверно его будет проще понять другим разработчикам.

Легче? Спорное утверждение.
Хотя бы потому что первый метод скорее всего ошибочен, так как он всегда вернёт null.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 8.8.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Мне больше нравится второй вариант - он на самом деле более информативный и понятный. Чего тянуть кота за хвост, если уже надо что-то возвращать.
PM MAIL WWW ICQ   Вверх
Samotnik
Дата 8.8.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



ИМХО вторая на много проще для прочтения, и с возвратом понятнее.
PM MAIL   Вверх
nornad
Дата 8.8.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(AntonSaburov @  8.8.2007,  21:56 Найти цитируемый пост)
Чего тянуть кота за хвост, если уже надо что-то возвращать.

Кроме того, зачастую в первом варианте после if'a с break'ом придётся делать проверку некоего флажка, надо ли выполнять оставшиеся действия метода. Это сильно загрязняет код.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
math64
Дата 9.8.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



С точки зрения рефакторинга - оба варианта плохи - нельзя выделить тело цикла и сделать Extract Method.
Но второй вариант проще.

PM   Вверх
le_chat
Дата 9.8.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет




 а можно немного по подробнее про рефакторинг.   как должен выглядеть приемлемый вариант? 

 smile 
PM MAIL   Вверх
math64
Дата 10.8.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Ну например так:
Код

    public String getParam(String prefex){
        String param = null;
        for (String value: strings){
            if (param == null && value.startsWith( prefex ) ){
                param = value;
            }
        }
        return param;
    }

После рефакторинга:
Код

    public String getParam(String prefex){
        String param = null;
        for (String value: strings) {
            param = newMethod(param, value, prefex);
        }
        return param;
    }

    public String newMethod(String param, String value, String prefex){
        if (param == null && value.startsWith( prefex ) ){
           param = value;
        }
        return param;
    }

Но это не эффективно - цикл всегда прогоняется до конца. Можно отказаться от foreach, но это тоже некрасиво:
Код

    public String getParam(String prefex){
        String param = null;
        for (Iterator<String> i = strings.getIterator(); param == null && i.hasNext(); ){
            String value = i.next();
            if (/*param == null &&*/ value.startsWith( prefex ) ){
                param = value;
            }
        }
        return param;
    }


PM   Вверх
mindflyer
Дата 10.8.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 1
Всего: 4



Цитата(le_chat @  8.8.2007,  18:35 Найти цитируемый пост)
Первая мне больше нравится - если метод большой то у него будет только одна точка выхода - наверно его будет проще понять другим разработчикам.

Одна точка выхода - идея из парадигмы структурного программирования, и в случае типичных коротких методов классов в java не актуальна. Т.е. лучше сосредоточить свои усилия не на единственной точке выхода, а на коротких легко читаемых методах.
Второй вариант из первого поста более понятный.

Цитата(math64 @  9.8.2007,  14:45 Найти цитируемый пост)
С точки зрения рефакторинга - оба варианта плохи - нельзя выделить тело цикла и сделать Extract Method.

ИМХО, предложенный тобою код гораздо запутаннее. Какова цель рефакторинга в данном случае?



PM MAIL ICQ   Вверх
le_chat
Дата 10.8.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет



я понял так что для рефакторинга хорошо, когда тело цикла можно вынести в отдельный метод. 
при этом идеальный случай, когда цикл выполняется от начала и до конца. 
но ведь довольно часто выполнять цикл до конца не имеет смысла, тогда приходится делать некоторую проверку на его прерывание.  с точки зрения возможного рефакторинга это плохо? если да, то какие могут быть варианты решения?
PM MAIL   Вверх
mindflyer
Дата 10.8.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.10.2004
Где: Smolensk, Russia

Репутация: 1
Всего: 4



Цитата(le_chat @  10.8.2007,  17:50 Найти цитируемый пост)
но ведь довольно часто выполнять цикл до конца не имеет смысла, тогда приходится делать некоторую проверку на его прерывание.   

Если что-то не имеет смысла, то и не нужно это делать smile

Цитата(le_chat @  10.8.2007,  17:50 Найти цитируемый пост)
с точки зрения возможного рефакторинга это плохо? если да, то какие могут быть варианты решения? 

Ты хочешь решить этот вопрос на абстрактном уровне? Нужно смотреть в каждом конкретном случае, решения могут отличаться.
Рефакторинг не самоцель, а средство улучшения качества кода, _когда_это_необходимо_. Под качеством подразумевается в том числе и читабельность кода, и, в общем случае, если рефакторинг затрудняет чтение кода, нафик такой рефакторинг.
В привёденном тобой примере второй вариант самодостаточен и не требует никакого рефакторинга. Хочешь более подробного обсуждения, приведи ещё примеры. А так это похоже на обсуждение сферического коня в вакууме smile
PM MAIL ICQ   Вверх
le_chat
Дата 11.8.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет




ок, я понял. пока примеров нет. переодически возникают вопросы в процессе кодирования - это был как раз один из них smile

все огромное спасибо за разъяснение smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.