我已经重构了一种方法,如下所示,我个人认为它具有很强的可读性,但我的一位同事并不喜欢它,认为它的方法太多。我错了吗,如果不是我怎么能说服了他? 原方法:
Private Sub SendTextMessage(ByVal sender As Object, ByVal eventArgs As EventArgs)
If String.IsNullOrEmpty(SMSUserControl.TxtPhoneProperty) Then
lblError.Text = Globalization.GetTranslation("PhoneNotSet", "A mobile phone number must be specified")
Exit Sub
End If
Try
If Not String.Equals(UserHelper.CurrentUser.Mobile, SMSUserControl.TxtPhoneProperty) Then
UserHelper.CurrentUser.Mobile = SMSUserControl.TxtPhoneProperty
UserHelper.CurrentUser.Properties.Save()
End If
If IPhoneProfilePresenter Is Nothing Then
IPhoneProfilePresenter = New IPhoneProfilePresenter(Me, CabFileNameManagerFactory.Create(), SMSSenderFactory.Create())
End If
IPhoneProfilePresenter.SendTextMessage(New TextMessageInfo(SMSUserControl.TxtPhoneProperty, GetOCSInstallerLink(), DownloadLink.Text))
Catch ex As Exception
lblError.Text = _
CWebLog.LogAndDisplayError(CurrentSession.IsFullLogging, _
Globalization.GetTranslation("MobilePhoneSave", _
"Failed to save the mobile phone number"), _
ex)
End Try
End Sub
重构方法:
Private Sub SendTextMessage(ByVal sender As Object, ByVal eventArgs As EventArgs)
If PhoneNumberIsNotSet() Then
lblError.Text = Globalization.GetTranslation("PhoneNotSet", "A mobile phone number must be specified")
Exit Sub
End If
Try
If User_Input_Mobile_Is_Not_The_Same_As_The_One_Stored_In_The_Database() Then
UpdateMobile()
End If
GetIPhoneProfilePresenter().SendTextMessage(New TextMessageInfo(SMSUserControl.Mobile, GetOCSInstallerLink(), DownloadLink.Text))
Catch ex As Exception
lblError.Text = _
CWebLog.LogAndDisplayError(CurrentSession.IsFullLogging, _
Globalization.GetTranslation("MobilePhoneSave", _
"Failed to save the mobile phone number"), _
ex)
End Try
End Sub
Private Sub UpdateMobile()
UserHelper.CurrentUser.Mobile = SMSUserControl.Mobile
UserHelper.CurrentUser.Properties.Save()
End Sub
Private Function User_Input_Mobile_Is_Not_The_Same_As_The_One_Stored_In_The_Database() As Boolean
Return Not String.Equals(UserHelper.CurrentUser.Mobile, SMSUserControl.Mobile)
End Function
Private Function PhoneNumberIsNotSet() As Boolean
Return String.IsNullOrEmpty(SMSUserControl.Mobile)
End Function
Private Function GetIPhoneProfilePresenter() As IPhoneProfilePresenter
If IPhoneProfilePresenter Is Nothing Then
IPhoneProfilePresenter = New IPhoneProfilePresenter(Me, CabFileNameManagerFactory.Create(), SMSSenderFactory.Create())
End If
Return IPhoneProfilePresenter
End Function
根据反馈再次重构
Private Sub ValidateAndSaveMobilePhoneAndSendTextMessage(ByVal sender As Object, ByVal eventArgs As EventArgs)
If ValidateMobilePhoneNumber() Then
SaveMobilePhoneNumber()
SendTextMessage()
End If
End Sub
Private Sub SendTextMessage()
If iPhoneProfilePresenter Is Nothing Then
iPhoneProfilePresenter = New iPhoneProfilePresenter(Me, CabFileNameManagerFactory.Create(), SMSSenderFactory.Create())
End If
iPhoneProfilePresenter.SendTextMessage(New TextMessageInfo(SMSUserControl.TxtPhoneProperty, GetOCSInstallerLink(), DownloadLink.Text))
End Sub
Private Sub SaveMobilePhoneNumber()
Try
If Not String.Equals(Globalization.CurrentUser.Mobile, SMSUserControl.TxtPhoneProperty) Then
Globalization.CurrentUser.Mobile = SMSUserControl.TxtPhoneProperty
Globalization.CurrentUser.Properties.Save()
End If
Catch ex As Exception
lblError.Text = _
CWebLog.LogAndDisplayError(CurrentSession.IsFullLogging, _
ContentHelper.GetTranslation("MobilePhoneSave", _
"Failed to save the mobile phone number"), _
ex)
End Try
End Sub
Private Function ValidateMobilePhoneNumber() As Boolean
Dim isValid As Boolean = True
If String.IsNullOrEmpty(SMSUserControl.TxtPhoneProperty) Then
lblError.Text = ContentHelper.GetTranslation("PhoneNotSet", "A mobile phone number must be specified")
isValid = False
End If
Return isValid
End Function
最佳答案
方法应该“只做一件事”(参见 Coding Horror blog post 了解更多详情)。这也称为 Single Responsibility Principle .
方法应该简短(ish)、易于理解且没有副作用。您应该能够以方法的名称描述方法的作用。例如,如果您的方法是 VerifyAddressAndAddToDatabase
,那么它需要拆分为两个方法 - VerifyAddress
和 AddToDatabase
。
在过去,调用大量方法(或当时调用的过程和函数)被认为是一个坏主意,因为这涉及开销。但是对于现代编译器和更快的处理器,这不是问题。
关于asp.net - 一种长方法或多种方法,但可读性强,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2038783/