将返回的变量命名为“结果”是一种好习惯吗?[关闭]


44

调用方法返回的变量名是一个好习惯result吗?

例如:

public Zorglub calculate() {
    Zorglub result = [...]
    [...]
    return result;
}

还是应该按类型命名?

public Zorglub calculate() {
    Zorglub zorglub = [...]
    [...]
    return zorglub;
}

我曾经在野外看到过这两种情况,如果我需要选择一种原因,是什么原因会使我偏爱前者或后者(或任何更好的名字)?

我主要是在考虑Java。


73
我也看到ofTheJedi用于此目的。不推荐,只是说我已经看过了。Zorglub ofTheJedi = //...; return ofTheJedi;

7
我通常称其为“ retval”(返回值),但这与“ result”大致相同,我将对它进行表决。
Zeta 2

5
每个人都有不同的答案,他们都是相似的,但又不同且有效,这个问题不是主观上的,而是答案。这更像是一项民意调查。
ZJR 2012年

16
我会说“结果”作为变量很好,但是“计算”作为函数绝对不是。
Kaz Dragon '02

2
您是否与许多以前的Delphi程序员一起工作?
彼得·特纳

Answers:


48

如果这是一个方法变量,则实际上取决于可读性。

既然您已经在变量声明和方法返回类型中都拥有类型名称,则不妨使用result-它描述了变量的作用。


40

如果将变量命名为,则交叉阅读会更容易result。这使您的意图明确。


2
+1这是重点。我只要看一眼代码就知道在任何情况下结果意味着什么。
Xeoncross

1
我同意,使用变量类型并不能帮助您理解要返回它。在这些简单的示例中,不需滚动或查找即可更轻松地看到返回值,但提前知道函数的返回值则更快。如示例中所示,初始化它也很重要。
nycynik

17

如果我需要一个返回变量(实际上很少发生),那么我总是调用它ret并始终在函数头下方定义它。该函数已经有一个名称,该名称说明了所有返回的内容。

如果我有myFunction可以命名它的返回变量myFunctionReturnValue说完全一样的东西,只有我不得不说,它明确每一次。由于功能通常应简短,因此无需明确。即使我迷路了,我也可以跳转到声明,并将其放到函数定义的下面。

但是,任何其他没有隐式(如retresult)或显式(如myFunctionReturnValuemyFunctionResult)状态的名称,即当前函数的返回变量都太通用了。

在第二个示例中,这zorglub是一个糟糕的选择。声明真正告诉我的是,您创建了一个变量,该变量的名称等于名称旁边的类型注释。它与int someInt或一样有用Zorglub z

在您的第一个示例中,当我查看代码时,我首先看到函数名称,该名称告诉我该函数计算一个Zorglub。当我阅读第二行时,我看到“好,这是zorglub,将要返回,但是显然不能立即返回,因此将其存储在result变量中”(作为补充说明:而不是重新分配值,那么最好将变量声明为final来传达该信息),然后我认为“所以现在让我们看看它返回之前会发生什么”。与第一个示例不同,我不需要真正地阅读任何内容即可知道是变量,它将被返回,并且如果我想理解它,我想在函数体中跟随。

您可能想阅读Spartan编程,它与您的问题有关。


8
为“ zorglub是一个糟糕的选择” +1。在任何情况下,都没有任何理由使变量名与类型名相同(减去首字母大写)。声明告诉您变量的类型-在您的类型后命名变量并不比调用变量x1,x2,x3等更好。任何变量的名称都应表明变量的用途或作用。在这种特殊情况下,我对变量的首选名称是toReturn-因为该变量引用了要返回的对象。实际上,我的许多变量名都以“ to”开头。
达伍德说,请

21
@DavidWallace-绝对太强大了。我有一堂课Container。如果我有一个修改数量的方法,我可能会说,var container = getContainer(id); container.Quantity += 1; 如果该方法的上下文仅在单个容器上运行,那便是可以理解的,仅此而已。称它为theContainerWeAreGoingToAdjustTheQuantityOf荒谬。
Scott Whitlock

4
@David,我不同意。让我们假设您有几个局部变量,每个局部变量的类型不同(比如说用户,经理和部门)。并假设任务是将用户链接到部门和经理团队。恕我直言,完全可以简单地调用此User实例user(相对于userToJoinThisDepartmentAndManager?还是您的选择呢?)
PéterTörök2012年

10
次要问题:我讨厌看到result / returnValue的“ ret”或“ rv”或其他缩写形式。“结果”不是很长,没有人需要保存字符。
克里斯托弗·约翰逊

2
@KristopherJohnson:“结果”不是很长,但这也不意味着“返回值”。返回值并不总是计算的结果,相反,计算结果并不总是返回值。我想您可以命名您的返回值returnValue,但它ret是传统的,就像int和一样char
ruakh 2012年

12

在第二个示例中,您将结果的类型它是什么混为一谈。

