クラス図

image.png

@startuml ClassDiagram.png

package "PowerShell Modules" {
  class CreateClassInstanceHelper <<module>> {
    + {static} New-UnboundClassInstance(type: Type, arguments: object[])
    - {static} Initialize()
    - $Script:powershell
    - $Script:body
    .. 説明 ..
    PowerShellクラスのインスタンスを
    ランスペースに束縛せずに生成
  }

  class WPFClassHelpers <<module>> {
    + New-WPFObject(xaml: string[], path: string[], baseUri: string)
    + class ThreadManager
    .. 説明 ..
    WPFオブジェクトの生成と
    非同期処理の管理を支援
  }
}

package "MVVM Components" {
  class ViewModelBase {
    + PropertyChanged: Event
    + RaisePropertyChanged(propertyName: string)
    .. 説明 ..
    ViewModelの基底クラス
    プロパティ変更通知機能を提供
  }

  class MyViewModel {
    + SharedResource: int
    + Jobs: ObservableCollection
    + CalculationService: CalculationService
    - SharedResourceLock: object
    - JobsLock: object
    .. 説明 ..
    アプリケーションのメインViewModel
    UIとデータの橋渡しを担当
  }

  class ThreadManager {
    + Dispose()
    + Async(scriptblock: ScriptBlock)
    - RunspacePool: RunspacePool
    .. 説明 ..
    非同期処理とスレッド管理を担当
  }
}

package "Entry Point" {
  class SampleGUI <<script>> {
    + main()
    .. 説明 ..
    アプリケーションのエントリーポイント
    GUIの初期化と表示を行う
  }
}

' 関係性の定義
MyViewModel --|> ViewModelBase : 継承
SampleGUI ..> CreateClassInstanceHelper : 使用
SampleGUI ..> WPFClassHelpers : 使用
SampleGUI ..> MyViewModel : インスタンス化
MyViewModel ..> ThreadManager : 使用
WPFClassHelpers +-- ThreadManager : 内部クラス

@enduml

2

image.png

@startuml ClassDiagram.png

package "CreateClassInstanceHelper.psm1" {
  class CreateClassInstanceHelper <<module>> {
    + {static} New-UnboundClassInstance(type: Type, arguments: object[])
    - {static} Initialize()
    - $Script:powershell
    - $Script:body
    .. 説明 ..
    PowerShellクラスのインスタンスを
    ランスペースに束縛せずに生成
  }
}

package "WPFClassHelpers.psm1" {
  class WPFClassHelpers <<module>> {
    + New-WPFObject(xaml: string[], path: string[], baseUri: string)
    .. 説明 ..
    WPFオブジェクトの生成を支援
  }

  class ThreadManager {
    + Dispose()
    + Async(scriptblock: ScriptBlock)
    - RunspacePool: RunspacePool
    .. 説明 ..
    非同期処理とスレッド管理を担当
  }
}

package "ViewModel.ps1" {
  class ViewModelBase {
    + PropertyChanged: Event
    + RaisePropertyChanged(propertyName: string)
    .. 説明 ..
    ViewModelの基底クラス
    プロパティ変更通知機能を提供
  }

  class MyViewModel {
    + SharedResource: int
    + Jobs: ObservableCollection
    + CalculationService: CalculationService
    - SharedResourceLock: object
    - JobsLock: object
    .. 説明 ..
    アプリケーションのメインViewModel
    UIとデータの橋渡しを担当
  }
}

package "Views/" {
  class PartialWindow {
    + WindowChrome
    + Template
    + MainGrid
    .. 説明 ..
    カスタマイズされたウィンドウ
    タイトルバーとコンテンツ領域を定義
  }
}

package "SampleGUI.ps1" {
  class SampleGUI <<script>> {
    + main()
    .. 説明 ..
    アプリケーションのエントリーポイント
    GUIの初期化と表示を行う
  }
}

' 関係性の定義
MyViewModel --|> ViewModelBase : 継承
SampleGUI ..> CreateClassInstanceHelper : 使用
SampleGUI ..> WPFClassHelpers : 使用
SampleGUI ..> MyViewModel : インスタンス化
MyViewModel ..> ThreadManager : 使用
WPFClassHelpers +-- ThreadManager : 内部クラス
PartialWindow ..> MyViewModel : DataContext

