1

我已经获得了一些代码来查找问题和可以改进和改变的东西(这是一个家庭作业,但这个问题与任务本身无关),部分代码是:

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创建 is 变量,什么时候可以将它分配给函数名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,第二个更具可读性)?

4

6 回答 6

5

也许曾经有更多的检查,其中的值InSameCell可能会更改多次,然后才会返回。使用returnthen 会改变行为。

也许作者想避免繁琐的重命名。你知道,当你想重命名一个函数,并且你在它自己的函数体中多次使用这个函数的名字时,你有很多地方可以替换,而当你引入一个变量时,你只有一个地方可以改变名字。 (我知道 IDE 会为你正确地做到这一点;但在 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
于 2012-05-01T17:09:26.590 回答
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
...

但是当表达式是布尔类型时,有些人会不断地这样做。我认为他们没有意识到条件等同于算术表达式。它们只是布尔算术而不是数字算术。

另一个误解是 If 语句需要一些比较,例如If x > 0 Then. 如果他们有一个布尔变量b,他们会写If b = True Then. 但是所有的 If 语句需要的是一个由布尔表达式给出的布尔值。这个表达式可以像查询一个变量一样简单:If b Then.

为什么这行得通?因为 if bis Truethen b = TrueyieldTrue并且 if bis Falsethen b = Trueyield False。所以,b = True很像说x * 1。当然,这和刚才一样x

于 2012-05-01T17:28:43.437 回答
2

The second method is more readable, I concur. It also happens to be my preference for returning out of methods. I really cannot think of a single downside to the latter in comparision, but can for the former. What happens if the method gets longer and someone forgets to set a Boolean flag? A subtle bug would be born. Additionally, it takes more code to write as well. In the latter approach, the code won't compile if it is missing a return, and it also will be shorter.

The only time you need local variables for the return type is when the routine needs to do some other work after the return value is first determined. In the example you post, this is not the case.

Code Complete, 2nd Edition agrees on page 391:

Use a return when it enhances readability In certain routines, once you know the answer, you want to return it to the calling routine immediately. If the routine is defined in such a way that it doesn’t require any further cleanup once it detects an error, not returning immediately means that you have to write more code.


NOTE: As other answers [1,2] have mentioned, you can reduce the method to a single code statement. Also using AndAlso should help speed up the evaluation by short-circuiting the logical expression early if the first part is false:

Return FirstCellPosition.NoOfCellsSouth = SecondCellPosition.NoOfCellsSouth 
    AndAlso FirstCellPosition.NoOfCellsEast = SecondCellPosition.NoOfCellsEast
于 2012-05-01T17:07:21.613 回答
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。如果您使用返回,则执行将停止并且函数将返回正确的值。

于 2012-05-01T22:14:26.403 回答
0

如果由于某种原因它需要出现在赋值的右侧,并且您不想引起递归,则可以使用变量:

Dim Function F() As Boolean
    F = True
    If a = b Then 
        F = Not F()
    End If
End Function
于 2014-04-12T21:36:05.420 回答
0

简而言之-是的,您的最后一个示例非常有效。

然而,家庭作业中使用的大多数示例要么用于展示其他教学示例。作业表中的代码仅显示了以传统方式使用函数的基础知识,您的第二个示例显示了下一个学习步骤,并且是实现所需结果的最紧凑方式。

此外,第一个示例也可用于强化之前学到的经验教训——例如关于分配变量、布尔值的使用等。

提高编码技能的最佳方法之一是反复练习所学内容。

于 2017-06-18T00:37:55.037 回答