Java.use(better);

Java.use(better);


Episode#04
Command パターンの効能 -- if と別れる50の方法


《関連記事》

■ Command パターンを適用する

 ̄この問題を解消するために、Command パターンを適用すると、

// -------------------------------------- after
  public void actionPerformed(ActionEvent e)   {
    Command obj = (Command)e.getSource();
    obj.execute();
  }

多重の if 文が不要になるので、コードが簡潔で見通しが良くなります。また、要求仕様の変更(新たな処理の追加)があっても、このコードの断片は再利用できます。

 ̄これは、次のように実現します。

public interface Command {
  public void execute
();
}

 ̄インターフェース Command では、具体的な処理を実行するときに必要なメソッド execute を規定します。そして、各コンポーネントでは、その規定に沿ってメソッド execute を実現します。たとえば、

class QuitMenu extends JMenuItem implements Command {
  public void execute() {
    System.exit(0);
  }
}

メニュー項目を選択したときに、アプリケーションを終了させます。

Scala を導入する

 ̄Command パターンを適用すると、多重の if 文が不要になるので、コードが簡潔で見通しが良くなります。しかし、問題も残ります。というのも、Java で作成したコードは、次のように散在します。

// Java #1
    JMenuItem quitMenu = new QuitMenu("Quit");
    quitMenu.addActionListener(this);
    fileMenu.add(quitMenu);

// Java #2
public interface Command {
  public void execute();
}

// Java #3
class QuitMenu extends JMenuItem implements Command {
  public void execute() {
    System.exit(0);
  }
}

ここには、次のようなコードの断片が記述してあります。

  1. コンポーネントを作成してリスナーを登録する
  2. インターフェースを規定して
  3. それに準拠するメソッドを作成する


Scala では、これらを一か所に集約できます。

// Scala
  val quitMenu = new MenuItem("Quit") {
    new Publisher {
      reactions += {
        case ButtonClicked(source) =>
          frame.closeOperation
      }
    }.listenTo(this)
  }.peer
  fileMenu.add(quitMenu)

つまり、Command パターンのエッセンスはすでに、Scala ライブラリーに盛り込まれています。

■ switch 文の隘路

Scala で導入された「match 式」は、ともすると、古典的な switch 文と同列に比較されがちです。しかし、プログラミングの立場からすると、これらには雲泥の開きがあります。古典的な switch 文は、SP の三本柱のひとつ「分岐」構造を支援します。match 式は、OOP の三本柱のひとつ「ポリモフィズム」を支援します。また、match 式の特性を利用して「パターンマッチング」を実現できます。これにより、オブジェクト指向プログラミングと関数型プログラミングとの融合を図り、プログラミングの能率を劇的に向上できます。

■ match 式を伴うポリモフィズム

 ↑ TOP

》作業中です《

update*13/01/18 21:03:56