@enduml

3

image.png

@startuml ClassDiagram.png

package "CreateClassInstanceHelper.psm1" {
  class CreateClassInstanceHelper <<module>> {
    + {static} New-UnboundClassInstance(type: Type, arguments: object[])
    - {static} Initialize()
    - $Script:powershell
    - $Script:body
    .. 説明 ..
    PowerShellクラスのインスタンスを
    ランスペースに束縛せずに生成
  }
}

package "WPFClassHelpers.psm1" {
  class WPFClassHelpers <<module>> {
    + New-WPFObject(xaml: string[], path: string[], baseUri: string)
    + ValidateXamlPath(path: string)
    + ProcessXamlContent(content: string)
    + CreateXamlReader()
    + LoadBamlFromStream(stream: Stream)
    .. 説明 ..
    WPFオブジェクトの生成と
    XAMLの読み込み・解析を支援
  }

  class ThreadManager {
    + Dispose()
    + Async(methodToRunAsync: ScriptBlock, callback: ScriptBlock)
    + CreateDelegate(method: PSMethod, target: object): Delegate
    - RunspacePool: RunspacePool
    - DisposeTaskDelegate: Delegate
    - EndInvokeDelegate: Delegate
    - SharedPoolVars: object
    + DisposeTask(task: Task, powershell: object)
    .. 説明 ..
    非同期処理とスレッド管理を担当
    PowerShellランスペースの制御
  }

  class XamlReaderHelper {
    + {static} CreateReader(): XamlReader
    + {static} SetBaseUri(reader: XamlReader, baseUri: string)
    + {static} LoadBaml(stream: Stream): object
    .. 説明 ..
    XAMLの読み込みと解析を
    サポートするヘルパークラス
  }
}

package "ViewModel.ps1" {
  class ViewModelBase {
    + PropertyChanged: Event
    + RaisePropertyChanged(propertyName: string)
    .. 説明 ..
    ViewModelの基底クラス
    プロパティ変更通知機能を提供
  }

  class MyViewModel {
    + SharedResource: int
    + Jobs: ObservableCollection
    + CalculationService: CalculationService
    - SharedResourceLock: object
    - JobsLock: object
    .. 説明 ..
    アプリケーションのメインViewModel
    UIとデータの橋渡しを担当
  }
}

package "Views/" {
  class PartialWindow {
    + WindowChrome
    + Template
    + MainGrid
    .. 説明 ..
    カスタマイズされたウィンドウ
    タイトルバーとコンテンツ領域を定義
  }
}

package "SampleGUI.ps1" {
  class SampleGUI <<script>> {
    + main()
    .. 説明 ..
    アプリケーションのエントリーポイント
    GUIの初期化と表示を行う
  }
}

' 関係性の定義
MyViewModel --|> ViewModelBase : 継承
SampleGUI ..> CreateClassInstanceHelper : 使用
SampleGUI ..> WPFClassHelpers : 使用
SampleGUI ..> MyViewModel : インスタンス化
MyViewModel ..> ThreadManager : 使用
WPFClassHelpers +-- ThreadManager : 内部クラス
WPFClassHelpers +-- XamlReaderHelper : 内部クラス
PartialWindow ..> MyViewModel : DataContext
WPFClassHelpers ..> XamlReaderHelper : 使用

@enduml

4

image.png

@startuml ClassDiagram.png

package "CreateClassInstanceHelper.psm1" {
  class CreateClassInstanceHelper <<module>> {
    + {static} New-UnboundClassInstance(type: Type, arguments: object[])
    - {static} Initialize()
    - $Script:powershell
    - $Script:body
    .. 説明 ..
    PowerShellクラスのインスタンスを
    ランスペースに束縛せずに生成
  }
}

