クラス図

@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

@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

@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

@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
シーケンス図

@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

@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