给函数参数名称加上p *前缀有什么好处?


22

我经常看到在功能参数前面加上的项目(在使用Eclipse的Java项目和团队中)p

例如

public void filter (Result pResult) ...

我个人认为这没有任何好处,但想知道原因是什么。我听到的最好的解释是区分相同命名字段的名称。我对此解释有疑问,但我可以理解这一点。

Answers:


34

在符号上添加有意义的前缀(例如广为人知的匈牙利符号)的做法可以追溯到IDE不存在或过于原始的时代。如今,只需单击鼠标,即可找到声明的要点,没有必要通过分配公共前缀来破坏名称的最宝贵部分(其前几个字母)。


10
系统匈牙利表示法是一种可怕的做法,应避免。另一方面,某些“ Apps匈牙利语表示法” 可能很有用(例如,防止不安全的用户输入被滥用)。
Casey Kuball 2012年

7
@Darthfett:甚至那种匈牙利符号都试图直接在变量名中实现临时的手动类型系统。只需使用一种好的静态类型语言,并让一个真实类型系统自动为您跟踪类似的事情!
迪洪·耶维斯

1
@WyattBarnett Systems匈牙利语不会为程序员提供有关现代IDE的任何有用信息。正确执行代码后,Apps Hungarian可以减轻代码审查中的头痛。
Casey Kuball 2012年

2
@TikhonJelvis并非所有语言都支持严格执行的typedef(例如C ++ typdefs)。对于支持它的语言,您说得很对。
Casey Kuball 2012年

4
@Darthfett:在C / C ++中,您可以将它包装在struct/中,union并带有一个元素。
Maciej Piechotka,2012年

9

您怀疑,这是为了避免参数名称与成员或局部变量名称之间的名称冲突。出于相同的原因,有时会给成员变量一个前缀(例如m_result)。就个人而言,this如果发生名称冲突,我更喜欢仅对成员变量使用前缀。它内置于语言中,每个人都已经知道它的含义了。


那就是我所做的。调用方法时,不使用前缀也有助于Eclipse。如果您构建了对象树并像要调用的方法的参数名称一样命名变量,则它就像一个超级按钮一样工作,但是如果参数名称带有前缀,则此方法将无效。
oschrenk 2012年

5

仅当要将参数分配给成员变量(例如构造函数或setter)时,才使用参数前缀。

Paint (newColor) {
  color = newColor;
}

对我来说,我发现使用不同的变量名比使用“ this”前缀更明显。

对于其他情况,我避免使用容易与成员变量混淆的参数。

如果一个方法或类太大而很难说出变量的含义,那么真正的解决方案就是将其分解为较小的方法/类。使用前缀是一个创可贴解决方案,它确实解决了根本问题。


就个人而言,我更喜欢在这种情况下缩写参数名称(例如Paint (clr) { color = clr; })。... 通常没有多少歧义,尽管color -> clr尤其可能是例外。
贾斯汀时间2恢复莫妮卡

1

如果您为每个方法参数名称使用“ p”作为前缀制定了标准,则可以轻松地在方法主体的其余部分识别方法参数。

这样可以节省您查找方法参数的时间。您可以轻松调试代码。


1
如果您无法分辨出什么是参数,什么不是-您的方法可能写得不好。可能时间太长或使用了太多非结构化变量?无论哪种方式,通过添加不必要的前缀似乎都可以解决另一个问题。
jakubiszon

1

简短-这种做法使代码更难阅读。

长-我认为这是一种不良做法,仅用于支持其他不良做法。让我们研究一下使用这样的前缀可能被认为有帮助的几个原因:

  • 避免变量名冲突

    • 您的参数名称是否确切表示参数是什么?如果具有“完全相同”的参数和类字段,则不需要参数。
    • 在这种情况下,仅对类构造函数使用前缀是有意义的,例如Aaron答案中描述的new *前缀。它对于设置方法也可能很有用,例如

    public void setHeight(int newHeight) { this.height = newHeight; }

  • 方法有很多参数,声明了很多变量,我们很容易忘记哪个是参数。

    • 如上所述-问题在于变量的数量。
    • 该程序的结构可能不好。检查所有变量是否都是“独立的”-也许应该将它们组织成结构或类。也许应该将整个计算或过程包装在一个单独的类中,以便对这么多的变量进行操作。
    • 即使您需要这么多的变量-它们也应使用有意义的名称,并且前缀位于您和有意义的部分之间。
  • 方法很长,您需要使用前缀来跟踪什么是参数。
    • 问题出在方法的长度上-如果程序编写正确,您应该始终在单个屏幕上看到方法标题及其整个主体。
    • 尝试将方法分成较小的块。

除某些特定情况外,添加参数前缀仅有助于缓解症状,无法解决实际问题。


0

我是iParam的粉丝,而oParam是out参数。我会说要更改cParam,但这是不可接受的


2
您能解释一下为什么您喜欢此前缀吗?使用它会有什么好处?
彼得
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.