Featured image of post Commandパターン調査ドキュメント

Commandパターン調査ドキュメント

シリーズ記事「Commandパターンで学ぶオブジェクト指向設計」作成のための調査ドキュメント。GoFデザインパターン、SOLID原則との関連、Perl/Mooでの実装、CLI・Undo/Redoへの応用まで徹底調査。

Commandパターン調査ドキュメント

調査概要

  • 調査目的: シリーズ記事「Commandパターンで学ぶオブジェクト指向設計」作成のための情報収集
  • 調査実施日: 2026年1月7日
  • 技術スタック: Perl
  • 想定読者: Perl入学式卒業程度、「Mooで覚えるオブジェクト指向プログラミング」シリーズ(全12回)を読了した読者

学習ゴール

  • Commandパターンの理解と実装
  • SOLID原則(特にOCP、SRP、DIP)との関連の理解
  • 実践的なCLIツールへの応用

最終ゴール

  • 「操作」をオブジェクトとして扱う設計思想の習得
  • テストしやすく、拡張性の高いアプリケーション設計

1. Commandパターンの基本情報

1.1 パターンの定義と目的

要点:

  • Commandパターンは、リクエスト(操作・命令)をオブジェクトとしてカプセル化する振る舞いパターンである
  • リクエストの送信者(Invoker)と受信者(Receiver)を分離し、疎結合な設計を実現する
  • コマンドをオブジェクト化することで、パラメータ化、キューイング、ログ記録、Undo/Redo機能などが実現可能になる

根拠:

  • GoF「Design Patterns」書籍において、Commandパターンは以下のように定義されている:

    「リクエストをオブジェクトとして扱い、異なるリクエストでクライアントをパラメータ化し、リクエストをキューに入れたり、ログに記録したり、操作の取り消しをサポートする」

仮定:

  • 読者は「Mooで覚えるオブジェクト指向プログラミング」シリーズで、Mooの基本的な使い方(hassubMoo::Role)を習得済み

出典:

信頼度: 10/10(GoF原典および複数の信頼できる技術サイト)


1.2 パターンの構成要素

Commandパターンは、以下の5つの主要コンポーネントで構成される。

	classDiagram
    class Client {
        +main()
    }
    class Invoker {
        -command: Command
        +setCommand(Command)
        +executeCommand()
    }
    class Command {
        <<interface>>
        +execute()
        +undo()
    }
    class ConcreteCommand {
        -receiver: Receiver
        -state
        +execute()
        +undo()
    }
    class Receiver {
        +action()
    }
    
    Client ..> ConcreteCommand : creates
    Client ..> Receiver : creates
    Invoker o--> Command : has
    ConcreteCommand ..|> Command : implements
    ConcreteCommand --> Receiver : calls
要素役割Perl実装での具体例
Command (インターフェース)コマンドの実行メソッド(execute)を宣言Command::Role(Moo::Role)
ConcreteCommand (具象コマンド)Commandインターフェースを実装し、Receiverとアクションを結びつけるCommand::Add, Command::List, Command::Complete
Receiver (受信者)実際の処理を知っているオブジェクトTaskRepository, TextEditor
Invoker (呼び出し元)コマンドの実行を依頼するオブジェクトCLIアプリのメインルーチン、UIボタン
Client (クライアント)ConcreteCommandオブジェクトを生成し、Invokerに設定コマンドライン引数の解析部分

出典:

信頼度: 10/10


1.3 パターンの利点と欠点

利点

利点説明実践的な効果
疎結合送信者と受信者を分離CLIの引数解析とビジネスロジックを分離できる
拡張性(OCP準拠)新しいコマンドを追加しても既存コードへの影響が少ないCommand::Deleteなどを後から追加しやすい
Undo/Redo対応操作履歴を保存し元に戻すことが可能テキストエディタの履歴機能に最適
ログ記録・履歴管理実行したコマンドを記録できる操作ログの実装が容易
マクロ・バッチ処理複数のコマンドをまとめて実行ジョブキュー、タスクスケジューラに適用可能
遅延実行・キューイングコマンドを保存して後で実行非同期処理、バックグラウンドジョブ

