Methods “使用”的最佳实践是什么;获得;在方法名称中?

Methods “使用”的最佳实践是什么;获得;在方法名称中?,methods,getter,names,Methods,Getter,Names,我注意到在Java(包括C)的许多地方,许多“getter”方法都以“get”作为前缀,而其他许多方法则没有。我从来没有注意到太阳似乎在遵循什么样的模式。在getter方法名称中使用“get”有哪些准则或规则?Java中的“get”和“set”前缀对最初用作表示Javabean的约定。后来,它变成了一种封装约定,因为Java不像C#那样没有正确的属性。Java(还)不支持属性。能手和二传手是解决这个问题的一个障碍。其他语言—包括C#—支持属性,您应该改用这些属性。这也不仅仅是一个“最佳实践”:C

我注意到在Java(包括C)的许多地方,许多“getter”方法都以“get”作为前缀,而其他许多方法则没有。我从来没有注意到太阳似乎在遵循什么样的模式。在getter方法名称中使用“get”有哪些准则或规则?

Java中的“get”和“set”前缀对最初用作表示Javabean的约定。后来,它变成了一种封装约定,因为Java不像C#那样没有正确的属性。

Java(还)不支持属性。能手和二传手是解决这个问题的一个障碍。其他语言—包括C#—支持属性,您应该改用这些属性。这也不仅仅是一个“最佳实践”:C#中的序列化依赖于属性,而不是getter和setter,因此如果需要序列化类,不使用属性可能会在将来导致各种问题

属性的优点是它们使代码更具可读性。差不多

obj.setX(10);
在Java中,成为

obj.X = 10;

然而在幕后,X是一种方法,而不是一个变量,因此可以执行脏输入检查等。

过去的情况肯定是,API经常公开只读属性,而不使用
get
前缀:甚至更新的示例也是合理的

这样做的好处是所涉及的绒毛较少。缺点是,任何试图根据约定自动确定属性的东西都不会发现它们。就我个人而言,我倾向于错误地加入前缀


当然,在C#中,它基本上是不相关的,因为存在“真实”属性:)

Objective C2.0也使用属性,使用相同的点语法

在此之前,它对getter和setter使用了稍微不同的命名方案(当然,它们仍然可以与属性一起使用,或者用于普通的旧属性)

也就是说,get的使用方式不同。它不返回值,但将结果存储在传入的变量中


典型的getter与属性具有相同的名称,setter是以set作为前缀的属性(根据Java的约定)。KVO(Key Value Observation)系统使用这些约定,因此应该遵守。

归根结底是语义。是的,C#具有“属性”,它为您提供了一个get/set“method”存根。。。但是.NET Framework中以“Get”开头的函数(…“methods”…)应该会提示开发人员,某些操作只是为了得到一些结果

你可能会觉得这很奇怪,然后说“为什么不使用返回类型来提示人们呢?”,答案很简单。考虑以下方法:

public Person CreatePerson(string firstName, string lastName) {...}
仅通过该方法的名称,您可能会发现将涉及数据库活动,然后将返回一个新创建的“person”

但是,这个呢:

public Person GetPerson(string firstName, string lastName) {...}
仅凭该方法的名称,您就可以假设正在从数据库中100%地“安全”检索一个人


你永远不会多次给“CreatePerson”打电话。。。但是你应该觉得随时打电话给“GetPerson”是安全的。(它不应影响应用程序的“状态”。

Java中的最佳实践是为属性使用get和set前缀

框架、标记库等将查找带有这些前缀的方法,并将它们用作属性

所以,如果您有这样一个java类

public class User{
    private String name;
    public String getName(){ return name;}
    public void setName(String name){ this.name = name; }
}
。。使用struts标记(或任何其他基于ognl的标记库),您将使用
user.name
访问name属性


Spring框架在xml配置文件中也使用此约定。

这取决于具体情况。它通常是冗余信息,即使在没有属性的语言中也是如此

在C++中,不是GETActer()/StActer()对,它通常提供两个重载的THARD()函数: 无效属性(Foo f);//二传手 Foo Attr();//吸气剂

在Java中,通常的做法是在get/set前面加前缀。
我不得不说,最好的做法是按照你的语言标准去做。在Java中,人们希望看到get/set前缀,因此省略它们可能会让人感到困惑,即使它们不是严格必需的。

只是一个简短的附录:另一个约定是布尔字段的getter前缀是“is”,而不是“get”,例如
bool isEnabled(){return enabled;}

我个人喜欢以下规则:

  • 只要可以使用相应的
    set
    方法直接修改值,就使用
    get
    前缀
  • 如果值不能直接设置为属性(即没有等效的setXXX方法),请删除
    get
    前缀
第二种情况的基本原理是,如果值本身不是用户可设置的“属性”,那么它就不需要一对get/set方法。这意味着,如果遵循此约定,并且您看到一个getXXX方法,那么您也可以假设存在一个setXXX方法

示例:

  • String.length()
    -因为字符串是不可变的,所以length是只读值
  • ArrayList.size()
    -添加或删除元素时大小会更改,但不能直接设置

在C#中,您最好使用属性,它封装get和/或set,让用户感觉像是在使用字段。因此,如果您想返回一些数据(只读),并且面临只读属性、名称以“get”开头的函数和名称不以“get”开头的函数之间的决策,请澄清您会选择哪一种?@toddmo:在Java中,我通常使用
get
。鉴于上下文是Java,我不确定只读属性与名称以“get”开头的函数相比是什么意思…@toddmo:Ah,这还不清楚。在C#中,它几乎总是一个属性。我知道在C#中,函数通常是起始的
public class User{
    private String name;
    public String getName(){ return name;}
    public void setName(String name){ this.name = name; }
}