Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Стою на асфальте... или применение паттернов без небходимости / 16 сообщений из 16, страница 1 из 1
01.02.2007, 17:16:39
    #34299934
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Есть класс EPRequest epRequest, в нем TreeMap<String, String[]> parameterMap.
По смыслу в parameterMap хрянятся значения, которые потом методом POST будут отсылаться на сервер.
раньше был такой код:
Код: plaintext
1.
  sendData(epRequest.getResponse());
и сам метод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
     public  String getResponse() {
        String result = "";
        
         for  (Map.Entry<String, String[]> e : ((Map<String, String[]>)parameterMap).entrySet()) {
             for  (String v : e.getValue()) {
                 try  {
                    result += e.getKey() + SYMB_EQUAL + URLEncoder.encode(v, ENCODING) + SYMB_AND;
                }  catch  (UnsupportedEncodingException ex) {
                    //bla-bla
                }
            }
        }
         if  (result.endsWith(SYMB_AND)) {
            result = result.substring( 0 , result.length() -  1 );
        }
         return  result;
    }
а потом в голову закралась крамольная мысль, а почему класс, хранящий данные должен что-то знать об отсылке этих данных?
вообщем в результате получилось:
Код: 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.
 interface  Visitor {
    String visit(Preparer preparer);
}

 interface  Visitable {
     public  String getValue(Visitor visitor);
}

 class  Preparer  implements  Visitable {
     private  Map<String, String[]> parameterMap;
    
     public  Preparer(Map<String, String[]> parameterMap) {
         this .parameterMap = parameterMap;
    }

     public  Map<String, String[]> getParameterMap() {
         return  parameterMap;
    }
    
     public  String getValue(Visitor visitor) {
         return  visitor.visit( this );
    }
}

 class  URLEncoderVisitor  implements  Visitor {
     public  String visit(Preparer preparer) {
        String result = "";
         for  (Map.Entry<String, String[]> e : ((Map<String, String[]>)preparer.getParameterMap()).entrySet()) {
             for  (String v : e.getValue()) {
                 try  {
                    result += e.getKey() + SYMB_EQUAL + URLEncoder.encode(v, ENCODING) + SYMB_AND;
                }  catch  (UnsupportedEncodingException ex) {
                    //log.error(ex);
                    //ex.printStackTrace();
                }
            }
        }
         if  (result.endsWith(SYMB_AND)) {
            result = result.substring( 0 , result.length() -  1 );
        }
         return  result;
    }
}

и сам метод класса EPRequest:
Код: plaintext
1.
2.
3.
 public  String getResponse() {
     return   new  Preparer(parameterMap).getValue( new  URLEncoderVisitor());
}
теперь стойкая уверенность о применения паттерна без необходимости и о какой-то "графомании" в коде.
Лучше оставить первый метод?
...
Рейтинг: 0 / 0
01.02.2007, 18:06:02
    #34300124
mysterio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
паттерны не панацея, а излишняя гибкость это зло
...
Рейтинг: 0 / 0
01.02.2007, 18:25:01
    #34300191
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
ужос какой-то. снимайте лыжи вы на асфальте.
...
Рейтинг: 0 / 0
02.02.2007, 09:29:39
    #34300994
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Н-да загнался я вчера.
Хотя червячок в мозгах остался. В коде класса есть и обратная задача. Связанная с URLDecoder.
...
Рейтинг: 0 / 0
02.02.2007, 12:18:54
    #34301758
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Michael PonomarevН-да загнался я вчера.
Хотя червячок в мозгах остался. В коде класса есть и обратная задача. Связанная с URLDecoder.

Если уж захотелось, то желание нужно проводить в жизнь последовательно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
     public  String getResponse() {
        StringBuilder result =  new  StringBuilder();

         for  (Map.Entry<String, String[]> e : ((Map<String, String[]>) parameterMap).entrySet()) {
             for  (String v : e.getValue()) {
                 try  {
                    result.append(e.getKey()).append(SYMB_EQUAL).append(URLEncoder.encode(v, ENCODING)).append(SYMB_AND);
                }  catch  (UnsupportedEncodingException ex) {
                    //bla-bla
                }
            }
        }

         if  (result.length() > SYMB_AND.length()) {
             return  result.substring( 0 , result.length() - SYMB_AND.length());
        }
         return  result.toString();
    }

visitor? ok...

Выделяем алгоритм обхода parameterMap'a:
Код: 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.
     public  String getResponse() {
        Visitor visitor =  new  Visitor();

         for  (Map.Entry<String, String[]> e : ((Map<String, String[]>) parameterMap).entrySet()) {
             for  (String v : e.getValue()) {
                visitor.visit(e.getKey(), v);
            }
        }

         return  visitor.toString();
    }

     class  Visitor {
        StringBuilder result =  new  StringBuilder();

         void  visit(String key, String value) {
             try  {
                result.append(key).append(SYMB_EQUAL).append(URLEncoder.encode(value, ENCODING)).append(SYMB_AND);
            }  catch  (UnsupportedEncodingException ex) {
                //bla-bla
            }
        }

         public  String toString() {
             if  (result.length() > SYMB_AND.length()) {
                 return  result.substring( 0 , result.length() - SYMB_AND.length());
            }
             return  result.toString();
        }
    }