欠点

欠点説明対策
クラス数の増加各コマンドごとにクラスが必要小規模アプリでは過剰にならないよう注意
複雑性の増加単純な処理でも複数のクラスが関与初心者向け記事では段階的に導入
過剰設計のリスクシンプルなケースに適用すると冗長将来の拡張可能性を考慮して判断

出典:

信頼度: 10/10


1.4 適用シーン

Commandパターンは以下のようなシーンで効果的:

適用シーン説明具体例
CLIツール(サブコマンド)各サブコマンドを独立したオブジェクトとして実装todo add, todo list, todo complete
Undo/Redo機能操作を履歴として保存し、逆操作を実行テキストエディタ、描画アプリ
マクロ記録一連の操作を記録して再生スプレッドシートのマクロ
ジョブキュー・タスクスケジューリングコマンドをキューに入れて後で実行バックグラウンドジョブ、cron代替
トランザクション管理複数の操作をまとめて実行・ロールバックデータベース操作
GUI/イベント駆動UIボタンやメニュー項目にコマンドを関連付けデスクトップアプリ

出典:

信頼度: 10/10


2. Perlでの実装方法

2.1 Moo::Roleを使ったCommandインターフェース

要点:

PerlでCommandパターンを実装する場合、Moo::Roleを使ってCommandインターフェースを定義し、各ConcreteCommandクラスでロールを消費(with)する方法が推奨される。

Command Role(インターフェース):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package Command::Role {
    use Moo::Role;
    
    # 必須メソッドの宣言
    requires 'execute';      # コマンドの実行
    requires 'description';  # コマンドの説明(ヘルプ表示用)
    
    # オプション:Undo対応の場合
    # requires 'undo';
}

ConcreteCommand例:

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package Command::Add {
    use Moo;
    use v5.36;
    with 'Command::Role';

    has repository => (is => 'ro', required => 1);
    has title      => (is => 'ro', required => 1);

    sub execute ($self) {
        my $task = Task->new(title => $self->title);
        $self->repository->add($task);
        say "タスクを追加しました: " . $self->title;
    }

    sub description ($self) { 'タスクを追加する' }
}

package Command::List {
    use Moo;
    use v5.36;
    with 'Command::Role';

    has repository => (is => 'ro', required => 1);

    sub execute ($self) {
        my @tasks = $self->repository->all;
        for my $task (@tasks) {
            my $status = $task->is_done ? '[x]' : '[ ]';
            printf "%d. %s %s\n", $task->id, $status, $task->title;
        }
    }

    sub description ($self) { 'タスク一覧を表示する' }
}

package Command::Complete {
    use Moo;
    use v5.36;
    with 'Command::Role';

    has repository => (is => 'ro', required => 1);
    has task_id    => (is => 'ro', required => 1);

    sub execute ($self) {
        my $task = $self->repository->find($self->task_id);
        if ($task) {
            $task->mark_done;
            $self->repository->save($task);
            say "タスクを完了しました: " . $task->title;
        } else {
            say "タスクが見つかりません: ID " . $self->task_id;
        }
    }

    sub description ($self) { 'タスクを完了にする' }
}

根拠:

  • Moo::Roleのrequiresで必須メソッドを宣言でき、実装漏れを防げる
  • 継承ではなく合成で機能を追加できる(「Mooで覚えるオブジェクト指向プログラミング」第10回で学習済み)

出典:

信頼度: 10/10


2.2 v5.36以降のsignatures対応

要点:

Perl v5.36以降では、use v5.36;を宣言することで、サブルーチンのシグネチャが利用可能。コードの可読性が向上する。

シグネチャなし(従来のスタイル):

1
2
3
4
sub execute {
    my $self = shift;
    # 処理
}

シグネチャあり(v5.36以降):

1
2
3
sub execute ($self) {
    # 処理
}

根拠:

  • Perl 5.36でuse v5.36;が利用可能になり、シグネチャがデフォルトで有効化
  • モダンPerlの記法として推奨されている

出典:

信頼度: 10/10


2.3 Invoker(呼び出し元)の実装

要点:

