powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / избавиться от while
19 сообщений из 19, страница 1 из 1
избавиться от while
    #33671697
while_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот алгоритм, как можно его делать более красивым, т.е. избавиться от вложеных while?

Код: 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.
         final  Set result =  new  TreeSet( new  GrabEntryComparator());

         final  Set set = XSvnUtil.getLog(cfg);

         if  (set !=  null ) {
             final  Map map = XSvnUtil.getDiffMap(cfg, set);
             final  Iterator it = set.iterator();
             while  (it.hasNext()) {
                 final  LogEntry lEntry = (LogEntry) it.next();
                 final  List paths = lEntry.getPathList();
                 final  String rev = lEntry.getRevision();

                Iterator i = paths.iterator();
                 while  (i.hasNext()) {
                     final  PathEntry pathEntry = (PathEntry)i.next();
                     final  String act = pathEntry.getAction().toLowerCase();
                     final  String path = pathEntry.getPath();
                     try  {
                         final  String url = UrlUtils.getUrl(cfg.getUrl(), path) + '/' + PathUtil.cutHead(path);
                         final   boolean  endsWithSmth = url.startsWith(cfg.getUrl());
                         if  (!endsWithSmth) {
                             continue ;
                        }
                    }  catch  (Exception e) {
                         throw   new  GrabberException(e);
                    }

                     if  ("a".equals(act) || "m".equals(act)) {
                        result.add(GetInfoA(cfg, map, rev, path, lEntry));
                    }
                     if  ("d".equals(act)) {
                         final  List dir =  new  LinkedList();
                        Iterator di = dir.iterator();
                         while  (di.hasNext()) {
                             final  String drev = String.valueOf(Integer.parseInt(rev) -  1 );
                            XSvnUtil.getDirList(cfg, path, drev, dir);
                             final  String node = (String)di.next();
                            result.add(GetInfoD(cfg, map, path, node, lEntry));
                        }
                    }
                     if  ("r".equals(act)) {
                        result.add(GetInfoR(cfg, rev, path, lEntry));
                    }
                }
            }
        }
         return  result;
...
Рейтинг: 0 / 0
избавиться от while
    #33671884
s-e-r-g-e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а чего некрасивого во вложенных циклах если не секрет?
...
Рейтинг: 0 / 0
избавиться от while
    #33671892
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может шаблоны использовать, Builder например.
...
Рейтинг: 0 / 0
избавиться от while
    #33671916
while_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s-e-r-g-eа чего некрасивого во вложенных циклах если не секрет?
начальник сказал, что вложенные циклы трудно читаемы и еще В НЕКОТОРЫХ СЛУЧАЯХ показывают непродуманость логики, у меня в данном случае 1ое
...
Рейтинг: 0 / 0
избавиться от while
    #33671924
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наделай методов с красивыми названиями
...
Рейтинг: 0 / 0
избавиться от while
    #33671930
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора чего некрасивого во вложенных циклах если не секрет?
А представьте если их (циклов) штук пятьдесят, как выкручиваться будете?
...
Рейтинг: 0 / 0
избавиться от while
    #33673125
s-e-r-g-e
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТимоН автора чего некрасивого во вложенных циклах если не секрет?
А представьте если их (циклов) штук пятьдесят, как выкручиваться будете?
ну где можно я конечно рекурсию прикручу.. вряд ли будет 50 разнотипных вложенных обработок.. а здесь их не так уж и много, да и не очень они однотипны :)
...
Рейтинг: 0 / 0
избавиться от while
    #33673160
Фотография ZS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да читает не очень, все же лучший вариант разбить по функциям
...
Рейтинг: 0 / 0
избавиться от while
    #33673234
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвсе же лучший вариант разбить по функциям
нет не лучший
...
Рейтинг: 0 / 0
избавиться от while
    #33673256
