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

у меня есть два объекта которые 1 в 1 только это разные объекты, и мне нужно над ними делать действия которые ниже в функциях.

Можно ли как-то рефакторизировать код, без применения интерфейсов или абстарктного класса. Например с помощью generic?
Заранее благодарен.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  private Bookmark[] convertNodes(List<Node> nodesList)
  {
    List<Bookmark> bookmarks = new ArrayList<Bookmark>();
    for (Node node : nodesList) {
      Element element = (Element)node;

      Person person = getPerson();

      String title = person.getName() + ", " + person.getFirstName();
      String city = bp.getMainAddress().getCity();
      String addDate = element.getElementsByTagName(MexBusUtilsConstants.TAG_ADD_DATE).item(0).getTextContent();
      bookmarks.add(new Bookmark(title, city,, addDate));
    }

    Collections.sort(bookmarks, new Comparator<Bookmark>() {
      @Override
      public int compare(Bookmark b1, Bookmark b2)
      {
        return b1.getAddDate().compareTo(b2.getAddDate());
      }
    });

    return bookmarks.toArray(new Bookmark[bookmarks.size()]);
  }



Код: java
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.
  public RecentActivity[] getRecentActivitiesByProjectList<Node> recentActivityNodes()
  {
    List<RecentActivity> recentActivities = new ArrayList<RecentActivity>();

    for (Node node : recentActivityNodes) {
      Element element = (Element)node;

      Person person = getPerson();

      String title = person.getName() + ", " + person.getFirstName();
      String city = bp.getMainAddress().getCity();
      String addDate = element.getElementsByTagName(MexBusUtilsConstants.TAG_ADD_DATE).item(0).getTextContent();
      recentActivities.add(new RecentActivity(title, city, addDate));
    }

    Collections.sort(recentActivities, new Comparator<RecentActivity>() {
      @Override
      public int compare(RecentActivity ra1, RecentActivity ra2)
      {
        return ra1.getAddDate().compareTo(ra2.getAddDate());
      }
    });

    return recentActivities.toArray(new RecentActivity[recentActivities.size()]);
  }
...
Рейтинг: 0 / 0
Рефакторинг(кода) двух функций - подскажите?
    #38861792
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

можно вот так скрестить ежа с удавом, если Bookmark и RecentActivity имеют общий базовый класс или имплементят один и тот же интерфейс(иначе сорт не прокатит)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    private <T1 extends Node,T2 extends SomeBaseClass> T2[] convertNodes(List<T1> nodesList, Class<T2> clazz) {
        List<T2> bookmarks = new ArrayList<T2>();
        for (T1 node : nodesList) {
            Element element = (Element)node;

            Person person = getPerson();

            String title = person.getName() + ", " + person.getFirstName();
            String city = bp.getMainAddress().getCity();
            String addDate = element.getElementsByTagName(MexBusUtilsConstants.TAG_ADD_DATE).item(0).getTextContent();
            bookmarks.add(clazz.getConstructor(String.class, String.class, String.class).newInstance(title, city, addDate));
        }

        Collections.sort(bookmarks, new Comparator<T2>() {
            @Override
            public int compare(T2 b1, T2 b2)
            {
                return b1.getAddDate().compareTo(b2.getAddDate());
            }
        });

        return bookmarks.toArray((T2[])Array.newInstance(clazz,bookmarks.size()));
    }


и оно возможно даже взлетит :)
но я бы так делать не стал.
...
Рейтинг: 0 / 0
Рефакторинг(кода) двух функций - подскажите?
    #38861874
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

можно кстати заимплиментить Comparable в Bookmark и RecentActivity это позволит избавиться от анонимного компаратора.
...
Рейтинг: 0 / 0
Рефакторинг(кода) двух функций - подскажите?
    #38861912
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На уровне архитектуры приложения всё-таки стоит объявить базовый интерфейс IBookmarkOrActivity.
...
Рейтинг: 0 / 0
Рефакторинг(кода) двух функций - подскажите?
    #38861919
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНа уровне архитектуры приложения всё-таки стоит объявить базовый интерфейс IBookmarkOrActivity. - спасибо, я уже так и понял, что лучшего варианта я не найду.


DDiverможно кстати заимплиментить Comparable в Bookmark и RecentActivity это позволит избавиться от анонимного компаратора. - хорошая идея, пас.
...
Рейтинг: 0 / 0
Рефакторинг(кода) двух функций - подскажите?
    #38861989
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

всё что одинаковое в методах - выносится в единственный общий метод.
всё что разное - уносится в разные классы. Если не можешь менять, сущности, то используй новый класс.
Разница сводится к 3м операциям
1) Конструктор - пердаём типизированую фабрику
2) Компаратор - можно целиком вынести из метода
3) Создание массива - та же фабрика.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
private T[] <T> convertNodes(List<Node> nodesList, XMLBeanFactory<T> factory)
  {
    List<T> beans = new ArrayList<>();
    for (Node node : nodesList) {
      Element element = (Element)node;

      Person person = getPerson();

      String title = person.getName() + ", " + person.getFirstName();
      String city = bp.getMainAddress().getCity();
      String addDate = element.getElementsByTagName(MexBusUtilsConstants.TAG_ADD_DATE).item(0).getTextContent();
      beans .add(factory.instantiate(title, city, addDate));
    }

    Collections.sort(beans , factory.getComparator());

    return beans.toArray(factory.array(beans .size()));
  }



Но по хорошему здесь надо больше классов. Например форматированию тут не место.
В целом, не понятно зачем такой огород, если на Apache Digester XML конвертируется в объекты клевыми правилами, которые всё умеют.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Рефакторинг(кода) двух функций - подскажите?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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