我注意到在许多地方在Java(C#包括在内),许多"吸气"方法的前缀为"获取",而许多其他的则不是。我从来没有注意到任何种类的模式太阳似乎是以下。什么是一些准则或规则,使用"获得"在吸气的方法的名字?

有帮助吗?

解决方案

归结为语义。是的,C#有“属性”它给你一个get / set'方法'存根...但.NET Framework中的函数(......“methods”...)以“Get”为开头。应该让开发人员知道某些操作的发生只是为了获得一些结果。

你可能认为这很奇怪并且说“为什么不只是使用返回类型来解决人们的问题?”,答案很简单。考虑以下方法:

public Person CreatePerson(string firstName, string lastName) {...}

只是通过该方法的名称,您可能会认为将涉及数据库活动,然后是新创建的“人”。将被退回。

但是,这个怎么样:

public Person GetPerson(string firstName, string lastName) {...}

只需 方法的名称,您就可以假设100%“安全”了。正在从数据库中检索一个人。

你永远不会打电话给“CreatePerson”。多次......但你安全地调用“GetPerson”每时每刻。 (它不应该影响申请的“状态”。)

其他提示

"获得"和“设置” Java中的前缀对最初用作表示java bean的约定。后来,它变成了一个封装约定,因为Java与C#不同,它没有适当的属性。

Java 中的最佳做法是使用属性的get和set前缀。

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

所以,如果你有像这样的java类......

public class User{
    private String name;
    public String getName(){ return name;}
    public void setName(String name){ this.name = name; }
}

..使用struts-tags(或任何其他基于ognl的标记库),您将使用 user.name 访问name属性。

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

Java(尚未)支持属性。吸气剂和二传手是一个可以解决这个问题的小屋。其他语言 - 包括C# - 支持属性,您应该使用它们。这不仅仅是一种“最佳实践”。事情要么:C#中的序列化将依赖于属性,而不是getter& setters,如果你需要序列化你的类,那么不使用属性可能会在将来导致各种问题。

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

这样的东西
obj.setX(10);
Java中的

成为

obj.X = 10;

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

我个人喜欢的以下规则:

  • 使用 get 前缀时的价值直接与相应的修改 set 方法
  • 放下 get 前缀在的情况值的东西你不能直接设置作为一种财产(即没有同等的setXXX方法)

的理由对于第二种情况是,如果价值是不是真的用户设定的"财产"这样,那么它不应该需要get/set对方法。一种含义是,如果该公约是随后,你会看到一个getXXX方法,可以假定存在的一个setXXX方法。

实例:

  • String.length() -由于字符串不可改变的,长度是一个只读值
  • ArrayList.size() -尺寸变化时元素添加或删除,但可以设置不直接

当然,API经常暴露只读属性而没有 get 前缀: String.length() 甚至更新的 Buffer.capacity() 是合理的例子。

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

当然,在C#中,由于存在“真实”,因此它几乎无关紧要。属性无论如何:)

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

在C ++中,通常提供两个Attr()函数的重载,而不是getAttr()/ setAttr()对。 void Attr(Foo f); //二传手 Foo Attr(); //吸气剂

在Java中,通常的做法是为get / set添加前缀。 我不得不说最好的做法是遵循你的语言标准。在Java中,人们期望看到获取/设置前缀,因此省略它们可能会使人感到困惑,即使它们并非严格必要。

Objective C 2.0也使用相同的点语法来使用属性。

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

value = [obj attr];

[obj setAttr:value];

[obj getAttr:&value];

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

典型的getter与属性同名,setter是以set为前缀的属性(根据Java的约定)。这些约定由KVO(键值观察)系统使用,因此应该遵守。

只是一个简短的附录:另一个惯例是布尔字段的getter以“is”为前缀。而不是“获取”,例如, bool isEnabled(){return enabled; }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top