Фотография ZS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоНнет не лучший
Расскажи лучший, у меня была схожая проблема, выкрутился только функциями.
...
Рейтинг: 0 / 0
избавиться от while
    #33673280
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.programmersheaven.com/articles/faisal/pattern.htm
...
Рейтинг: 0 / 0
избавиться от while
    #33673589
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
while_ s-e-r-g-eа чего некрасивого во вложенных циклах если не секрет?
начальник сказал, что вложенные циклы трудно читаемы и еще В НЕКОТОРЫХ СЛУЧАЯХ показывают непродуманость логики, у меня в данном случае 1ое

А на это

Код: plaintext
1.
2.
 final  List dir =  new  LinkedList();
Iterator di = dir.iterator();

он ничего не сказал?
...
Рейтинг: 0 / 0
избавиться от while
    #33673653
while_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs while_ s-e-r-g-eа чего некрасивого во вложенных циклах если не секрет?
начальник сказал, что вложенные циклы трудно читаемы и еще В НЕКОТОРЫХ СЛУЧАЯХ показывают непродуманость логики, у меня в данном случае 1ое

А на это

Код: plaintext
1.
2.
 final  List dir =  new  LinkedList();
Iterator di = dir.iterator();

он ничего не сказал?
нет, а что это тоже плохо?
...
Рейтинг: 0 / 0
избавиться от while
    #33673691
___Дима_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
while_нет, а что это тоже плохо?
А я считаю что з**бизз!
...
Рейтинг: 0 / 0
избавиться от while
    #33673717
___Дима_ while_нет, а что это тоже плохо?
А я считаю что з**бизз!
:)
...
Рейтинг: 0 / 0
избавиться от while
    #33673774
OU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OU
Гость
2 while_

увольте вашего начальника :)

1. Зачем вам iterator если вы используете collection только для чтения.
2. Зачем вам лишние переменные которые усложняют код.
3. Зачем вам final переменные в local scope.
4. Почему бы вам не добавить комментарии к коду.
5. Проблема не в loops, а в том как написан ваш код.
...
Рейтинг: 0 / 0
избавиться от while
    #33673781
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз всем так понравилась тема, то:

Simple style:

Код: 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.
 public   class  Main {
     public  Set<GrabEntry> collectGrabEntries(Cfg cfg)  throws  GrabberException {

         final  Set<LogEntry> logs = XSvnUtil.getLog(cfg);
         if  (logs ==  null ) {
             return  Collections.emptySet();
        }

         final  Set<GrabEntry> grabEntries =  new  TreeSet( new  GrabEntryComparator());
         final  Map map = XSvnUtil.getDiffMap(cfg, logs);
         for  (LogEntry logEntry : logs) {
             for  (PathEntry pathEntry : logEntry.getPathList()) {
                 if  (isCorrectPath(pathEntry.getPath(), cfg.getUrl())) {
                     final  String action = pathEntry.getAction().toLowerCase();
                     if  ("a".equals(action) || "m".equals(action)) {
                        grabEntries.add(GetInfoA(cfg, map, logEntry.getRevision(), pathEntry.getPath(), logEntry));
                    }  else   if  ("d".equals(action)) {
                         final  List<String> dir =  new  LinkedList<String>();
                        XSvnUtil.getDirList(cfg, pathEntry.getPath(), String.valueOf(Integer.parseInt(logEntry.getRevision()) -  1 ), dir);
                         for  (String node : dir) {
                            grabEntries.add(GetInfoD(cfg, map, pathEntry.getPath(), node, logEntry));
                        }
                    }  else   if  ("r".equals(action)) {
                        grabEntries.add(GetInfoR(cfg, logEntry.getRevision(), pathEntry.getPath(), logEntry));
                    }
                }
            }
        }
         return  grabEntries;
    }

     private   static   boolean  isCorrectPath(String path, String url)  throws  GrabberException {
         try  {
             return  (UrlUtils.getUrl(url, path) + '/' + PathUtil.cutHead(path)).startsWith(url);
        }  catch  (Exception e) {
             throw   new  GrabberException(e);
        }
    }
}

