Принцип единой ответственности и слушатели событий - PullRequest
2 голосов
/ 09 ноября 2011

В настоящее время я пытаюсь разработать простой блокнот с графическим интерфейсом для повышения своих навыков в ООП. При разработке я придерживаюсь принципа единой ответственности. Я разделил приложение на несколько частей по принципу.

// This class runs the whole application
public class Notepad {

   public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
                public void run() {
                new NotepadFrame();
           }
            });

    }
}
// This class is responsible for setting up a frame
public class NotepadFrame extends JFrame {

public NotepadFrame() {
        super("Notepad");

        MenuBar menuBar = new MenuBar();
        setJMenuBar(menuBar.createMenuBar());

        pack();
        setVisible(true);

    }
}
// This class sets up a menu bar
public class MenuBar {

public JMenuBar createMenuBar() {

        JMenuBar menuBar = new JMenuBar();
        Buttons buttons = new Buttons();

        menuBar.add(buttons.createFileMenuItems());
        menuBar.add(buttons.createEditMenuItems());
        menuBar.add(buttons.createFormatMenuItems());
        menuBar.add(buttons.createHelpMenuItems());

        return menuBar;
    }
}

Есть и другие классы. Кнопки - этот класс используется для создания кнопок панели меню. MenuItemActionListeners - этот класс обрабатывает все события, запускаемые кнопками.

Правильно ли я разделил заявку в соответствии с принципом простой ответственности?

Я также хотел бы найти лучшие способы работы со слушателями действий, мышью и т. Д.

До сих пор я использовал один метод actionPerformed (SomeEvent e) для обработки всех событий.

private JButton button;
private JButton button2;

public void actionPerformed(ActionEvent e) {

    Object source = e.getSource();

    if (source == button) {

    } else if (source == button2) {

    } // etc.

}

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

Как вы обрабатываете прослушиватели событий в своих приложениях? Как бы вы написали прослушиватели событий при разработке огромных и серьезных приложений, таких как MS Office или AutoCAD?

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Вы используете одно место, где вы обрабатываете все события, что является проблемой.В больших приложениях вы будете обрабатывать события по-разному, разные классы в вашем приложении будут обрабатывать разные события.Компоненты слушают только несколько событий, которые им интересны, а не всем.Например, undo event имеет смысл только для paragraph object, а не File object, save event имеет смысл для menu object и document object .. и т. Д.

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

Я бы посоветовал вам взглянуть на Шаблон проектирования наблюдателя .

1 голос
/ 09 ноября 2011

См. Как использовать действия , в которых показано, как Action "можно использовать для отделения функциональности и состояния от компонента". HTMLDocumentEditor Чарльза Белла - пример, который показывает, как повторно использовать существующие действия, а также создавать свои собственные на основе AbstractAction.

1 голос
/ 09 ноября 2011

Я очень рад видеть, что вы хотите использовать SRP во время программирования.То, как вы это сделали, вполне приемлемо.Однако всегда возникает вопрос, на каком уровне этих принципов вы хотите применить?

Кроме того, в предоставленном вами коде (метод actionPerformed) он не совместим с OCP (Open Closed Principle) и, следовательно,плохой дизайн.Вместо этого у меня были бы отдельные методы для каждого типа события в каждом из тех компонентов, которые у вас есть.

Чтобы сохранить код СУХИМЫМ, у вас может быть метод, который говорит вам, что делать, когда компонент выбран.Делегируйте этот метод из нескольких методов (из-за разного типа событий), которые вы связываете для этого компонента.

Надеюсь, это поможет ..

...