Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / множественные switch case / 15 сообщений из 15, страница 1 из 1
15.07.2009, 20:13
    #36092115
Vetic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Ребята!
дайте критику нижеприведенному алгоритму или помогите оптимизировать работу алгоритма
вот код
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
            for  (FSObject fsobj = cursor.getRange(); fsobj !=  null ; fsobj = cursor.getNext()) {
                //проверка на условия...
                //если условию не соответствует - переходим к следующей записи
                 if  (!(sysnmbr.trim().equals("")) && sysnmbr.trim().length() >  0 ) {
                    sysnmbrFld = (fsobj.getField(RDDB.FLD_RD_RD_SYSNMBR)).getStringValue();
                     int  comparison = sysnmbrFld.compareTo(sysnmbr);
                     switch  (sysnmbrEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <=  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >= 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }
                }
                 if  (!(viddoc.trim().equals("")) && viddoc.trim().length() >  0 ) {
                    viddocFld = (String) (fsobj.getField(RDDB.FLD_RD_RD_VIDDOC)).getStringValue();
                     int  comparison = viddocFld.compareTo(viddoc);
                     switch  (sysnmbrEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <=  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >= 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }

                }
                 if  (!(cashDate.trim().equals("")) && cashDate.trim().length() >  0 ){
                    cashDateFld = (fsobj.getField(RDDB.FLD_RD_RD_DATE)).getStringValue();
                     int  comparison = cashDateFld.compareTo(cashDate);
                     switch  (sysnmbrEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <=  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >= 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }

                }
                rdList.add(fsobj);
            }
            cursor.close();

здесь, в цикле перебираем значения из DAO и сравниваем их со значениями введенными в форму

xxxEq тоже значения с формы, меняю условия соответствия данных

и таких полей на форме больше 20, код стал очень громоздким. посоветуйте, что тут можно сделать??
--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
15.07.2009, 20:19
    #36092124
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
1) Вспомнить про полиморфизм
2) Нафига там вообще switch если на if-ах тоже самое смотрелось бы понятнее.

Количество Case не может рости? Почему бы для начала не избавится от copy-paste и просто вызывать метод?
...
Рейтинг: 0 / 0
15.07.2009, 21:12
    #36092171
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Долго думал что ответить...
Во-первых нивкакую не понял чем отличаются обработка case-ов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :

при любом условии вызывается continue m1;break;
Хотя возможно вы привели не полностью рабочий код, а просто примерную структуру, тогда еще ладно,
Но вот чего все равно никак не могу понять это наличие 6 условий после вызова метода compareTo(), а я то наивный думал их все три - больше, меньше и равно, а больше либо равно уже включает один из этих вариантов, так что этот код можно смело выкинуть ибо он бесполезен.
Итак осталось три условия, которые вполне ложатся на if? else if
Далее порадовала проверка строки на пустое значение, хотя многие и не знают об этом но есть либа commons-lang, там поищите что-то вроде StringUtils.isBlank().
П,С, это все-таки стеб? слишком уж говнокодисто как-то
...
Рейтинг: 0 / 0
15.07.2009, 21:35
    #36092191
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Если поменять местами порядок сравнения предикатов (comparison...) и выражение switch(sysnmbrEq) то думаю, код уменьшится раз в 5. Вообще, исходник необычайно запущенный. Его надо срочно рефакторить или выбросить на свалку. Сопровождать такой сорс просто невозможно.
...
Рейтинг: 0 / 0
16.07.2009, 09:59
    #36092564
chans_max
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Смотря какую цель вы преследуете этим кодом. Если хотите чтоб никто и никогда не смог разобратся в том что вы написали - продолжайте, начало неплохое.
...
Рейтинг: 0 / 0
16.07.2009, 12:23
    #36093019
Vetic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
корявость кода и сам вижу

пришел сюда за советом ибо спросить рядом не у кого

предыдущий пример был неправильным, каждый раз проверяются условия отдельно для каждой отдельной записи sysnmbrEq, viddocEq