Выделяем интерфейс:

Код: 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.
      public  String getResponse() {
        ParameterVisitor builder =  new  ResponceBuilder();
        visit(builder);
         return  builder.toString();
    }

     private   void  visit(ParameterVisitor visitor) {
         for  (Map.Entry<String, String[]> e : ((Map<String, String[]>) parameterMap).entrySet()) {
             for  (String v : e.getValue()) {
                visitor.visit(e.getKey(), v);
            }
        }
    }

----

 interface  ParameterVisitor {
     void  visit(String key, String value);
}

 class  ResponceBuilder  implements  ParameterVisitor {
     private   static   final  String SYMB_EQUAL = "=";
     private   static   final  String SYMB_AND = "&";
     private   static   final  String ENCODING = "bla-bla";

     private  StringBuilder result =  new  StringBuilder();

     public   void  visit(String key, String value) {
         try  {
            result.append(key).append(SYMB_EQUAL).append(URLEncoder.encode(value, ENCODING)).append(SYMB_AND);
        }  catch  (UnsupportedEncodingException ex) {
            //bla-bla
        }
    }

     public  String toString() {
         if  (result.length() > SYMB_AND.length()) {
             return  result.substring( 0 , result.length() - SYMB_AND.length());
        }
         return  result.toString();
    }
}

Выбираем более подходящую метафору:

Код: 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.
     public  String getResponse() {
        ParameterProcessor responceCreator =  new  ResponceCreator();
        responceCreator.processParameters((Map<String, String[]>) parameterMap);
         return  responceCreator.toString();
    }

--------
 abstract   class  ParameterProcessor {
     abstract   void  process(String key, String value);

     public   void  processParameters(Map<String, String[]> parameters) {
         for  (Map.Entry<String, String[]> e : parameters.entrySet()) {
             for  (String v : e.getValue()) {
                process(e.getKey(), v);
            }
        }
    }
}

 class  ResponceCreator  extends  ParameterProcessor {
     private   static   final  String SYMB_EQUAL = "=";
     private   static   final  String SYMB_AND = "&";
     private   static   final  String ENCODING = "bla-bla";

     private  StringBuilder result =  new  StringBuilder();

     public   void  process(String key, String value) {
         try  {
            result.append(key).append(SYMB_EQUAL).append(URLEncoder.encode(value, ENCODING)).append(SYMB_AND);
        }  catch  (UnsupportedEncodingException ex) {
            //bla-bla
        }
    }

     public  String toString() {
         if  (result.length() > SYMB_AND.length()) {
             return  result.substring( 0 , result.length() - SYMB_AND.length());
        }
         return  result.toString();
    }
}

з.ы.
А в это время все говорят - гибкость зло, гибкость зло, и пишут гирлянды скучного кода :)
...
Рейтинг: 0 / 0
02.02.2007, 12:23:21
    #34301788
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
NotGonnaGetUs
В этом коде есть ошибка.
Всегда надеюсь, что кто-нибудь будет внимательно читать то, что я пишу, и отметится, сообщив о ней, но ни разу ещё этого не случилось :)
...
Рейтинг: 0 / 0
02.02.2007, 12:56:16
    #34301946
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
2 NotGonnaGetUs
ошибка в последней цитате кода?
...
Рейтинг: 0 / 0
02.02.2007, 16:17:50
    #34302981
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
ну вы парни нашли друг друга? или это у NotGonnaGetUs альтерэго Пономарёва?
...
Рейтинг: 0 / 0
02.02.2007, 16:32:42
    #34303056
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
exppну вы парни нашли друг друга? или это у NotGonnaGetUs альтерэго Пономарёва?

expp, ты расстраиваешься, что не все используют таблицу выбора вместо if-ов? :)
...
Рейтинг: 0 / 0
02.02.2007, 16:35:41
    #34303068
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
NotGonnaGetUs
В этом коде есть ошибка.

Responce вместо Response?
...
Рейтинг: 0 / 0
02.02.2007, 16:42:45
    #34303098
expp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
NotGonnaGetUsexpp, ты расстраиваешься, что не все используют таблицу выбора вместо if-ов? :) нет. меня расстраивает что моё чувство юмора сильно "не догоняет" до среднего уровня
...
Рейтинг: 0 / 0
02.02.2007, 16:50:59
    #34303124
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Во-первых:
Ponomarev Michael != NotGonnaGetUs
Ponomarev Michael != (альтерэго)NotGonnaGetUs


Во-вторых каждый подход имеет право на жизнь
В-третьих война уже была