Invokerはコマンドを保持し、適切なタイミングで実行する。CLIツールの場合、引数解析後にコマンドを実行する部分がInvokerの役割を果たす。

シンプルなInvoker:

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package TodoApp {
    use Moo;
    use v5.36;

    has repository => (is => 'ro', required => 1);
    
    sub run ($self, @args) {
        my $command_name = shift @args // 'help';
        
        my $command = $self->_create_command($command_name, @args);
        
        if ($command) {
            $command->execute;
        } else {
            $self->_show_help;
        }
    }
    
    sub _create_command ($self, $name, @args) {
        my %commands = (
            add      => sub { 
                Command::Add->new(
                    repository => $self->repository,
                    title      => $args[0] // die "タスク名を指定してください\n",
                );
            },
            list     => sub {
                Command::List->new(repository => $self->repository);
            },
            complete => sub {
                Command::Complete->new(
                    repository => $self->repository,
                    task_id    => $args[0] // die "タスクIDを指定してください\n",
                );
            },
        );
        
        return exists $commands{$name} ? $commands{$name}->() : undef;
    }
    
    sub _show_help ($self) {
        say "使い方: todo <command> [args]";
        say "  add <title>     タスクを追加";
        say "  list            タスク一覧を表示";
        say "  complete <id>   タスクを完了にする";
    }
}

信頼度: 8/10(実践的な実装例)


3. 関連するSOLID原則

3.1 単一責任原則(SRP)との関連

要点:

  • Commandパターンでは、各コマンドクラスが1つの操作のみを担当する
  • 「タスク追加」「タスク一覧」「タスク完了」がそれぞれ独立したクラス
  • 変更理由が明確:Command::Addはタスク追加の仕様変更時のみ修正

具体例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 良い例:各コマンドは1つの責任のみ
package Command::Add { ... }       # タスク追加のみ
package Command::List { ... }      # タスク一覧のみ
package Command::Complete { ... }  # タスク完了のみ

# 悪い例:1つのクラスに複数の責任
package TodoCommands {
    sub add { ... }
    sub list { ... }
    sub complete { ... }
    # 変更理由が3つある → SRP違反
}

出典:

信頼度: 10/10


3.2 開放/閉鎖原則(OCP)との関連

要点:

  • Commandパターンは拡張に開かれ、修正に閉じた設計を実現
  • 新しいコマンドを追加する際、既存のコマンドクラスを修正する必要がない
  • 新しいConcreteCommandクラスを追加するだけで機能拡張が可能

具体例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 新しいコマンドを追加しても、既存コードは変更不要
package Command::Delete {
    use Moo;
    with 'Command::Role';
    
    has repository => (is => 'ro', required => 1);
    has task_id    => (is => 'ro', required => 1);

    sub execute ($self) {
        $self->repository->remove($self->task_id);
        say "タスクを削除しました";
    }

    sub description ($self) { 'タスクを削除する' }
}

# Invokerへの登録のみ追加(既存コマンドは影響なし)

根拠:

  • 新規コマンド追加時に既存のCommand::Add等を修正する必要がない
  • Invokerのディスパッチテーブルへの追加のみで対応

信頼度: 10/10


3.3 依存性逆転の原則(DIP)との関連

要点:

  • Commandパターンでは、高レベルモジュール(Invoker)が低レベルモジュール(ConcreteCommand)に直接依存しない
  • 両者とも抽象(Command Role)に依存する
  • これにより、コマンドの実装を容易に切り替え可能

具体例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 抽象(Command Role)に依存
has command => (
    is   => 'ro',
    isa => sub { # 具体的なクラスではなく、Roleに依存
        my $value = shift;
        die "exporter must does Command::Role" unless $value->does('Command::Role')
    },
);

# テスト時にモックコマンドを注入可能
my $mock_command = MockCommand->new;
$invoker->command($mock_command);

根拠:

  • Invokerは具体的なコマンドクラスを知る必要がない
  • テスト時にモックを注入しやすい設計

信頼度: 10/10


4. Commandパターンの適用例

4.1 CLIツール(サブコマンド)

要点:

CLIツールでのCommandパターンは、各サブコマンド(add, list, complete等)を独立したコマンドオブジェクトとして実装することで効果を発揮する。

一般的な構造:

  1. コマンドライン引数を解析
  2. 対応するConcreteCommandオブジェクトを生成
  3. Invokerがexecute()を呼び出し

典型的なCLIツールのサブコマンド構造:

1
2
3
4
5
todo add "タスク名"     -> Command::Add->execute()
todo list              -> Command::List->execute()
todo complete 1        -> Command::Complete->execute()
todo delete 1          -> Command::Delete->execute()
todo help              -> ヘルプ表示

出典:

信頼度: 10/10


4.2 Undo/Redo機能

要点:

Commandパターンの代表的な応用がUndo/Redo機能。各コマンドにundoメソッドを追加し、実行履歴を管理することで実現する。

Command履歴管理の実装例:

 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
26
27
package CommandHistory {
    use Moo;
    use v5.36;

    has undo_stack => (is => 'rw', default => sub { [] });
    has redo_stack => (is => 'rw', default => sub { [] });

    sub execute_command ($self, $command) {
        $command->execute;
        push @{$self->undo_stack}, $command;
        $self->redo_stack([]);  # 新しい操作でredoスタックをクリア
    }

    sub undo ($self) {
        return unless @{$self->undo_stack};
        my $command = pop @{$self->undo_stack};
        $command->undo;
        push @{$self->redo_stack}, $command;
    }

    sub redo ($self) {
        return unless @{$self->redo_stack};
        my $command = pop @{$self->redo_stack};
        $command->execute;
        push @{$self->undo_stack}, $command;
    }
}

Undo対応のConcreteCommand例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package Command::InsertText {
    use Moo;
    use v5.36;
    with 'Command::Role';

    has editor   => (is => 'ro', required => 1);
    has text     => (is => 'ro', required => 1);
    has position => (is => 'ro', required => 1);

    sub execute ($self) {
        $self->editor->insert($self->text, $self->position);
    }

    sub undo ($self) {
        $self->editor->delete($self->position, length($self->text));
    }

    sub description ($self) { 'テキストを挿入する' }
}

出典:

信頼度: 10/10


4.3 マクロ記録

要点:

複数のコマンドをリストとして保存し、一括で実行することでマクロ機能を実現。

マクロ実装例:

 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
26
27
28
package Macro {
    use Moo;
    use v5.36;
    with 'Command::Role';

    has commands => (is => 'rw', default => sub { [] });

    sub add_command ($self, $command) {
        push @{$self->commands}, $command;
    }

    sub execute ($self) {
        $_->execute for @{$self->commands};
    }

    sub undo ($self) {
        # 逆順でundo
        $_->undo for reverse @{$self->commands};
    }

    sub description ($self) { 'マクロを実行する' }
}

# 使用例
my $macro = Macro->new;
$macro->add_command(Command::InsertText->new(...));
$macro->add_command(Command::InsertText->new(...));
$macro->execute;  # 複数のコマンドを一括実行

信頼度: 8/10


4.4 ジョブキュー・タスクスケジューリング

要点:

コマンドをキューに入れて、後で非同期に実行する仕組み。

ジョブキュー実装例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package JobQueue {
    use Moo;
    use v5.36;

    has queue => (is => 'rw', default => sub { [] });

    sub enqueue ($self, $command) {
        push @{$self->queue}, $command;
    }

    sub process ($self) {
        while (my $command = shift @{$self->queue}) {
            eval {
                $command->execute;
            };
            if ($@) {
                warn "コマンド実行エラー: $@";
            }
        }
    }
}

信頼度: 8/10


5. 既存のシリーズとの差別化

5.1 既存シリーズで扱われているテーマ

シリーズ名主要テーマ主なデザインパターン
Mooで覚えるオブジェクト指向プログラミング(全12回)OOP基礎(has、extends、Moo::Role、handles、isa)-
Mooを使ってディスパッチャーを作ってみよう(全12回)ディスパッチャー、StrategyパターンStrategy
シンプルなTodo CLIアプリCommand/Repositoryパターン、CLI実装Command, Repository
パスワード生成・管理ツール暗号化、CLI、Factory/CommandパターンFactory, Command