Код: plaintext
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
m1:        for  (FSObject fsobj = cursor.getFirst(); fsobj !=  null ; fsobj = cursor.getNext()) {
                //проверка на условия...
                //если условию не соответствует - переходим к следующей записи
                 if  (!(sysnmbr.trim().equals("")) && sysnmbr.trim().length() >  0 ) {
                    sysnmbrFld = (fsobj.getField(RDDB.FLD_RD_RD_SYSNMBR)).getStringValue();
 
                     int  comparison = sysnmbrFld.compareTo(sysnmbr);
 
                     switch  (sysnmbrEq) {
                         case   0 : //все сисномера, что не равены значению
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 : //все сисномера, что равены значению
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 : //все сисномера, что больше значения
                             if  (comparison <=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 : //все сисномера, что меньше значения
                             if  (comparison >=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 : //все сисномера, что больше или равены значению
                             if  (comparison <  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 : //все сисномера, что меньше или равены значению
                             if  (comparison > 0 ) {
                                 continue  m1;
                            }
                             break ;
                    }
                }
                 if  (!(viddoc.trim().equals("")) && viddoc.trim().length() >  0 ) {
                    viddocFld = (fsobj.getField(RDDB.FLD_RD_RD_VIDDOC)).getStringValue();
                     int  comparison = viddocFld.compareTo(viddoc);
                     switch  (viddocEq) {
                         case   0 :
                             if  (comparison ==  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   1 :
                             if  (comparison !=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   2 :
                             if  (comparison <=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   3 :
                             if  (comparison >=  0 ) {
                                 continue  m1;
                            }
                             break ;
                         case   4 :
                             if  (comparison <  0  ) {
                                 continue  m1;
                            }
                             break ;
                         case   5 :
                             if  (comparison >  0 ) {
                                 continue  m1;
                            }
                             break ;
                    }

                }

                ...........

                //если документ удовлетворил условия записываем его в список
                rdList.add(fsobj);
          }

to: Blazkowicz


немного изменил код, вынес сравнение значений в отдельный метод
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
 private   boolean  mycompare( int  i1,  int  comparison){
         switch  (i1) {
             case   0 : //все сисномера, что не равены значению
                 if  (comparison ==  0 ) {
                     return  true;
                }
                 break ;
             case   1 : //все сисномера, что равены значению
                 if  (comparison !=  0 ) {
                     return  true;
                }
                 break ;
             case   2 : //все сисномера, что больше значения
                 if  (comparison <=  0 ) {
                     return  true;
                }
                 break ;
             case   3 : //все сисномера, что меньше значения
                 if  (comparison >=  0 ) {
                     return  true;
                }
                 break ;
             case   4 : //все сисномера, что больше или равены значению
                 if  (comparison <  0  ) {
                     return  true;
                }
                 break ;
             case   5 : //все сисномера, что меньше или равены значению
                 if  (comparison > 0 ) {
                     return  true;
                }
                 break ;
        }
         return  false;
    }

теперь код стал намного короче

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
m1:        for  (FSObject fsobj = cursor.getFirst(); fsobj !=  null ; fsobj = cursor.getNext()) {
                //проверка на условия...
                //если условию не соответствует - переходим к следующей записи
                 if  (!(sysnmbr.trim().equals("")) && sysnmbr.trim().length() >  0 ) {
                    sysnmbrFld = (fsobj.getField(RDDB.FLD_RD_RD_SYSNMBR)).getStringValue();
                     int  comparison = sysnmbrFld.compareTo(sysnmbr);
                     if (mycompare(sysnmbrEq, comparison)){
                         continue  m1;
                    }
                }
                 if  (!(viddoc.trim().equals("")) && viddoc.trim().length() >  0 ) {
                    viddocFld = (fsobj.getField(RDDB.FLD_RD_RD_VIDDOC)).getStringValue();
                     int  comparison = viddocFld.compareTo(viddoc);
                     if (mycompare(viddocEq, comparison)){
                         continue  m1;
                    }
                }
                ...........
                //если документ удовлетворил условия записываем его в список
                rdList.add(fsobj);



to забыл ник

как можно избавится от обработки 6 вариантов значений если условие Я получаю из веб формы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    <select id="sysnmbrEq" name="sysnmbrEq">
        <option value=\"1\" selected=\"selected\">=</option>")
        <option value=\"0\">не =</option>");                  
        <option value=\"2\"><</option>");                     
        <option value=\"3\">></option>");                     
        <option value=\"4\"><=</option>");                    
        <option value=\"5\">>=</option>");
    </select>                    

подскажи пжлст как сделать оптимальние

жду критики еще....)))))
--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
16.07.2009, 12:43
    #36093083
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Vetic...

