为什么Android教程中的大多数字段(类成员)都以`m`开头?


446

我知道骆驼案规则,但是我对这条m规则感到困惑。它代表什么?我是PHP开发人员。“我们”使用变量的首字母表示类型,例如“ b”表示布尔值,“ i”表示整数,依此类推。

是Java吗?它代表手机吗?混合?


281
该前缀什么也没做,只会搞乱可读性……
Dapeng

10
将类型表示为前缀是不好的,称为匈牙利符号,请参见thc.org/root/phun/unmaintain.htmlkernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi

10
因为他们没有java代码风格的许多知识开始与
维克多·约内斯库

10
在我看来,如果您在区分局部变量和成员变量时遇到麻烦,那么与遵循代码约定相比,您会遇到更大的问题。这是我有时使用的约定:长寿,长名。短命,短名。到目前为止尚未感到困惑。
布兰登

17
一个真正的愚蠢的前缀。使用您的IDE生成设置器/获取器,最终得到getmName()和setmName()!Lombok之类的用于生成设置器,获取器,构造器等的工具也会生成m前缀。在我的选择中,m前缀不会增加值,应从命名约定中删除。
userM1433372 2014年

Answers:


551

此表示法来自AOSP(Android开放源代码项目)代码风格指南(针对贡献者)

遵循字段命名约定

  • 非公共,非静态字段名称以m开头。
  • 静态字段名称以s开头。
  • 其他字段以小写字母开头。
  • 公共静态最终字段(常量)为ALL_CAPS_WITH_UNDERSCORES。

请注意,链接的样式指南用于将代码添加到Android开放源代码项目中。

它不是单个Android应用程序代码的样式指南。


33
有趣的是,Google Java代码样式实际上与AOSP代码样式相矛盾。
乔塔姆2015年

51
我认为在这些时候这是胡说八道,尤其是在您的应用程序中这样做!“您的类和函数应该足够小,以至于您不需要它们。您应该使用一个突出显示或着色成员的编辑环境,以使它们与众不同。此外,人们很快学会了忽略前缀(或后缀)来查看名称中有意义的部分。我们读的代码越多,看到的前缀就越少。最终,前缀变得杂乱无章,成为旧代码的标记。”
-Robert

4
Google的Java样式指南computedValues
相反

对于单个应用程序,我记得一个不错的提示,建议使用应用程序名称的小写字母缩写而不是'm'。
abcoep

4
请在此请愿书中添加您的评论,以删除规则code.google.com/p/android/issues/detail?id=226814
likejudo 2016年

83

许多编码准则将m用作类的“成员”。因此,在编程时,您可以看到局部变量和成员变量之间的区别。


90
所有现代IDE均通过颜色/字体区分本地人和成员,恕我直言,这种方式比m前缀更具可读性。
Dzmitry Lazerka

5
同意 我觉得这件事很烦人,但这只是因为IntelliJ很棒。
ZakTaccardi 2015年

请在此请愿书中添加您的评论,以删除规则code.google.com/p/android/issues/detail?id=226814
likejudo 2016年

4
大多数代码检查工具中的@DzmitryLazerka没有这种突出显示级别。因此,它确实在大型开源项目中引起了轰动。
JWqvist

@DzmitryLazerka在记事本或github等中读取代码怎么样?
user924

57

什么是m前缀?

m代表成员变量或数据成员。m对非公共和非静态字段使用前缀。

什么时候使用?

private String mCityName;
private float mTemperature;

什么时候不使用?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

我做的事?

我个人不使用它。它使代码更加复杂,并且混乱了可读性。如果您仍在使用记事本进行编码,我不会说什么,但是现代的IDE能够突出显示和着色成员和局部变量或其他内容。

结论

采用?“是”或“否”是您的个人选择。


1
您也可以将其用于public static int,但可以使用s代替mpublic static int sFirstNumber;,请参见stackoverflow.com/a/49453184/7767664
user924

31

如果它是类中的成员变量,则“ m”表示“成员”。许多Java程序员都这样做,尽管在现代IDE中并不需要它,因为您具有突出显示,将鼠标悬停在工具提示上等优点。


9
我会争辩说,即使使用现代IDE,在使用代码完成功能时,为成员在同一位置显示类的所有成员变量,也可以在成员前面加上m或m_还是不错的选择。这意味着在上课时,您只需点击m_ + ctrl空间即可获取所有成员的列表。
Nailer

