PowerShellでWinForms画面作る時のソースの見づらさをyamlないか(タイトルイミフ)

単純に、こういうのがあるといいかも~って思ったっていう戯言でポエムなだけです。

PowerShellGUI アプリを作る方のソースを見ていて、この方のせいではなく PowerShell の階層的ではない仕様に「うっ・・・」ってなりました(´・ω・`)。WinForms の時はこれが当たり前というか特になんとも思わなかったんですが、WPF, UWP, HTML, CSS, ・・・と見慣れた今見ると、「あれ?見づらくないか?」って。こういうの。

# フォーム画面
$form = New-Object System.Windows.Forms.Form
$form.xxx = xxx
$form.xxx = xxx
$form.xxx = xxx
$form.xxx = xxx
$form.xxx = xxx
$form.xxx = xxx
$form.xxx = xxx

# ボタン1
$button1 = New-Object System.Windows.Forms.Button
$button1.xxx = xxx
$button1.xxx = xxx
$button1.xxx = xxx
$button1.xxx = xxx
$button1.xxx = xxx
$button1.xxx = xxx

...

$form.Controls.Add($button1)
$form.Controls.Add($xxx)
$form.Controls.Add($xxx)
$form.Controls.Add($xxx)

...

せめて最終的には上記のソースでいいから、開発中は楽できないものか?と考えた際、yaml 形式ならどうかと思いました。こういうの。

# ボタンのテンプレートです
_: &button1
  Button:
    Point: (0, 0)
    Size: (120, 30)
    Text: "button1"

# メイン画面です
Form:
  Name: "form1"
  Text: "テストフォームのタイトル"
  Size: (480, 360)
  Controls:

    # ボタン1
    - *button1
    
    # ボタン2
    - Button:
        Point: (100, 100)
        Size: (120, 30)
        Text: "開始"

    # ボタン3
    - Button:
        Point: (300, 100)
        Size: (120, 30)
        Text: "閉じる"

json 形式だとこういうの。

{
  "_": {
    "Button": {
      "Point": "(0, 0)",
      "Size": "(120, 30)",
      "Text": "button1"
    }
  },
  "Form": {
    "Name": "form1",
    "Text": "テストフォームのタイトル",
    "Size": "(480, 360)",
    "Controls": [
      {
        "Button": {
          "Point": "(0, 0)",
          "Size": "(120, 30)",
          "Text": "button1"
        }
      },
      {
        "Button": {
          "Point": "(100, 100)",
          "Size": "(120, 30)",
          "Text": "開始"
        }
      },
      {
        "Button": {
          "Point": "(300, 100)",
          "Size": "(120, 30)",
          "Text": "閉じる"
        }
      }
    ]
  }
}

宣言がイコールでインスタンス生成される系です。WPF系みたいなの。階層構造だから関係性もわかるし、変数名.みたいなのを書きまくる必要が無い=余計な文字が無い=見やすい=メンテナンスしやすい=バグ取りしやすい=保守が簡単=仕様変更に強い、にならないかなと。

てか、ずっと見てたら見づらいって思わなくなってきたorz。いや、でも階層的な方が分かりやすいよね?

(追記)

こっちの方がいいかな。

# 別解、ハッシュ型データを Form に型変換する書き方。オブジェクト初期化子的に扱う。
Add-Type -AssemblyName system.windows.forms


# フォーム画面
$form1 = [System.Windows.Forms.Form]@{
    Width = 800;
    Height = 600;
    Text = "WinFormsApplication1";
}

# ボタン1
$button1 = [System.Windows.Forms.Button]@{
    Text = "button1";
}

$form1.Controls.Add($button1)
$form1.ShowDialog()