エクセルVBA オブジェクト指向備忘録  「「コマンド」と「テンプレート」メソッドは反対の意味」」という意味(例)

 
202401104エクセルVBA オブジェクト指向備忘録  「「コマンド」と「テンプレート」メソッドは反対の意味」」という意味(例)
 
<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>
 
(素人なので間違っているかもしれません。汗。)
 
ここ最近、クラス、オブジェクト指向をやってきて、思ったこととしたことの?備忘録(未確認・未確定メモ)です。
(素人なので間違っているかも。汗)
 
最近、VBAで、OOPオブジェクト指向プログラミング)について、意識しながら、コードを書いているのですが、今回も自分用のメモを書きます。
 
 
今回は、「テンプレート」です。
でも、正しい使い方かは分かりません。汗。
 
 
<前知識>
前回同様youtubeで、「独り言のプログラミング講座」というのを見ました。
C#に関するものですが、分かりやすい気がします。(C#自体分かっていない。)
感謝します。
(不都合があれば、削除いたします。)
その動画の中でテンプレートとコマンドメソッドに関して、下記のような説明がありました。
 
 
 「「コマンド」と「テンプレート」メソッドは反対の使い方」
 
 
です。
 
どういうことなのか、例によってchatGPT4o様に聞いてみました。
(不都合があれば、削除いたします。)
 
Template MethodとCommandの違い
Template Method
特徴:処理の流れは親クラスで決まり、具体的な処理内容だけがサブクラスで実装されます。
用途:流れが決まっていて、部分的な処理だけを変更したい場合に使います。
Command
特徴:処理(コマンド)をオブジェクト化して、他のクラスに実行を依頼します。
用途:特定の処理を「いつ」「どこで」実行するかを柔軟に制御したい場合に使います。例えば、操作の「取り消し」や「やり直し」に使われることが多いです。
 
とのこと。
ややこしい。
でも具体例を見れば、「反対」の意味が分かるので載せておきます。VBAではないですが・・・。
 
 
===================================
// Template Methodパターン:基本の手順を親クラスで定義し、操作の内容はサブクラスで実装します。
 
abstract class ComputerOperation
{
    // 基本の操作手順
    public void Operate()
    {
        Start();
        Run();
        Shutdown();
    }
 
    protected abstract void Start();
    protected abstract void Run();
    protected abstract void Shutdown();
}
 
// 起動、実行、シャットダウンの各処理を定義
class OfficeComputer : ComputerOperation
{
    protected override void Start() { Console.WriteLine("Office Computer Starting..."); }
    protected override void Run() { Console.WriteLine("Office Computer Running..."); }
    protected override void Shutdown() { Console.WriteLine("Office Computer Shutting Down..."); }
}
 
// 実行
var officeComputer = new OfficeComputer();
officeComputer.Operate();
 
============================================
ポイント:
 
親クラスComputerOperationで、Operateメソッドが処理の流れ(順番)を定めています。
OfficeComputerクラスでは、Start、Run、Shutdownの中身だけを実装しています。
 
///////////////////////////////////////////////////////////////////////////////////////////////////////
Commandパターンの例
// Commandパターン:各処理をコマンドとして定義し、Invoker(呼び出し元)が実行のタイミングを制御します。
=========================================
// コマンドインターフェース
interface ICommand
{
    void Execute();
}
 
// 各コマンドを定義
class StartCommand : ICommand
{
    public void Execute() { Console.WriteLine("Starting Computer..."); }
}
 
class RunCommand : ICommand
{
    public void Execute() { Console.WriteLine("Running Computer..."); }
}
 
class ShutdownCommand : ICommand
{
    public void Execute() { Console.WriteLine("Shutting Down Computer..."); }
}
 
// Invoker(実行の制御を行うクラス)
class Invoker
{
    private List<ICommand> commands = new List<ICommand>();
 
    public void SetCommand(ICommand command)
    {
        commands.Add(command);
    }
 
    public void ExecuteCommands()
    {
        foreach (var command in commands)
        {
            command.Execute();
        }
        commands.Clear();
    }
}
 
// 実行
Invoker invoker = new Invoker();
invoker.SetCommand(new StartCommand());
invoker.SetCommand(new RunCommand());
invoker.SetCommand(new ShutdownCommand());
invoker.ExecuteCommands();
=====================================
ポイント:
 
各操作をStartCommand、RunCommand、ShutdownCommandとして分け、それぞれICommandインターフェースのExecuteメソッドを通じて実行しています。
Invokerクラスがコマンドを順に実行しますが、Invokerが実行順序を柔軟に管理できるため、コマンドの順序を変更したり、特定のコマンドだけを実行したりできます。
 
 
///////////////////////////////
上記は、動くかわかりません。
VBAで考え直す必要がありますが、結局、「実行」を見れば、分かる気がします。
コマンドは、1個1個実行する感じ。
テンプレートは、まとめて実行する感じ。
 
違うかな。汗。汗。