38
钉子,您可以通过使用此工具实现相同的效果。+ Ctrl空格:)
罗曼·盖伊

3
另外,如果您打印出代码清单,这将很有帮助-您没有工具提示可以帮助您(是的,我喜欢打印代码并有时在安乐椅上或躺在床上阅读)。
B. Clay Shannon

3
@domenicop我不是m前缀,但是我想这个想法是要区分类中的各种属性。话虽如此,我通常不在任何地方使用公共非静态属性,除非在仅包含那些属性且不包含业务逻辑的类(记录类)中使用。在这种情况下,m无用,因为该类中没有业务逻辑。因此,最好删除它,以提高类之外的可读性(当您引用这些字段时)。
乔佛里2014年

2
我认为,如果不使用此类前缀就无法轻松区分字段,参数和变量,则意味着代码有问题。类或方法很可能太大。
Konrad Morawski

9

根据清洁代码书,这不是清洁代码。

您不需要在成员变量前面加上m。此外,人们很快学会忽略前缀或后缀,以查看名称的有意义部分。


9

如果您有类似的问题

您的IDE生成setters / getters,并且最终得到getmName()和setmName()

不要忘记下一步(设置/编辑器/代码样式/ Java /代码生成):

在此处输入图片说明

更新:我们在Kotlin中不使用这样的东西(因此最好切换到它,并且不再使用前缀)


6

我认为使用哪种代码约定非常个别。我更喜欢使用以下前缀来命名变量:

  • m-方法变量
  • c-类变量
  • p-参数变量

但是我想每个程序员都有自己的风格。


7
考虑到大多数Java开发人员使用的IDE可以为类,方法,静态和参数变量设置不同的视觉样式,因此我发现使用带下划线的静态变量/方法,斜体的类变量等更为有用。您可以设置自己的字体和颜色。无论您使用什么前缀,它都将始终有效。但是,当然,当您离开IDE时,魔力就消失了。
ccpizza

4

为了证明您绝对不应该使用此约定在代码中命名变量,我传递了来自上级Android Studio的屏幕截图

找到对象内部经过特殊排序的变量,以使m变量低于本机变量。因此,通过在代码中使用“ m”前缀命名它们,可以将它们隐藏在自己的堆中

在此处输入图片说明



2

如前所述,为不同的变量设置了样式。但这对于代码生成也非常有用。如果按“ Alt +插入”,您将获得最常用代码生成属性的窗口。如果您想为变量生成“ get”方法,您将获得。

public class Foo{
   private int bar;

   public int getBar(){
       return this.bar;
   }

   public void setBar(int bar){
       this.bar = bar; 
   }

}

但是,如果您声明“ m,s”,您将得到:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

public void setBar(int bar){
   mBar = bar;
}
}

它会自动生成,并从构造函数中删除“ m”或“ s”,获取并设置方法名称。此后,将为字段生成“ get”和“ set”,而没有“ m”。Andoroid Fle->设置->代码样式-> Java->代码生成。并像图片一样制作。也许会有所帮助。对不起,我的英文。 配置Android


2

似乎有些早期的Android / Google工程师个人偏向于以'm'开头成员变量,因此他们推荐了它。

现在,由于既不是AOSP贡献者,也不是公司中的开发人员,只因为​​该页面被视为Android代码样式规则,所以该规则就被迫了。那条规则几乎没有好处。Google应该考虑将其删除。否则,请指定对于Android Apps,哪些代码样式规则是可选的。

请添加对本请愿书的支持意见,以删除规则https://code.google.com/p/android/issues/detail?id=226814


2

m出于可读性s考虑,如果您正在使用像Android Studio这样的现代IDE,则不再使用成员变量和静态字段的约定。Android Studio可以在不添加m或的情况下进行区分s


1

也可以说它代表“我的”,就像在类/实例中所说的那样:“这个变量是我的,没有其他人可以使用它。” 不同于静态类,虽然它可能仅对类可用,但由该类的所有实例共享。就像您要绘制圆一样,您需要知道每个圆的半径有多大

    private double mRadius;

但同时您希望计数器可以跟踪所有圈子,您可以在圈子类中

    private static int sCircleCount;

然后只有静态成员可以增加和减少您当前拥有的圈子的数量。


1

以下是命名约定,

  • 非公共,非静态字段名称以m开头。
  • 静态字段名称以s开头。
  • 其他字段以小写字母开头。
  • 公共静态最终字段(常量)为ALL_CAPS_WITH_UNDERSCORES。

例:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}
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.