powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Стою на асфальте... или применение паттернов без небходимости
16 сообщений из 16, страница 1 из 1
Стою на асфальте... или применение паттернов без небходимости
    #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
Стою на асфальте... или применение паттернов без небходимости
    #34300124
mysterio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
паттерны не панацея, а излишняя гибкость это зло
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #34300191
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ужос какой-то. снимайте лыжи вы на асфальте.
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #34300994
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Н-да загнался я вчера.
Хотя червячок в мозгах остался. В коде класса есть и обратная задача. Связанная с URLDecoder.
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #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
Стою на асфальте... или применение паттернов без небходимости
    #34301788
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
В этом коде есть ошибка.
Всегда надеюсь, что кто-нибудь будет внимательно читать то, что я пишу, и отметится, сообщив о ней, но ни разу ещё этого не случилось :)
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #34301946
Michael Ponomarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 NotGonnaGetUs
ошибка в последней цитате кода?
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #34302981
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вы парни нашли друг друга? или это у NotGonnaGetUs альтерэго Пономарёва?
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #34303056
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppну вы парни нашли друг друга? или это у NotGonnaGetUs альтерэго Пономарёва?

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

Responce вместо Response?
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #34303098
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsexpp, ты расстраиваешься, что не все используют таблицу выбора вместо if-ов? :) нет. меня расстраивает что моё чувство юмора сильно "не догоняет" до среднего уровня
...
Рейтинг: 0 / 0
Стою на асфальте... или применение паттернов без небходимости
    #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
Стою на асфальте... или применение паттернов без небходимости
    #34303154
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz NotGonnaGetUs
В этом коде есть ошибка.

Responce вместо Response?

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

Ага.

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

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

--

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


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