package "WPFClassHelpers.psm1" {
  class WPFClassHelpers <<module>> {
    + New-WPFObject(xaml: string[], path: string[], baseUri: string)
    + ConvertTo-Delegate(PSMethod: PSMethod[], Target: object, IsPSObject: switch)
    .. 説明 ..
    WPFオブジェクトの生成と
    XAMLの読み込み・解析を支援
  }

  class ThreadManager {
    + Dispose()
    + Async(scriptblock: ScriptBlock): object
    + Async(MethodToRunAsync: Delegate): object
    + Async(MethodToRunAsync: Delegate, Callback: Delegate): object
    + CreateDelegate(Method: PSMethod): Delegate
    + CreateDelegate(Method: PSMethod, Target: object): Delegate
    - RunspacePool: RunspacePool
    - DisposeTaskDelegate: Delegate
    - SharedPoolVars: ConcurrentDictionary
    - DisposeTask(Task: Task, Powershell: object)
    - Init(FunctionNames: string[])
    .. 説明 ..
    非同期処理とスレッド管理を担当
    PowerShellランスペースの制御
  }

  class ViewModelBase {
    + PropertyChanged: PropertyChangedEventHandler
    + add_PropertyChanged(handler: PropertyChangedEventHandler)
    + remove_PropertyChanged(handler: PropertyChangedEventHandler)
    + RaisePropertyChanged(propname: string)
    .. 説明 ..
    ViewModelの基底クラス
    プロパティ変更通知機能を提供
  }

  class ActionCommand {
    + InternalCanExecuteChanged: EventHandler
    + add_CanExecuteChanged(value: EventHandler)
    + remove_CanExecuteChanged(value: EventHandler)
    + CanExecute(CommandParameter: object): bool
    + Execute(CommandParameter: object)
    + RaiseCanExecuteChanged()
    - Action: Action
    - ActionObject: Action[object]
    - ThreadManager: ThreadManager
    - Workers: int
    - Throttle: int
    .. 説明 ..
    コマンドパターンの実装
    非同期処理とスロットリングをサポート
  }
}

package "ViewModel.ps1" {
  class MyViewModel {
    + SharedResource: int
    + Jobs: ObservableCollection
    + CalculationService: CalculationService
    - SharedResourceLock: object
    - JobsLock: object
    .. 説明 ..
    アプリケーションのメインViewModel
    UIとデータの橋渡しを担当
  }
}

package "Views/" {
  class PartialWindow {
    + WindowChrome
    + Template
    + MainGrid
    .. 説明 ..
    カスタマイズされたウィンドウ
    タイトルバーとコンテンツ領域を定義
  }
}

package "SampleGUI.ps1" {
  class SampleGUI <<script>> {
    + main()
    .. 説明 ..
    アプリケーションのエントリーポイント
    GUIの初期化と表示を行う
  }
}

' 関係性の定義
MyViewModel --|> ViewModelBase : 継承
ActionCommand --|> ViewModelBase : 継承
SampleGUI ..> CreateClassInstanceHelper : 使用
SampleGUI ..> WPFClassHelpers : 使用
SampleGUI ..> MyViewModel : インスタンス化
MyViewModel ..> ThreadManager : 使用
WPFClassHelpers +-- ThreadManager : 内部クラス
WPFClassHelpers +-- ViewModelBase : 内部クラス
WPFClassHelpers +-- ActionCommand : 内部クラス
PartialWindow ..> MyViewModel : DataContext

@enduml

シーケンス図

image.png

@startuml
skinparam DefaultFontName "MS Gothic"
skinparam SequenceMessageAlignment center
skinparam BoxPadding 10
skinparam NoteBackgroundColor #E6FFE6
skinparam NoteBorderColor #006400

box "メインスクリプト" #LightBlue
participant "SampleGUI.ps1\\n(アプリケーションの開始点)" as Main
end box

box "ViewModel.ps1" #LightGreen
participant "MyViewModel : ViewModelBase\\n(UIとデータを橋渡しする中心的なクラス)" as VM
end box

box "WPFClassHelpers.psm1" #LightYellow
participant "ActionCommand\\n(ボタンクリックなどの\\nUIアクションを管理)" as AC
participant "ThreadManager\\n(複数のスレッドを\\n効率的に管理)" as TM
end box