ТимоН like style
Код: 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.
 public   class  Main {
     public  Set<GrabEntry> collectGrabEntries(Cfg cfg)  throws  GrabberException {

         final  Set<LogEntry> logs = XSvnUtil.getLog(cfg);
         if  (logs ==  null ) {
             return  Collections.emptySet();
        }

         return   new  Collector(cfg, logs).getGrabEntries();
    }
}


 public   class  Collector {
     private  Set<GrabEntry> grabEntries;
     private  Cfg cfg;
     private  Map map;

     public  Collector(Cfg cfg, Set<LogEntry> logs)  throws  GrabberException {
         this .cfg = cfg;
        map = XSvnUtil.getDiffMap(cfg, logs);
        grabEntries =  new  TreeSet<GrabEntry>( new  GrabEntryComparator());
         for  (LogEntry logEntry : logs) {
            processLogEntry(logEntry);
        }
    }

     private   void  processLogEntry(LogEntry logEntry)  throws  GrabberException {
         for  (PathEntry pathEntry : logEntry.getPathList()) {
             if  (isCorrectPath(pathEntry.getPath(), cfg.getUrl())) {
                processPathEntry(pathEntry, logEntry);
            }
        }
    }

     private   void  processPathEntry(PathEntry pathEntry, LogEntry logEntry) {
         final  String action = pathEntry.getAction().toLowerCase();
         if  ("a".equals(action) || "m".equals(action)) {
            buildGrabInfoAM(logEntry, pathEntry);
        }  else   if  ("d".equals(action)) {
            buildGrabEntryD(logEntry, pathEntry);
        }  else   if  ("r".equals(action)) {
            buildGrabEntryR(logEntry, pathEntry);
        }
    }

     private   void  buildGrabEntryR(LogEntry logEntry, PathEntry pathEntry) {
        grabEntries.add(GetInfoR(cfg, logEntry.getRevision(), pathEntry.getPath(), logEntry));
    }

     private   void  buildGrabEntryD(LogEntry logEntry, PathEntry pathEntry) {
         final  List<String> dir =  new  LinkedList<String>();
        XSvnUtil.getDirList(cfg, pathEntry.getPath(), String.valueOf(Integer.parseInt(logEntry.getRevision()) -  1 ), dir);
         for  (String node : dir) {
            grabEntries.add(GetInfoD(cfg, map, pathEntry.getPath(), node, logEntry));
        }
    }

     private   void  buildGrabInfoAM(LogEntry logEntry, PathEntry pathEntry) {
        grabEntries.add(GetInfoA(cfg, map, logEntry.getRevision(), pathEntry.getPath(), logEntry));
    }

     private   static   boolean  isCorrectPath(String path, String url)  throws  GrabberException {
         try  {
             return  (UrlUtils.getUrl(url, path) + '/' + PathUtil.cutHead(path)).startsWith(url);
        }  catch  (Exception e) {
             throw   new  GrabberException(e);
        }
    }

     private   static  GrabEntry GetInfoR(Cfg cfg, String rev, String path, LogEntry lEntry) {
         return  ...;
    }

     private   static  GrabEntry GetInfoD(Cfg cfg, Map map, String path, String node, LogEntry lEntry) {
         return  ...;
    }

     private   static  GrabEntry GetInfoA(Cfg cfg, Map map, String rev, String path, LogEntry lEntry) {
         return  ...;
    }

     public  Set<GrabEntry> getGrabEntries() {
         return  grabEntries;
    }
}
...
Рейтинг: 0 / 0
избавиться от while
    #33673805
OU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OU
Гость
2 ТимоН:

авторА представьте если их (циклов) штук пятьдесят, как выкручиваться будете?

Очень просто, к примеру использовать Strategy.
...
Рейтинг: 0 / 0
избавиться от while
    #33673807
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
while_нет, а что это тоже плохо?
Итерироваться по пустому листу?
По крайней мере бессмысленно.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / избавиться от while
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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