Zorglub zorglub;

告诉我这是Zorglub,两次。如果我不愿意阅读方法返回类型,那将是三遍。然而,

double variance;

例如,就程序语义而言,它为我提供了有关返回值含义的线索。result取决于方法的大小,它可能比仅调用它更清晰,也可能没有,这是对IMO每个方法的判断调用。


8

如果你有许多Zorglub在方法的对象玩,你“可能”犯了一个错误,并返回一个错误,或/和你可能会倾向于命名别人zorglub1zorglub2

如果您将其命名result,就没有机会犯这样的错误。另外,我发现这是一个好名字;我也看到returnedValuereturnedObject几次,它也清楚,虽然有点冗长。


5

我个人并不完全适合result用作变量名。足够公平,它告诉我相关值是某些计算的结果-但是,我猜想大约(或超过)程序中使用的变量/字段的90%是正确的。

此外,如其他几个答案所述,它可以用于标记要从方法/函数返回的值。但是,如果我的方法简短,只专注于做一件事,并且始终保持单一的抽象水平,那么我将不会有很多局部变量,并且看到一个方法将返回什么将是微不足道的。

因此,我宁愿让我的方法简短明了,并命名我的变量来表示它们所持有的价值的含义,而不是在封闭方法内部扮演局部角色。但是,(例如,在旧代码中)Zorglub result肯定比容易理解Zorglub zorglub


12
之所以不称呼result它是因为它是某些计算的结果。之所以称呼它是result因为它是计算的结果。即使它不是最具体的含义,它也可以用作IMO的含义。表达意义是金色的,但意图习语也可能很有价值。在这种情况下,这需要权衡。
2012年

@Supr:您将使用什么名称来描述其他计算的结果,这些名称将仅在下一个或两个语句中使用(例如if (result >= 0) numChars+=result; else break;,其含义将从所讨论的计算中显而易见)?在我看来,值这从返回这个功能应该叫ret,而该值从最后调用函数返回的应该是result。请注意,result如果函数的返回值可能表示例如数量或错误代码,则该名称可能比长名称更有意义。
超级猫

@supercat,我会根据计算的内容或打算使用的值来命名它。即使命名正确,即使仅用于下一次计算,它也有助于提高可读性。在您的示例中,我不知道的含义result是什么或代码实际上在更高层次上的作用。我将不得不参考它的设置位置,以查看其价值来自何处以及它的含义。诸如此类的东西addedCharsmatchedChars将变得更透明的东西,可以帮助揭示代码在做什么,并且不需要result = ...
2012年

@Supr:问题在于,在许多情况下,不同范围的返回值可能意味着不同的含义。例如,如果一个程序包被接收到,则将数据包读入指定大小的缓冲区的例程可能返回一定数量的字节,或者返回负数以指示该数据包正在(并且仍然)待处理,对于缓冲区来说太大了,或一个很大的负数表示其他错误。将退货存入result这些标准,然后对照这些标准进行检查似乎比试图提出一个涵盖所有标准的描述性名称更为自然。
超级猫

@supercat,使用ret代替result似乎对我来说很好。在我看来,它不太清楚,因为它是缩写形式,而不是类似于名词的形式,但是如果始终使用它,则等同于result
2012年

1

我个人使用名称result来表示要从函数/方法返回的值。它明确表明它是要返回的值。按类型命名它似乎没有用,因为同一类型的变量可能不止一个。


嗯,可以肯定的是在返回之前会说“ return”已经足够明确了吗?您应该描述将要使用的方法,现在是“方法”。为什么不称之为总计,结果或其他描述目的的东西,那么您的代码将准备“返回总计”或类似的内容……
Dave

@Dave不一定,特别是如果您有几个相同类型的对象都可以返回的候选对象时,该方法的目的是弄清楚哪个才是正确的返回对象。
安迪

@Andy我明白你的意思,但实际上,我无法想象编写这样的函数。如果这就是编写此类函数的原因,那么听起来应该将其分解为更小,更易理解的函数。
戴夫

1

有什么不同?它只有两个不同的词会做同样的事情,所以真正的问题是哪个听起来更清晰?

“结果”或“ zorglub”。

我更喜欢使用ZorglubResult入门工具来查看结果返回结果, Zorglub以便更轻松地将其与您可能拥有的其他结果进行比较,并可以看到其结果。


1

我应该按类型来命名吗?

没有永不。这被称为“系统匈牙利语”,并且使用一种程序的想法已经过时了,该程序可以在需要时随时显示任何变量的类型。


1

每当需要在代码中命名任何内容时,都应提供描述性,有意义且易读的名称。返回变量的情况是人们倾向于对命名感到自满的一个很好的例子。

如果您有一个明确命名的函数,并且只需要一行代码,则可以完全跳过命名。使您的方法简明扼要,始终是您应该追求的目标。但是,有时确实需要用几行代码来完成一个函数。在这些情况下,始终建议您命名变量以匹配函数的用途。

