2011-11-08 8 views
2

私は現在、OOPのスキルを高めるための簡単なGUIノートパッドを開発しようとしています。 私は開発中に単一責任原則に固執します。 私は原則に従ってアプリケーションをいくつかの部分に分けました。単一の責任原則とイベントリスナー

// 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 - このクラスは、ボタンによって起動されたすべてのイベントを処理します。

単純な責任原則に従って正しい方法でアプリケーションを分割しましたか?

私もアクションリスナー、マウスリスナーなどを処理するための最良の方法

はこれまでのところ、私はすべてのイベントを処理するために、1のactionPerformed(SomeEvent電子)メソッドを使用しているを見つけるしたいと思います。

private JButton button; 
private JButton button2; 

public void actionPerformed(ActionEvent e) { 

    Object source = e.getSource(); 

    if (source == button) { 

    } else if (source == button2) { 

    } // etc. 

} 

私はこれがイベントリスナーを処理する悪い方法だと認識しています。アプリケーションのサイズが大きくなると、非常に多くの条件文を追加するとコードが読みにくくなり、CPUのパフォーマンスが低下します。

アプリケーションでイベントリスナーをどのように処理しますか? MS OfficeやAutoCADのような巨大で深刻なアプリケーションを開発する場合、どのようにイベントリスナーを記述しますか?

答えて

1

プログラミング中にSRPを使用したいと思うことを非常に嬉しく思います。あなたのやり方は完全に受け入れられます。しかし、これらの原則のどのレベルを適用したいのですかという疑問が常にあります。

また、提供したコード(actionPerformedメソッド)では、OCP(Open Closed Principle)に準拠していないため、設計が間違っています。代わりに、私はあなたが持っているコンポーネントのそれぞれのイベントの種類ごとに別々のメソッドを持っています。

コードDRYを保持するには、コンポーネントが選択されたときに何をすべきかを指示するメソッドを持つことができます。このコンポーネントに関連付けるいくつかのメソッド(異なるタイプのイベントのため)からこのメソッドに委譲します。このことができます

・ホープ..あなたが問題であるあなたは、すべてのイベントを処理する一つの場所を、使用している

+0

"アプリケーションがいくつかのことをしており、非常に複雑なGUIを使用している場合は、コンポーネントごとに別々のクラスを持つことはお勧めできません。複雑なGUIや複雑なシステムの場合は、システム全体についてあまり知らなくても、クラスを分離して相互作用するコンポーネントを作成することを強くお勧めします。 –

+0

Ravi Bhatt、私はあなたの言うことに完全に同意し、したがって私の声明を削除しました。しかし、あなたがこれらの原則に従いたいという程度には限界があります。 – Shankar

1

。より大きなアプリケーションでは、イベントを別々に処理します。アプリケーションの異なるクラスは、異なるイベントを処理します。コンポーネントは、すべてではなく興味を持ったイベントだけを聴いています。 exmapleについて、undo event

理想的には、あなたのクラスは、特定のイベントを引き上げると、それは他のクラスを許可します。..だけでなくFile objectからparagraph objectセンスは、save eventmenu objectdocument objectに意味をなさないと思いますそれらのイベントを購読する。これらのサブスクリプションには、イベントが発生したときに通知されます。

Observer Design Patternをご覧ください。

1

Action」を使用して「機能と状態をコンポーネントから分離する方法」を示すHow to Use Actionsを参照してください。 Charles BellのHTMLDocumentEditorは、既存のアクションを再利用する方法と、AbstractActionに基づいて自分自身を作成する方法を示す例です。

関連する問題