Если тело case очень сложное, и есть тенденция к расширению количества вариантов - то используй шаблон Replace Conditional with Polymorphism.

Veticmay way
my way
...
Рейтинг: 0 / 0
16.07.2009, 12:53
    #36093130
Vetic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
переписал метод на использование if else

Код: plaintext
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.
30.
31.
32.
33.
34.
 private   boolean  mycompare( int  i1,  int  comparison){
         if (i1== 0 ){
             if  (comparison ==  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 1 ){
             if  (comparison !=  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 2 ){
             if  (comparison <=  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 3 ){
             if  (comparison >=  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 4 ){
             if  (comparison <  0 ) {
                     return  true;
            }
             return  false;
        } else   if (i1== 5 ){
             if  (comparison >  0 ) {
                     return  true;
            }
             return  false;
        }
         return   true;
}

только все равно выглядит громоздко и думаю что из-за такого количества if-ов код будет работать медленее

--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
16.07.2009, 12:58
    #36093153
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Veticпереписал метод на использование if else
только все равно выглядит громоздко и думаю что из-за такого количества if-ов код будет работать медленее
Оператор && вам не знаком в принципе? Для начала запишите эту лесенку ОДНИМ условием. А дальше уже будет видно.
...
Рейтинг: 0 / 0
16.07.2009, 13:11
    #36093225
Vetic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 private   boolean  mycompare( int  i1,  int  comparison){
         if (i1== 0  && comparison ==  0 ){
             return  true;
        } else   if (i1== 1  && comparison !=  0 ){
             return  true;
        } else   if (i1== 2  && comparison <=  0 ){
             return  true;
        } else   if (i1== 3  && comparison >=  0 ){
             return  true;
        } else   if (i1== 4  && comparison <  0 ){
             return  true;
        } else   if (i1== 5  && comparison >  0 ){
             return  true;
        } else  
             return  false;
}
--------------------------------
нет! вы не поняли, это may way.
...
Рейтинг: 0 / 0
16.07.2009, 13:54
    #36093394
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Замечательно! Теперь как на счет ||?
...
Рейтинг: 0 / 0
16.07.2009, 14:00
    #36093418
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
элементарно :)
...
Рейтинг: 0 / 0
16.07.2009, 14:03
    #36093431
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
элементарно :)
Код: plaintext
1.
2.
3.
4.
5.
 private   boolean  mycompare( int  i1,  int  comparison){
     return  (i1== 0  && comparison ==  0 ) || (i1== 1  && comparison !=  0 ) 
        || (i1== 2  && comparison <=  0 ) || (i1== 3  && comparison >=  0 ) 
        || (i1== 4  && comparison <  0 ) || (i1== 5  && comparison >  0 )
}
...
Рейтинг: 0 / 0
16.07.2009, 14:10
    #36093465
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Подобные проверки с comparison я обычно делал с учётом вероятности срабатывания предикатов. Например, если величина равномерноо распылена по диапазону int, то можно проверить сначала comparison>0, потом comparison < 0, а потом проверять нестрогие проверки. Но такая оптимизация была полезна на С++ и на очёнь тяжёлых циклах.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
28.09.2020, 16:34
    #40003534
ravivc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
множественные switch case
Только прошел материал о том как правильно использовать switch как сразу же наткнулся на этот топик))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / множественные switch case / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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