box "Windows" #LightGray
participant "WPF UI Thread\\n(ユーザーインターフェースを処理)" as UI
participant "PowerShell Background Thread\\n(重い処理を実行)" as BG
end box

note over Main, BG #E6FFE6
  このアプリケーションは、MVVMパターンを採用し、
  UIの応答性を保ちながら重い処理をバックグラウンドで実行できる設計になっています。
end note

== アプリケーション起動フェーズ ==
Main -> VM : 1. New-UnboundClassInstance ([MyViewModel])
note right
  ViewModelを作成
  複数のスレッドから安全にアクセスできるように初期化
end note
activate VM

VM -> AC : 2. CreateButtons()\\nActionCommandインスタンス作成
note right
  ボタンとそれに関連するコマンドを初期化
end note
activate AC

VM -> TM : 3. ThreadManager::new('Get-Million')
note right
  スレッド管理機能を初期化
  RunspacePoolを作成
end note
activate TM

TM --> VM : 4. RunspacePool初期化完了
VM --> Main : 5. ViewModel初期化完了
Main -> UI : 6. $wpf.ShowDialog()\\nWPFウィンドウ表示

== ボタンクリック時の処理フェーズ ==
note over UI, BG #E6FFE6
  ユーザーがボタンをクリックすると、
  UIをブロックせずにバックグラウンドで処理を実行します
end note

UI -> AC : 7. ActionCommand.Execute()
note right
  ボタンクリックイベントをコマンドとして処理
end note

AC -> AC : 8. CanExecute()\\nスロットル制限確認
note right
  同時実行数が制限を超えていないか確認
end note

AC -> TM : 9. ThreadManager.Async()
TM -> BG : 10. PowerShell::Create()\\nスクリプトブロック実行
note right
  新しいPowerShellインスタンスを
  作成して処理を実行
end note
activate BG

BG -> VM : 11. MyViewModel.AddTenSlowly()\\nor ExternalMethod()
note right
  バックグラウンドで
  時間のかかる処理を実行
end note

VM -> VM : 12. SharedResource更新
VM -> UI : 13. RaisePropertyChanged('SharedResource')
note right
  データの変更をUIに通知
end note

UI -> UI : 14. バインディングによるUI更新
note right
  画面の表示を自動的に更新
end note

BG --> TM : 15. Task完了
deactivate BG
TM -> AC : 16. ContinueWith完了通知
AC -> AC : 17. Workers数更新
AC -> UI : 18. RaiseCanExecuteChanged()
UI -> UI : 19. コマンドバインディング更新

== 終了処理フェーズ ==
note over UI, TM #E6FFE6
  アプリケーション終了時に使用したリソースを適切に解放します
end note

UI -> TM : 20. ThreadManager.Dispose()
TM -> TM : 21. RunspacePool.Dispose()
note right
  使用したリソースを解放
  メモリリークを防止
end note
deactivate TM
deactivate AC
deactivate VM

@enduml

2

image.png

@startuml
skinparam DefaultFontName "MS Gothic"
skinparam SequenceMessageAlignment center
skinparam BoxPadding 10
skinparam NoteBackgroundColor #E6FFE6
skinparam NoteBorderColor #006400

' ファイルとクラスの階層構造を表現
box "メインスクリプト (SampleGUI.ps1)" #LightBlue
    participant "SampleGUI.ps1\\n[スクリプト]\\n--\\n役割:アプリケーションのエントリーポイント\\n--\\n主な処理:\\n・ViewModelの作成\\n・WPFウィンドウの表示\\n・スレッド管理の初期化" as Main
end box

box "ViewModel層 (ViewModel.ps1)" #LightGreen
    participant "MyViewModel : ViewModelBase\\n[クラス]\\n--\\n役割:UIとデータの橋渡し\\n--\\n主なプロパティ:\\n・SharedResource\\n・Jobs\\n--\\n主なメソッド:\\n・AddTenSlowly()\\n・ExternalMethod()\\n・CreateButtons()" as VM
end box

