VB.NETで内製ソフト(←手続き型で作成)の保守・改修をおこなっています。
その中でサードパーティー製のアプリ(=DLL)を利用しています。
ユーザーのパソコンの中にそのアプリのどのバージョンがインストール(←バージョンの違いにより複数インストール可能)されているのか把握し、利用するためにバージョン情報に関するクラスを以下のように設計・作成しました。(メソッドは一部抜粋です)
クラスSampleApp1
呼び出し側Main1
Public Class SampleApp1 Public Property Versions As List(Of Version) 'レジストリ内のアンインストールするプログラムの一覧にSampleApp1が含まれている場合はそのバージョンをListで返す。 ' '※SampleApp1はバージョン違いで複数インストールできるものとする。 ' Public Sub CreateInstalledSampleApp1Versions(ByRef versions As List(Of Version)) Const MUST_INCLUDE_WORD As String = "SampleApp1" versions = New List(Of Version) Dim uninstallPath As String Dim uninstallKey As Microsoft.Win32.RegistryKey Try uninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" uninstallKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstallPath, false) If uninstallKey IsNot Nothing Then Dim appKey As Microsoft.Win32.RegistryKey For Each subKey As String In uninstallKey.GetSubKeyNames() appKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstallPath + "\" + subKey, false) If appKey.GetValue("DisplayName") IsNot Nothing Then If appkey.GetValue("DisplayName").ToString().Contains(MUST_INCLUDE_WORD) Then If appKey.GetValue("DisplayVersion") IsNot Nothing Then versions.Add(New Version(appKey.GetValue("DisplayVersion").ToString())) End If End If End If Next End If Catch ex As Exception '全ての例外をキャッチし、再スローする。 Throw End Try End Sub 'インストールされているSampleApp1のバージョンの中から最新版を取得する。 ' Public Function GetInstalledSampleApp1LatestVersion(ByRef versions As List(Of Version)) As Version GetInstalledSampleApp1LatestVersion = Nothing If versions.Count <= 0 Then Exit Function 'パソコンにSampleApp1がインストールされていない場合 GetInstalledSampleApp1LatestVersion = versions.Item(0) For i As Integer = 1 To versions.Count - 1 If GetInstalledSampleApp1LatestVersion.CompareTo(versions.Item(i)) < 0 Then GetInstalledSampleApp1LatestVersion = versions.Item(i) End If Next End Function End Class --- 呼び出し側 --------------------------------------------------------------------- Module Main1 Public Sub Main1() Dim appInfo As New SampleApp1() Try appInfo.CreateInstalledSampleApp1Versions(appInfo.Versions) Catch ex As Exception Console.WriteLine(ex.Message) End Try Dim latestVersion As Version = appInfo.GetInstalledSampleApp1LatestVersion(appInfo.Versions) End Sub End Module
その後、クラスSampleApp1の
・プロパティーVersions As List(Of Version)
に対して、プロパティーとして存在しなくてもよいのではないかと疑問を持ちました。
クラスが保持する情報ではなくて、呼び出し側でListを宣言・保持すればよいのではないかということです。
そこで、プロパティーを削除して以下のように改修してみました。
クラスSampleApp2
呼び出し側Main2
Public Class SampleApp2 'レジストリ内のアンインストールするプログラムの一覧にSampleApp2が含まれている場合はそのバージョンをListで返す。 ' '※SampleApp2はバージョン違いで複数インストールできるものとする。 ' Public Sub CreateInstalledSampleApp2Versions(ByRef versions As List(Of Version)) Const MUST_INCLUDE_WORD As String = "ApplicationXXX2" versions = New List(Of Version) Dim uninstallPath As String Dim uninstallKey As Microsoft.Win32.RegistryKey Try uninstallPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" uninstallKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstallPath, false) If uninstallKey IsNot Nothing Then Dim appKey As Microsoft.Win32.RegistryKey For Each subKey As String In uninstallKey.GetSubKeyNames() appKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(uninstallPath + "\" + subKey, false) If appKey.GetValue("DisplayName") IsNot Nothing Then If appkey.GetValue("DisplayName").ToString().Contains(MUST_INCLUDE_WORD) Then If appKey.GetValue("DisplayVersion") IsNot Nothing Then versions.Add(New Version(appKey.GetValue("DisplayVersion").ToString())) End If End If End If Next End If Catch ex As Exception '全ての例外をキャッチし、再スローする。 Throw End Try End Sub 'インストールされているSampleApp2のバージョンの中から最新版を取得する。 ' Public Function GetInstalledSampleApp2LatestVersion(ByRef versions As List(Of Version)) As Version GetInstalledSampleApp2LatestVersion = Nothing If versions.Count <= 0 Then Exit Function 'パソコンにSampleApp2がインストールされていない場合 GetInstalledSampleApp2LatestVersion = versions.Item(0) For i As Integer = 1 To versions.Count - 1 If GetInstalledSampleApp2LatestVersion.CompareTo(versions.Item(i)) < 0 Then GetInstalledSampleApp2LatestVersion = versions.Item(i) End If Next End Function End Class --- 呼び出し側 --------------------------------------------------------------------- Module Main2 Public Sub Main2() Dim appInfo As New SampleApp2() Dim versions As List(Of Version) = Nothing '呼び出し側でListを宣言 Try appInfo.CreateInstalledSampleApp2Versions(versions) Catch ex As Exception Console.WriteLine(ex.Message) End Try Dim latestVersion As Version = appInfo.GetInstalledSampleApp2LatestVersion(versions) End Sub End Module
上記1と2ではどちらがより良い設計なのか判断しかねています。
当方、オブジェクト指向に関しては職業訓練でJavaを習得し、その後は現在の業務に就きながらネット検索や書籍などを参考にし、改修のタイミングでオブジェクト指向型にリファクタリングしています。
プロパティー(=メンバー変数)として存在しなくてもクラスとして成り立つなら上記2が正解なのでしょうか。
具体的な指摘でも、また一般的な設計指針やご意見でも構いませんので情報を得られれば幸いです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー