<前書き>
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>
(素人なので間違っているかもしれません。汗。)
ここ最近、クラス、オブジェクト指向をやってきて、思ったこととしたことの?備忘録(未確認・未確定メモ)です。
(素人なので間違っているかも。汗)
今回は、「テンプレート」です。
でも、正しい使い方かは分かりません。汗。
<前知識>
前回同様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個実行する感じ。
テンプレートは、まとめて実行する感じ。
違うかな。汗。汗。