如何合并几乎相同的三个功能?

时间:2020-06-03 12:10:13

标签: vb.net function

我有3个不同的功能,除了一个部分(代码中的{ENTERHERE)外,它们基本上是相同的。 LastWriteTimeLastAcccessTimeCreationTime

Public Sub DeleteByENTERHERE(delDirectory As String)

    Dim directory As New IO.DirectoryInfo(delDirectory)
    For Each dctFile As IO.FileInfo In directory.GetFiles()
        If dctFile.ENTERHERE.AddDays(Owner.PluginXML.DeleteDays) < Now Then 
            Try
               dctFile.Delete()
            Catch ex As Exception
            End Try
        End If
    Next

    If Owner.PluginXML.DeleteInSubfolders Then
        For Each folder As IO.DirectoryInfo In directory.GetDirectories()
            DeleteByENTERHERE(folder.FullName)
        Next
    End If
End Sub

我有一个配置菜单,可以在其中确定要使用的三个功能中的哪个,并使用此代码使用/不使用功能。

If Not Owner.PluginXML.LastWriteTime Then                                                   
    Exit Sub
End If

如何将这三个功能合而为一?我尝试了类似的方法,但是感觉不干净。

    If Owner.PluginXML.LastWriteTime Then
        If file.LastWriteTime.AddDays(Owner.PluginXML.DeleteDays) < Now Then
        End If
    End If

    If Owner.PluginXML.LastAccessTime Then
        If file.LastAccessTime.AddDays(Owner.PluginXML.DeleteDays) < Now Then
        End If
    End If

    If Owner.PluginXML.CreationTime Then
        If file.CreationTime.AddDays(Owner.PluginXML.DeleteDays) < Now Then
        End If
    End If

1 个答案:

答案 0 :(得分:4)

我会为接口推荐三种独立的方法,但是在单个私有方法中会大量实现,例如

Public Sub DeleteByLastWriteTime(folderPath As String)
    DeleteByFileTime(folderPath, FileTimeType.LastWrite)
End Sub

Public Sub DeleteByLastAccessTime(folderPath As String)
    DeleteByFileTime(folderPath, FileTimeType.LastAccess)
End Sub

Public Sub DeleteByCreationTime(folderPath As String)
    DeleteByFileTime(folderPath, FileTimeType.Creation)
End Sub

Private Enum FileTimeType
    LastWrite
    LastAccess
    Creation
End Enum

Private Sub DeleteByFileTime(folderPath As String, fileTimeType As FileTimeType)
    Dim folder As New DirectoryInfo(folderPath)

    For Each file In folder.EnumerateFiles()
        Dim fileTime As Date

        Select Case fileTimeType
            Case FileTimeType.LastWrite
                fileTime = file.LastWriteTime
            Case FileTimeType.LastAccess
                fileTime = file.LastAccessTime
            Case FileTimeType.Creation
                fileTime = file.CreationTime
        End Select

        If fileTime.AddDays(Owner.PluginXML.DeleteDays) < Date.Now Then
            file.Delete()
        End If
    Next

    If Owner.PluginXML.DeleteInSubfolders Then
        For Each subfolderPath In Directory.EnumerateDirectories(folderPath)
            DeleteByFileTime(subfolderPath, fileTimeType)
        Next
    End If
End Sub

您甚至可以将该私有方法重构为两个:

Private Sub DeleteByFileTime(folderPath As String, fileTimeType As FileTimeType)
    Dim folder As New DirectoryInfo(folderPath)

    For Each file In folder.EnumerateFiles().Where(Function(fi) GetFileTime(fi, fileTimeType).AddDays(Owner.PluginXML.DeleteDays) < Date.Now)
        file.Delete()
    Next

    If Owner.PluginXML.DeleteInSubfolders Then
        For Each subfolderPath In Directory.EnumerateDirectories(folderPath)
            DeleteByFileTime(subfolderPath, fileTimeType)
        Next
    End If
End Sub

Private Function GetFileTime(file As FileInfo, fileTimeType As FileTimeType) As Date
    Select Case fileTimeType
        Case FileTimeType.LastWrite
            Return file.LastWriteTime
        Case FileTimeType.LastAccess
            Return file.LastAccessTime
        Case FileTimeType.Creation
            Return file.CreationTime
        Case Else
            Throw New ArgumentException($"'{fileTimeType}' is not a valid {NameOf(fileTimeType)} value.", NameOf(fileTimeType))
    End Select
End Function