wetchのブログ

他人に見られることを想定していない書き散らかし独習ノート.物理学とかVBAとか.

相互依存する6変数のクラス

Air Calc というアプリから発想してある計算プログラムを考え中.

6変数のうち自由度が2,つまり6つのうち2つを指定したら残りの4つは計算できるというものを考えて,その6つをまとめて扱うクラスモジュールを作りたい.
どの2変数が入力されてもいいから,入力変数の組は 6*5/2 = 15通り,それぞれについて残り4つを計算する関数があるだから,トータル 6*5*4/2 = 60個の関数を作る必要がある.これでは多いので,

  • 15個のクラスを作って整理する.この場合変数の数が6個から増えたときに全クラスが変更を受けてしまう.

または

  • 出力変数となりうる6変数別に6個のクラスを作る.

ストラテジーパターンで考えてみる.

まずユーザが任意の2変数の値と,出力したいのがどの1変数かを入力する.
次にクラスAがその入力を受け取って,15個のストラテジークラスB1~B15のどれを使うかを決定する.決定したクラスをBiと書こう.
Biは入力2変数と残りの4変数をクラス内変数として持っていて,出力したい1変数を計算して自身に保存しておく.

ここで2つの選択肢がある:

  • クラスBiに入力2変数が渡された時点で残り4変数を全て計算してしまう.これをすると使わない変数を計算する可能性があるので重くなる.
  • 4変数のうち,出力として要請された変数のみを計算する.この場合,計算の途中結果として要請されてない変数を計算する場合があるので,その途中結果が後々要請されたときに同じ計算をしなければならなくなる.

したがって次のようにする:
要請された出力変数を計算している途中で,要請されてない変数を計算する必要があるのならそれも保存しておく.