Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / избавиться от while / 19 сообщений из 19, страница 1 из 1
17.04.2006, 16:51
    #33671697
while_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от 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
17.04.2006, 17:46
    #33671884
s-e-r-g-e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
а чего некрасивого во вложенных циклах если не секрет?
...
Рейтинг: 0 / 0
17.04.2006, 17:49
    #33671892
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
Может шаблоны использовать, Builder например.
...
Рейтинг: 0 / 0
17.04.2006, 17:59
    #33671916
while_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
s-e-r-g-eа чего некрасивого во вложенных циклах если не секрет?
начальник сказал, что вложенные циклы трудно читаемы и еще В НЕКОТОРЫХ СЛУЧАЯХ показывают непродуманость логики, у меня в данном случае 1ое
...
Рейтинг: 0 / 0
17.04.2006, 18:02
    #33671924
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
наделай методов с красивыми названиями
...
Рейтинг: 0 / 0
17.04.2006, 18:03
    #33671930
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
автора чего некрасивого во вложенных циклах если не секрет?
А представьте если их (циклов) штук пятьдесят, как выкручиваться будете?
...
Рейтинг: 0 / 0
18.04.2006, 12:10
    #33673125
s-e-r-g-e
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
ТимоН автора чего некрасивого во вложенных циклах если не секрет?
А представьте если их (циклов) штук пятьдесят, как выкручиваться будете?
ну где можно я конечно рекурсию прикручу.. вряд ли будет 50 разнотипных вложенных обработок.. а здесь их не так уж и много, да и не очень они однотипны :)
...
Рейтинг: 0 / 0
18.04.2006, 12:17
    #33673160
ZS
ZS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
Да читает не очень, все же лучший вариант разбить по функциям
...
Рейтинг: 0 / 0
18.04.2006, 12:30
    #33673234
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
авторвсе же лучший вариант разбить по функциям
нет не лучший
...
Рейтинг: 0 / 0
18.04.2006, 12:34
    #33673256
ZS
ZS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
ТимоНнет не лучший
Расскажи лучший, у меня была схожая проблема, выкрутился только функциями.
...
Рейтинг: 0 / 0
18.04.2006, 12:41
    #33673280
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
http://www.programmersheaven.com/articles/faisal/pattern.htm
...
Рейтинг: 0 / 0
18.04.2006, 14:07
    #33673589
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
while_ s-e-r-g-eа чего некрасивого во вложенных циклах если не секрет?
начальник сказал, что вложенные циклы трудно читаемы и еще В НЕКОТОРЫХ СЛУЧАЯХ показывают непродуманость логики, у меня в данном случае 1ое

А на это

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

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

А на это

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

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

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

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

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
18.04.2006, 15:06
    #33673805
OU
OU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
избавиться от while
2 ТимоН:

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

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


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