【问题标题】:VB Method naming suggestionVB 方法命名建议
【发布时间】:2015-11-12 07:39:38
【问题描述】:

我有一个方法:

  • 检查数据是否被修改
  • 如果是,询问用户:“您要保存吗?” (是/否/取消)
  • 如果回答是,则保存数据
  • 返回一个布尔值,无论用户是否回答了“取消”,在这种情况下,调用方方法需要中止其 Form.Close() 事件。

问题(相互关联):

  • 我想不出该方法的正确名称。
  • 它同时做很多事情。
  • 布尔返回类型不是很清楚。我可以直接返回用户的答案,但使用起来会稍微复杂一些,因为调用者必须将函数的返回值与 Cancel 常量进行比较,而不是与 True 进行比较。

你有什么建议吗?谢谢!

Private Function CancelDueToUnsaved() As Boolean
    If Not _data.Modified Then Return False

    Dim answ = MsgBox("Save changes?", MsgBoxStyle.YesNoCancel + MsgBoxStyle.Question, "")

    If answ = MsgBoxResult.Yes Then SaveData()

    Return (answ = MsgBoxResult.Cancel)
End Function

Private Sub Form_Closing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    If CancelDueToUnsaved() Then e.Cancel = True
End Sub

【问题讨论】:

  • 有点基于意见的问题,但在你的鞋子里,我只想把它命名为 SaveChanges。试图涵盖方法名称中的所有功能是没有用的。覆盖基本动作,应该做的。请注意,我还反转了布尔值并专注于实际保存而不是取消......但这只是我的意见

标签: vb.net methods naming


【解决方案1】:

我会将它命名为“SaveChanges”(正如 Tom 提到的),因为它应该表明保存数据操作发生在此处。如果这很重要,命名参数也可以提高可读性:

Private Sub SaveChanges(ByRef cancelled as Boolean)
...
End Sub

您也可以抛出自定义异常,但对于单个布尔值来说太多了:

Private Sub SaveChanges()
...
If answ = MsgBoxResult.Cancel Then Throw New UserCancelException
...
End Sub

【讨论】:

  • 考虑到可读性和有效性,byref 参数非常优雅。很好的一点!
【解决方案2】:

我认为这是一种很常见的情况;在我的表格中,我使用两个函数解决了:

Function SaveChanges() As Boolean

    SaveChanges = False

    'check if data compiled is ok
    'save changes under transaction
    '(...)

    'if everything is ok
    SaveChanges = True

End Function

Function blnExitMode() As Boolean

    blnExitMode = True

    'code to check if there are changes to save
    '(...)

    'if there are changes to save
    Select Case MsgBox("Save changes?", MsgBoxStyle.Question + MsgBoxStyle.YesNoCancel + MsgBoxStyle.DefaultButton3)
        Case MsgBoxResult.Yes
            If Not Me.SaveChanges Then blnExitMode = False

        Case MsgBoxResult.Cancel
            blnExitMode = False

    End Select

End Function

所以我可以在表单关闭时使用此代码:

If Not Me.blnExitMode Then e.Cancel() = True

当用户尝试移动到另一条记录而不保存更改或更改表单“模态”(即从插入到搜索)时,我也可以调用 blnExitMode

【讨论】:

    【解决方案3】:

    看起来您只是在说“当表单关闭时,如果进行了未保存的更改,则提示用户是否保存或不关闭表单。如果是,保存更改并关闭,如果不,不要保存但无论如何关闭,如果取消,不要保存或关闭。”是吗?

    您可以在表单关闭事件本身中轻松完成此操作,而不是调用其他内容并尝试传递响应(这对您来说有点困难,因为您尝试使用布尔值,但有 3 个选项)。

    这就是我自己完成的方式......希望这会有所帮助:

    Private Sub Form_Closing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    
        If _data.Modified Then
            Dim dialogResult = MessageBox.Show(Me, "Changes have been made.  Would you like to save?", "Unsaved Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
    
            If dialogResult = System.Windows.Forms.DialogResult.Yes Then
                SaveData()
    
            ElseIf dialogResult = System.Windows.Forms.DialogResult.Cancel Then
                e.Cancel = True
    
            Else
                'result is No - don't do anything...just let the form close
            End If
        End If
    
    End Sub
    

    【讨论】:

    • 确实不错。但我在两个地方使用了这个功能。不仅在 Form.Close() 中,而且在按下“重置”按钮时(=再次从 db 读取数据并覆盖可能的更改)。所以我不想在这两个地方复制 check-if-modified 代码。
    【解决方案4】:

    [已解决]

    • 使用简单的名称表示主要任务:我更喜欢 HandleUnsavedChanges() 而不是简单的 SaveChanges()
    • 如果用户取消,则使用 ByRef 参数返回。

    注意:在单击重置按钮时,我也一直在使用此代码,其中一个简单的问题 OK/Cancel 更适合。但是我还是放弃了这个按钮,因为它没有多大意义。因此,HandleUnsavedChanges 方法现在实际上可以在 Form.Close() 事件中传输。

    Private Sub HandleUnsavedChanges(ByRef userCancelled As Boolean)
        If Not _data.IsModified Then Exit Sub
    
        Dim answ = MsgBox(msg, MsgBoxStyle.YesNoCancel + MsgBoxStyle.Question, "Bestätigung")
        Select Case answ
            Case MsgBoxResult.Yes
                SaveData()
            Case MsgBoxResult.Cancel
                userCancelled = True
        End Select
    End Sub
    
    Private Sub Form_Closing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        HandleUnsavedChanges(userCancelled:=e.Cancel)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多