ちょっとした「アーキテクチャ」の PoC、というか導入サンプルのため、モデルを書いた。
「サンプル」プロジェクトのモデルを何にするか、というのは、一つの考え事となる事項ではあるが、あくまで「サンプル」のテーマであるから、最小、かつ(サンプル内での)拡張性を示すため、デジタル回路のNANDゲートを書いてみた。
本質的には関数完全性を持つ最小情報量単位の「モデル」ではないかと考えたからだ。
イメージとしては、一応、「デジタル回路」の話なので、bool
ではなく、それらしい定義をして、
/// <summary>
/// 入出力端子の状態
/// </summary>
public enum TerminalState
{
LOW = 0, // LOW
HIGH = 1, // HIGH
HIGH_Z = 2, // HIGH Impedance
UNDEFINED = 3 // 未定義
}
後はインタフェイスやeventなどを実装し、演算自体のロジックも書いた。
/// <summary>
/// 入力が変わったら出力を更新するイベントハンドラ
/// </summary>
private void InputsStateChangedHandler(object? sender, EventArgs arg)
{
OutputsInternal[0].State
= (
InputsInternal[0].State == TerminalState.HIGH
&& InputsInternal[1].State == TerminalState.HIGH
) ? TerminalState.LOW : TerminalState.HIGH;
}
「アーキテクチャ」のサンプルだから、単体テストも書くか、でも GPT君に書いてもらおう、ということで、上記のロジックも見せつつ書いてもらい、テスト実行。
むむむ…。出力が 3 (TerminalState.UNDEFINED
) になるようなロジックは今のところ書いていないが…。
GPT君が記述した単体テストを見てみる。
// NANDロジックに合わせる
if (input1 == TerminalState.HIGH && input2 == TerminalState.HIGH)
{
return TerminalState.LOW;
}
else if (input1 == TerminalState.HIGH_Z || input2 == TerminalState.HIGH_Z)
{
return TerminalState.UNDEFINED; // High-Zは未定義扱い
}
else if (input1 == TerminalState.UNDEFINED || input2 == TerminalState.UNDEFINED)
{
return TerminalState.UNDEFINED; // UNDEFINEDは未定義扱い
}
else
{
return TerminalState.HIGH; // それ以外はNAND=HIGH
}
うっ…、「テストケース書いて」と言っただけなはずなのに、「俺より厳密でちゃんとした演算ロジック」 書いてきてやがるっっっっ…。
いつのまにかTDDに…(笑)
おしまい