box "WPFヘルパー層 (WPFClassHelpers.psm1)" #LightYellow
    participant "ActionCommand\\n[クラス]\\n--\\n役割:UIアクション管理\\n--\\n主なプロパティ:\\n・Throttle(同時実行制限)\\n・Workers(実行中の処理数)\\n--\\n主なメソッド:\\n・Execute()\\n・CanExecute()" as AC
    
    participant "ThreadManager\\n[クラス]\\n--\\n役割:スレッド管理\\n--\\n主なプロパティ:\\n・RunspacePool\\n・SharedPoolVars\\n--\\n主なメソッド:\\n・Async()\\n・Dispose()" as TM
end box

box "Windows システム" #LightGray
    participant "WPF UI Thread\\n[システムスレッド]\\n--\\n役割:\\n・UIの描画\\n・ユーザー入力の処理\\n・プロパティ変更通知の処理" as UI
    
    participant "PowerShell Background Thread\\n[システムスレッド]\\n--\\n役割:\\n・重い処理の実行\\n・非同期処理の実行\\n・データ更新処理" as BG
end box

note over Main, BG #E6FFE6
  MVVMアーキテクチャの実装
  --
  ・Model: データとビジネスロジック
  ・View: UIの表示(XAML)
  ・ViewModel: ViewとModelの橋渡し
  --
  特徴:
  ・UIの応答性を維持
  ・スレッドセーフな設計
  ・効率的なリソース管理
end note

== アプリケーション起動フェーズ ==
Main -> VM : 1. New-UnboundClassInstance ([MyViewModel])
note right
  ViewModelを作成
  複数のスレッドから安全にアクセスできるように初期化
  --
  処理内容:
  ・新しいランスペースの作成
  ・ViewModelインスタンスの初期化
  ・プロパティの設定
end note
activate VM

VM -> AC : 2. CreateButtons()\\nActionCommandインスタンス作成
note right
  ボタンとそれに関連するコマンドを初期化
end note
activate AC

VM -> TM : 3. ThreadManager::new('Get-Million')
note right
  スレッド管理機能を初期化
  RunspacePoolを作成
end note
activate TM

TM --> VM : 4. RunspacePool初期化完了
VM --> Main : 5. ViewModel初期化完了
Main -> UI : 6. $wpf.ShowDialog()\\nWPFウィンドウ表示

== ボタンクリック時の処理フェーズ ==
note over UI, BG #E6FFE6
  ユーザーがボタンをクリックすると、
  UIをブロックせずにバックグラウンドで処理を実行します
end note

UI -> AC : 7. ActionCommand.Execute()
note right
  ボタンクリックイベントをコマンドとして処理
end note

AC -> AC : 8. CanExecute()\\nスロットル制限確認
note right
  同時実行数が制限を超えていないか確認
end note

AC -> TM : 9. ThreadManager.Async()
TM -> BG : 10. PowerShell::Create()\\nスクリプトブロック実行
note right
  新しいPowerShellインスタンスを
  作成して処理を実行
end note
activate BG

BG -> VM : 11. MyViewModel.AddTenSlowly()\\nor ExternalMethod()
note right
  バックグラウンドで
  時間のかかる処理を実行
end note

VM -> VM : 12. SharedResource更新
VM -> UI : 13. RaisePropertyChanged('SharedResource')
note right
  データの変更をUIに通知
end note

UI -> UI : 14. バインディングによるUI更新
note right
  画面の表示を自動的に更新
end note

BG --> TM : 15. Task完了
deactivate BG
TM -> AC : 16. ContinueWith完了通知
AC -> AC : 17. Workers数更新
AC -> UI : 18. RaiseCanExecuteChanged()
UI -> UI : 19. コマンドバインディング更新

== 終了処理フェーズ ==
note over UI, TM #E6FFE6
  アプリケーション終了時に使用したリソースを適切に解放します
end note

UI -> TM : 20. ThreadManager.Dispose()
TM -> TM : 21. RunspacePool.Dispose()
note right
  使用したリソースを解放
  メモリリークを防止
end note
deactivate TM
deactivate AC
deactivate VM

@enduml

3