5.2 Commandパターンシリーズの差別化ポイント

既存シリーズとの違い:

差別化ポイント本シリーズの特徴
フォーカスCommandパターンに特化した深い解説
Undo/Redoテキストエディタの履歴機能を題材にUndo/Redoを本格実装
SOLID原則各原則との関連を明示的に解説
Strategyとの比較既存ディスパッチャーシリーズとの橋渡し
応用範囲CLI以外の応用(Undo/Redo、マクロ、ジョブキュー)

6. CommandパターンとStrategyパターンの違い

6.1 比較表

項目CommandパターンStrategyパターン
目的操作(何をするか)をオブジェクト化アルゴリズム(どう処理するか)を差し替え可能に
主体Invokerがコマンドを実行Contextがストラテジーを選んで実行
履歴管理実行履歴を残せる・Undo/Redo可能履歴は不要(処理方式の切替のみ)
使い所Undo/Redo、履歴保存、ジョブキュー、CLIアルゴリズム切替、支払い方法、ソート
典型例リモコンの操作履歴、エディタのUndo支払い方式や並び替え方法の切替

6.2 選択指針

  • 「何をするか」を管理・記録したい → Command
  • 「どう処理するか」を切り替えたい → Strategy
  • Undo/Redo、履歴が必要 → Command
  • アルゴリズムの動的切替 → Strategy

まとめ:

Command = 「何をするか」を管理・記録するパターン
Strategy = 「どう処理するか」を切り替えるパターン

出典:

信頼度: 10/10


7. 競合記事の分析

7.1 日本語のPerl + デザインパターン記事

記事タイトルURL特徴差別化ポイント
Commandパターン(ソフトウェア開発日記)https://lightgauge.net/journal/object-oriented/command-pattern一般的な解説、Java中心Perl/Moo特化で差別化
Commandパターン(tamotech.blog)https://tamotech.blog/2024/09/25/command/Javaでのサンプル詳細v5.36対応のPerlで差別化
デザインパターン(Qiita)各種多言語での実装例「Perl入学式卒業程度」向けの丁寧さ

7.2 Commandパターンの入門記事

記事タイトルURL特徴差別化ポイント
Refactoring Guruhttps://refactoring.guru/design-patterns/command図解豊富、多言語対応日本語で段階的な解説
Wikipedia日本語https://ja.wikipedia.org/wiki/Command_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3正式な定義実践的なCLI実装例
ITDichttps://itdic.com/designpattern/gof/command/GoF準拠の解説前シリーズとの連携

7.3 本シリーズの強み

  1. 前シリーズとの継続性: 「Mooで覚えるオブジェクト指向プログラミング」で学んだ知識を活用
  2. Perl/Moo特化: v5.36対応のモダンPerl記法
  3. SOLID原則との連携: 設計原則を意識した解説
  4. Strategyパターンとの比較: ディスパッチャーシリーズとの橋渡し
  5. 実践的な応用例: CLIだけでなくUndo/Redo、マクロも扱う

8. 内部リンク候補の調査

8.1 「Mooで覚えるオブジェクト指向プログラミング」シリーズ(全12回)

本シリーズ記事の前提知識となる既存記事。

タイトル内部リンクCommandパターンとの関連
第1回Mooで覚えるオブジェクト指向プログラミング/2021/10/31/191008/OOPの基礎
第2回データとロジックをまとめよう/2025/12/30/163810/hassub
第3回同じものを何度も作れるように/2025/12/30/163811/new(コンストラクタ)
第4回勝手に書き換えられないようにする/2025/12/30/163812/is => 'ro'is => 'rw'
第5回初期化忘れを防ぐ/2025/12/30/163813/requireddefault
第6回内部実装を外から触らせない/2025/12/30/163814/カプセル化
第7回関連するデータを別のクラスに/2025/12/30/163815/オブジェクトの関連(Commandが依存を持つ)
第8回似ているクラスの重複をなくす/2025/12/30/163816/extends(継承)
第9回同じ名前で違う動作を/2025/12/30/163817/オーバーライド
第10回継承しないで振る舞いを共有/2025/12/30/163818/Moo::Rolewith(Command Roleの基礎)
第11回「持っている」ものに仕事を任せる/2025/12/30/163819/handles(委譲)
第12回型チェックでバグを未然に防ぐ/2025/12/30/163820/isa(型制約)

