我已经获得了一些代码来查找可以改进和更改的问题和事情(这是一项家庭作业,但这个问题与任务本身无关),部分代码是:
Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
Dim InSameCell As Boolean
InSameCell = False
If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then
InSameCell = True
End If
CheckIfSameCell = InSameCell
End Function
我无法理解为什么InSameCell
是变量的,只能将其分配给函数名CheckIfSameCell
?
或者只使用如下所示的return语句?
Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
If FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth And FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast Then
Return True
End If
Return False
End Function
我可以理解不直接在If
语句中返回表达式,以提高可读性。
我知道为函数名称分配返回值不会退出函数,而Return会这样做,但它只是一个人的风格,或者第一个版本是否有任何优势(IMO,第二个版本更具可读性) )?
答案 0 :(得分:5)
也许曾经有过更多的检查,InSameCell
的值可能会多次改变,然后才会被返回。然后使用return
会改变行为。
也许作者想要避免繁琐的重复。你知道,当你想重命名一个函数,并且你在它自己的体内多次使用该函数的名字时,你有很多地方要替换,而当你引入一个变量时,你只会有一个地方来改变它的名字。 (我知道IDE会为你正确地做到这一点;但在VB6中并非如此,习惯很难打破。)
也许作者对VB6更熟悉没有return
。
可能是风格或政策问题。
无论如何,我会把它写成:
Function CheckIfSameCell(ByVal FirstCellPosition As CellReference, ByVal SecondCellPosition As CellReference) As Boolean
Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
End Function
答案 1 :(得分:4)
将结果分配给函数名称是VB6中使用的旧样式,不应再在VB.NET中使用。使用Return value
!
我个人不喜欢风格中的陈述
If condition Then
Return True
Else
Return False
End If
他们只是愚蠢,因为condition
已经产生了返回值!更好:
Return condition
这也是GSerg选择的解决方案。
没有人会写
If x + y = 0 Then
Return 0
ElseIf x + y = 1 Then
Return 1
ElseIf x + y = 2 Then
Return 2
ElseIf x + y = 3 Then
Return 3
...
但是当表达式是Boolean类型时,有些人会不断地这样做。我认为他们没有意识到条件等同于算术表达式。它们只是用布尔运算算术而不是用数字算术。
另一个误解是,If语句需要进行一些比较,如If x > 0 Then
。如果他们有一个布尔变量b
,他们会写If b = True Then
。但是所有的If语句需求都是布尔表达式给出的布尔值。此表达式可以像查询变量一样简单:If b Then
。
为什么这样做?因为如果b
为True
,则b = True
会产生True
,如果b
为False
,那么b = True
会产生False
。因此,b = True
非常像是在说x * 1
。当然,这与x
相同。
答案 2 :(得分:2)
第二种方法更具可读性,我同意。这也恰好是我退出方法的偏好。 我真的想不出后者在比较中的单一缺点,但可以为前者。如果方法变得更长并且有人忘记设置布尔标志会发生什么?一个微妙的错误将诞生。此外,还需要编写更多代码。在后一种方法中,如果缺少返回,代码将不会编译,并且它也会更短。
需要返回类型的局部变量的唯一时间是例程在首次确定返回值后需要执行其他工作时。在您发布的示例中,情况并非如此。
Code Complete, 2nd Edition同意第391页:
在增强可读性时使用返回 在某些例程中,一次 你知道答案,你想把它归还给调用程序 立即。如果例程的定义方式不是这样 一旦检测到错误而不返回,则需要进一步清理 立即意味着您必须编写更多代码。
注意:正如其他答案[1,2]所提到的,您可以将方法缩减为单个代码语句。如果第一部分是假的,那么使用
AndAlso
还应该通过尽早缩短逻辑表达式来加速评估:Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
答案 3 :(得分:0)
返回并为函数名赋值有一个重要的事情。如果你(因为任何扭曲的原因)想写那样的东西
Public Function TestFunct() as Boolean
Dim testVar as Boolean = True
If testVar then
TestFunct = True
Else
TestFunct = False
EndIf
'do more stuff here
...
TestFunct = False
End Function
它总是会返回false。如果使用return而不是它,则执行将停止,函数将返回正确的值。
答案 4 :(得分:0)
如果出于某种原因,它可能需要出现在赋值的右侧,并且您不希望导致递归:
Dim Function F() As Boolean
F = True
If a = b Then
F = Not F()
End If
End Function
答案 5 :(得分:0)
简而言之 - 是的,你的最后一个例子非常有效。
然而,家庭作业中使用的大多数例子要么用于显示其他教学示例。作业表中的代码仅显示了以传统方式使用功能的基础知识,第二个示例显示了下一个学习步骤,是实现所需结果的最紧凑方式。
此外,第一个例子也可用于重新强化之前学到的经验教训 - 例如关于分配变量,使用布尔等。
提高编码技能的最佳方法之一就是反复练习所学知识。