如果该函数的目的是返回计算或决策算法的结果,那么result该变量是要使用的完全合适的名称,但是如果您的函数从列表中返回一个项目,该怎么办?如果您的函数有其他目的,而与数学或列表无关,该怎么办?在这些情况下,最好为变量提供一个有意义的名称,该名称与创建函数的原因有关。当然,如果需要,您可以简单地使用结果,因为它的名称不太可能与其他名称冲突,但是从可读性的角度来看,更有意义地在上下文中命名变量更有意义。


0

我喜欢组合它们,显示它的含义以及打算将其返回。

所以在您的示例中,结果为resultZorglub

如果它不是真正的问题,而仅仅是结果(不是resultString)


不错,但是我想如果返回类型发生变化,则必须重命名变量。我想无论如何,使用现代IDE只需一两次单击即可完成。
Jalayn '02

@Jalayn是的,但是如果将类型保留在名称范围之外,则根本不需要进行更改。(如果一个方法的长度足够长,以至于一个简单的名字不清楚,那么它可能太长了,应该重构。)
Donal Fellows 2012年

@DonalFellows我完全同意你的看法。从源存储库更新时看到的更改越少越好。
Jalayn '02

Okay同意,当您更改返回类型时,您可能会忘记在变量名称中也进行更改,这是一个问题。到目前为止,这对我来说从来都不是问题。我仍然喜欢在名称中显示双重意图,但是如果已经较小且已经很好地显示了意图代码,则它可能也会显得过大。你们说服了我。如果从现在起我有需要以这种方式调用变量,我将进行重构,直到不再有需要为止。谢谢
KeesDijk 2012年

0

在某个位置设置返回值,然后使用条件语句跳过可能修改它的所有代码,然后立即执行操作,我看不出太大的区别return,因此我选择直接返回,因此没有result变量。

如果您有一个中间值,可以通过条件代码进行更改,也可以不进行更改,那么它不是结果(尚未),因此,当然不应这样命名。


0

当我使用C ++工作时,我猜想这可能适用于Java。

例如

int Width() const
{
    Requires(....);
    Requires(....);

    //calculation

    Ensures(...);
    Ensures(...);
    return Result;
}

这是按合同设计的,因为确保框应位于方法的末尾。但是回报一定是最后的。我们有一个规则,即返回Result是唯一可以遵循suresure块的规则。


0

在递归函数中,一步一步地携带结果以进行尾部调用优化通常是有效的。为了向用户表明他不需要提供参数,可以合理地将参数命名为“结果”:

def removeOccurence [A] (slice: Seq[A], original: Seq[A]) = {
  @scala.annotation.tailrec
  def remove (leftOriginal: Seq[A], result: Seq[A]) : Seq[A] =
    trimStart (slice, leftOriginal) match {
      case (h :: tail) => remove (tail, h +: result)
      case (Nil)       => result.reverse
    }
    remove (original, Nil)
}

但是我更经常使用“随身携带”和“远距离携带”,这是我在野外看到的,在大多数情况下,携带这种想法甚至更好。

当然,第二个原因是,如果您的主题建议使用“结果”一词,例如,如果您进行算术评估。您可以解析公式,将变量替换为值,最后计算结果。

已经说明了第三个原因,但我有一个小偏差:您编写了一个执行某些工作的方法,比如说它评估“ max”的形式。

def max = {
  val result = somethingElseToDo
  if (foo) result else default 
}

我们可以将结果称为“ max”,而不是将结果称为“结果”,但是在某些语言中,您可以在调用方法时省略括号,因此max将是对方法本身的递归调用。

通常,我希望使用一个能说明结果的名称。但是,如果已经使用了该名称,则可能使用了多个变量,属性或方法,因为存在一个GUI字段,一个字符串表示形式,一个数字和一个用于数据库的名称,而使用另一个则增加了混淆的可能性。在3到7行的简短方法中,名称的“结果”应该不是问题。


0

在对象Pascal中,这不是选择。您必须Result在函数代码中的某处为变量赋值。

例:

function AddIntegers( A,B: Integer): Integer;
begin
  Result := A + B; 
end; 

因此对我来说很自然,有一个“结果”(或“雷托尔诺”,因为我用葡萄牙语拼写以避免与语言保留字的名称冲突)变量来接收返回值。

当然,如果它是C语言派生的非常简单的表达式,那么我不会费心声明结果变量-直接返回该表达式。


0

它不仅是您命名结果的名称(我特别喜欢'r'),而且还包括其用途。例如,如果您将要有一个return变量,那么每个return语句都应该返回它。没有“ return r;” 最后,在整个方法/函数中撒上'return m * x + b;“之类的东西。返回r;”。


-1

结果很好。我一眼就能理解代码,因此变量名就达到了目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.