特に重要な関連:

  • 第10回(Moo::Role): Command RoleをMoo::Roleで定義する際に必須の知識
  • 第7回(オブジェクトの関連): CommandクラスがRepositoryを持つ関係
  • 第4回・第5回(ro/rw、required): Commandクラスの属性定義

8.2 「Mooを使ってディスパッチャーを作ってみよう」シリーズ

関連するデザインパターン(Strategyパターン)を扱うシリーズ。

タイトル内部リンク関連度
第12回これがデザインパターンだ!/2026/01/03/001541/(Strategyパターン解説、Commandとの比較に最適)
第5回共通の約束を決めよう/2026/01/03/001534/高(Roleによるインターフェース)

8.3 デザインパターン・SOLID原則関連

ファイルパス内部リンク内容関連度
/content/warehouse/design-patterns-research.mdwarehouseGoF 23パターン概要調査
/content/warehouse/solid-principles.mdwarehouseSOLID原則詳細調査

8.4 Todo CLI / パスワードツール関連

ファイルパス内容関連度
/content/warehouse/todo-cli-app-research.mdTodo CLIアプリ調査(Commandパターン含む)最高
/content/warehouse/password-tool-series.mdパスワードツール調査(Commandパターン含む)
/content/warehouse/moo-dispatcher-series-research.mdディスパッチャーシリーズ調査(Strategyパターン)

9. 参考文献・リソースリスト

9.1 必読リソース

書籍

書籍名著者ISBN/ASIN重要度
Design Patterns: Elements of Reusable Object-Oriented SoftwareGoF978-0201633610必須
Head First Design Patterns (2nd Edition)Eric Freeman, Elisabeth Robson978-1492078005推奨
Design Patterns in Modern PerlMohammad Sajid AnwarLeanpub推奨(Perl特化)

Webリソース

リソース名URL特徴信頼度
Refactoring Guru - Commandhttps://refactoring.guru/design-patterns/command視覚的な図解、多言語コード例10/10
Refactoring Guru - Command(日本語)https://refactoring.guru/ja/design-patterns/command日本語訳版10/10
Wikipedia - Command パターン(日本語)https://ja.wikipedia.org/wiki/Command_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3正式な定義10/10
GeeksforGeeks - Command Patternhttps://www.geeksforgeeks.org/system-design/command-pattern/網羅的な解説8/10
MetaCPAN - Moohttps://metacpan.org/pod/MooPerl Moo公式10/10
MetaCPAN - Moo::Rolehttps://metacpan.org/pod/Moo::RolePerl Moo::Role公式10/10
Perl School - Design Patternshttps://perlschool.com/books/design-patterns/PerlでのGoFパターン実装8/10

10. 調査結果のサマリー

10.1 主要な発見

  1. Commandパターンの適用性: CLIツールの各サブコマンドをCommandオブジェクトとして実装することで、拡張性と保守性が向上する。「Mooで覚えるオブジェクト指向プログラミング」第10回で学んだMoo::Roleを使ってインターフェースを定義できる

  2. SOLID原則との親和性: Commandパターンは、SRP(各コマンドが1つの責任)、OCP(新しいコマンド追加が容易)、DIP(抽象に依存)を自然に満たす

  3. Strategyパターンとの違い: 「何をするか」を管理するCommand vs 「どう処理するか」を切り替えるStrategy。既存のディスパッチャーシリーズとの対比で理解を深められる

  4. Undo/Redoの実装: Commandパターンの真価はUndo/Redo機能にある。テキストエディタやグラフィックツールでの応用が効果的

  5. 前提知識との連携: 「Mooで覚えるオブジェクト指向プログラミング」シリーズで学んだ概念(Moo::Role、has、required、isaなど)を実践的に活用できる


調査完了日: 2026年1月7日
調査者: 調査・情報収集エージェント

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。