2 NotGonnaGetUs
в качестве вступления: получилось один потерял, второй сломал ((С) популярный анекдот)
вот что получилось:

Код: 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.
 abstract   class  ParameterProcessor {
     protected   abstract  StringBuilder process(String key, String value);

     public   void  processParameters(Map<String, String[]> parameterMap) {
         for  (Map.Entry<String, String[]> e : parameterMap.entrySet()) {
             for  (String v : e.getValue()) {
                process(e.getKey(), v);
            }
        }
    }
}

//class ResponseCreator extends ParameterProcessor {
 class  URLEncoderCreator  extends  ParameterProcessor {
     private  StringBuilder allText =  new  StringBuilder();

     protected  StringBuilder process(String key, String value) {
        StringBuilder result =  new  StringBuilder();
         try  {
            result.append(key).append(SYMB_EQUAL).append(URLEncoder.encode(value, ENCODING)).append(SYMB_AND);
            allText.append(result);
        }  catch  (UnsupportedEncodingException ex) {
            //bla-bla
        }
         return  result;
    }
    
     protected  String symbAndDelete(StringBuilder stringBuilder) {
         if  (stringBuilder.length() > SYMB_AND.length()) {
             return  stringBuilder.substring( 0 , stringBuilder.length() - SYMB_AND.length());
        }
         return  stringBuilder.toString();
    }
    
     protected  String getAllText() {
         return  symbAndDelete(allText);
    }
    
     public  String toString() {
         return  getAllText();
    }
}

 class  OriginGetter  extends  URLEncoderCreator {
     private   static   final  String SPACE_TRUE  = "\\+";
     private   static   final  String SPACE_FALSE = "%20";
     private  StringBuilder textWithoutSign =  new  StringBuilder();
     private   final  ArrayList<String> sign;
    
     public  OriginGetter(ArrayList<String> sign) {
         this .sign = sign;
    }

     protected  StringBuilder process(String key, String value) {
        RequstParamNames requstParamName = RequstParamNames.valueOf(key.toUpperCase());
        StringBuilder result =  super .process(key, value);
         if  (requstParamName != SIGN ) {
            textWithoutSign.append(result);
        }  else  {
            sign.add(value);
        }
         return  result;
    }
    
     protected  String spaceReplace(String string) {
         return  string.replaceAll(SPACE_TRUE, SPACE_FALSE);
    }

     public  String getAllText() {
         return  spaceReplace( super .getAllText());
    }
    
     public  String getTextWithoutSign() {
         return  spaceReplace(symbAndDelete(textWithoutSign));
    }
    
     public  ArrayList<String> getSign() {
         return  sign;
    }
}
.....................
где-то в программе:
     public   void  method1() {
        OriginGetter originGetter =  new  OriginGetter(sign);
        originGetter.processParameters( this .parameterMap);
        textWithSign = originGetter.getAllText();
        text = originGetter.getTextWithoutSign();
    }

     public  String getResponse() {
        URLEncoderCreator urlEncoderCreator =  new  URLEncoderCreator();
        urlEncoderCreator.processParameters(parameterMap);
         return  urlEncoderCreator.toString();
    }
чего-то не клеится.....
...
Рейтинг: 0 / 0
02.02.2007, 16:58:52
    #34303154
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Blazkowicz NotGonnaGetUs
В этом коде есть ошибка.

Responce вместо Response?

Неа, настоящая ошибка :)
...
Рейтинг: 0 / 0
02.02.2007, 17:03:03
    #34303165
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Michael Ponomarev2 NotGonnaGetUs
ошибка в последней цитате кода?
т.е. после "Выбираем более подходящую метафору:"
или искать во всем коде?
...
Рейтинг: 0 / 0
02.02.2007, 17:11:49
    #34303198
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
Michael Ponomarev Michael Ponomarev2 NotGonnaGetUs
ошибка в последней цитате кода?
т.е. после "Выбираем более подходящую метафору:"

Ага.

В "class URLEncoderCreator extends ParameterProcessor {" она исправлена хоть и не самым лучшим образом.

Отрезание по символу при каждом обращении к getAllText или toString можно считать фичей )

--

Разобраться, что должен делать OriginGetter и что "не клеится", за отведённые 5 минут не смог :)
...
Рейтинг: 0 / 0
02.02.2007, 17:25:08
    #34303236
Michael Ponomarev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стою на асфальте... или применение паттернов без небходимости
По-поводу OriginGetter: все эти классы являются "вспомогательным". Так вот в OriginGetter применяется URL кодирование, с целью получения "оригинального" запроса, каким мне его прислали, а не как его преобразовал HttpServletRequest. Ну а там где URLEncoderCreator - это уже мой ответ.
NotGonnaGetUsОтрезание по символу при каждом обращении к getAllText или toString можно считать фичей ) Ох-ох-ох, не увидел :)
"не клеится" - ощущение что код можно улучшить
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Стою на асфальте... или применение паттернов без небходимости / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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