Каким должен быть дизайн / Шаблон для добавления / удаления некоторого фрагмента кода в существующем - PullRequest
1 голос
/ 26 марта 2012

Я получил требование в JAVA PROJECT , который содержит массивные добавления и удаления исходных кодов из существующей рабочей копии.Другого выхода нет.В соответствии с контрактом на разработку, я не должен изменять исходный код, поэтому я подумал о наследовании функций, , но это единственный способ сделать это? Поскольку это около 2000+ файловизменения и наследование каждого файла невозможно из-за спецификаторов доступа и финалов в JAVA.

ПРИМЕР: рассмотрим файл с именем MenuManager.java, у которого есть метод, который добавляет 10 меню в MenuBar. Теперь согласно моему требованию Iнужно удалить 5 меню из существующего и добавить вновь определенные (мной) 3 меню в ту же панель меню.Так что самый простой вариант - переопределить метод, но что, если этот тип функций изменяется для всего исходного кода

Ответы [ 2 ]

1 голос
/ 11 апреля 2012

Из вашего описания кажется, что:

  • текущий исходный код не соответствует вашим требованиям
  • вы не можете изменить или легко расширить исходный код

Если это неопровержимые факты, вы столкнулись с трудной ситуацией.Одним из способов продвижения вперед является создание отдельной архитектуры, которая обертывает существующую функциональность, когда имеет смысл ее использовать, или пишет новый код для случаев, когда его трудно использовать повторно.Таким образом, вы рассматриваете существующий код как внешнюю библиотеку , которую вы используете, когда это имеет смысл.Некоторые шаблоны, которые приходят на ум, это мост и адаптер .Наследование обычно не является хорошим способом продвижения вперед, потому что оно слишком тесно связывает расширения (подклассы) с суперклассами.

Итак, учитывая ваш пример:

Рассмотрим файл с именем MenuManager.javaУ меня есть метод, который добавляет 10 Меню в MenuBar. Теперь согласно моему требованию мне нужно удалить 5 меню из существующего и добавить вновь определенные (мной) 3 Меню в тот же самый MenuBar.

Вы можете сделать это следующим образом (это просто идея, не связанная ни с какими библиотеками, такими как Swing):

// MyMenuManager.java <-- your new class

// method that adds menu items
public void addItems(Menu menu) {
  new MenuManager().addItems(menu); // calls the old functionality
  // adapt the menu
  removeObsoleteItems(menu);
  addNewItems(menu);
}

Это будет ваша первая версия, в идеале вы должны развивать ее, чтобы она не зависела от старойкод больше, при условии ваша конечная цель - заменить старое приложение (которое, учитывая ваши ограничения, кажется разумным).

Можно использовать и другие более сложные шаблоны, такие как антикоррупционный слой .

0 голосов
/ 26 марта 2012

Если бы код был разработан с учетом архитектуры плагинов, вы могли бы включать и отключать функции, которые вы хотите и не хотите, либо как часть процесса сборки, либо как часть времени выполнения. Проблема в том, что похоже, что оригинальный источник не был предназначен для этого.

Наследование является одним из вариантов, если оно подходит. Возможно, вы сможете переопределить некоторые вызовы, чтобы они делали больше того, что вы хотите.

В случае вашего примера вы можете изменить компоненты после их добавления:

    final JMenuBar menubar = new JMenuBar();
    SwingUtilities.invokeAndWait(new Runnable()
    {

        public void run()
        {
            JFrame f = new JFrame();
            f.setSize(300, 300);
            f.setJMenuBar(menubar);
            menubar.add(new JMenu("Magic"));
            menubar.add(new JMenu("Stain"));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });

    SwingUtilities.invokeAndWait(new Runnable()
    {

        public void run()
        {
            for(int i = 0; i < menubar.getMenuCount(); i++)
            {
                JMenu item = menubar.getMenu(i);
                if(item != null && "Magic".equals(item.getText()))
                {
                    menubar.remove(i);
                    i--;
                    menubar.doLayout();
                }
            }
        }
    });

Вы, очевидно, захотите обернуть код такого рода, чтобы вам было легче удалять определенные элементы из строки меню.

Самое сложное в вашем вопросе - у вас есть противоположные требования. « Я не должен изменять исходный код » и « массовое добавление и удаление исходного кода »

Звучит так, будто вы хотите, чтобы проект развернулся в другом направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...