java - 面向过程 - 您将如何从对象方法中访问对象属性?




polymorphism (12)

从不是getter / setter方法的对象方法中访问对象属性的“纯粹”或“正确”方法是什么?

我知道从对象外部您应该使用getter / setter,但是从内部您只需要这样做:

Java:

String property = this.property;

PHP:

$property = $this->property;

还是你会做:

Java:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

原谅我,如果我的Java稍微有些落后,那距我用Java编程已有一年了...

编辑:

似乎人们以为我只是在谈论私有或受保护的变量/属性。 当我学习面向对象时,我被教导即使每个属性都是公共的,也要对每个属性都使用吸气剂/设置器(实际上,我被告知永远不要公开任何变量/属性)。 因此,我可能一开始就从一个错误的假设开始。 似乎回答这个问题的人可能是在说您应该拥有公共财产,而那些人不需要吸气剂和塞子,这与我所教的内容和我所谈论的内容背道而驰,尽管也许需要讨论以下内容:好。 不过,这可能是另一个问题的好话题...


我只是在这里落水吗?

也许 ;)

另一种方法是利用私有/受保护的方法来实际进行获取(缓存/ db / etc),并使用一个公共包装器来增加计数:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

然后从对象本身内部:

PHP:

$name = $this->_getName();

这样,您仍然可以将第一个参数用于其他内容(例如发送标志,以了解此处是否使用了缓存的数据)。


PHP提供了多种方法来处理此问题,包括魔术方法 __get__set ,但我更喜欢显式的getter和setter。 原因如下:

  1. 可以将验证放置在setter(以及与此相关的getter)中
  2. Intellisense使用显式方法
  3. 毫无疑问,属性是只读,只写还是读写
  4. 检索虚拟属性(即计算值)看起来与常规属性相同
  5. 您可以轻松地设置一个从未在任何地方定义的对象属性,然后该属性将不再记录

好吧,似乎有了C#3.0属性的默认实现,该决定就由您决定; 您必须使用(可能是私有的)属性设置器来设置属性。

我个人仅在不使用私有成员的情况下使用,否则会导致对象处于不太理想的状态,例如在初始化时或在涉及缓存/延迟加载时。


如果我不编辑该属性,除非有特殊情况(例如另一个对象内部的MySQLi对象 get_property() 否则我将使用 get_property() 公共方法,在这种情况下,我将仅公开该属性并将其称为 $obj->object_property

在对象内部,对我来说,始终是$ this-> property。


就个人而言,我觉得保持一致很重要。 如果有getter和setter,请使用它们。 我唯一直接访问字段的时间是访问器的开销很大。 看起来您好像不必要地膨胀了代码,但将来肯定可以省去很多麻烦。 经典示例:

稍后,您可能希望更改该字段的工作方式。 也许应该即时计算,或者您想为后备商店使用其他类型。 如果您直接访问属性,则这样的更改可能会使大量代码中断。


我会说最好在对象内使用访问器方法。 我立即想到以下几点:

1)这样做的目的是保持与对象外部访问的一致性。

2)在某些情况下,这些访问器方法可能做的不仅仅是访问字段。 他们可能会做一些额外的处理(尽管很少见)。 如果是这种情况,那么直接访问该字段将导致您错过额外的处理,并且如果总是在访问期间执行此处理,则程序可能会出错


我可能是错误的,因为我是自动编辑的,但是我从不在Java类中使用公共属性,它们始终是私有的或受保护的,因此外部代码必须由getter / setter进行访问。 更好地用于维护/修改目的。 对于内部类代码...如果getter方法很简单,那么我直接使用该属性,但是我始终使用setter方法,因为如果愿意,我可以轻松地添加代码来引发事件。


我喜欢 cmcculloh 的答案,但似乎最正确的是 Greg Hurlman 的答案。 如果您从getgo开始使用它们,并且/或者习惯于使用它们,请始终使用getter / setter。

顺便说一句,我个人发现使用getter / setters可以使代码更易于阅读和以后进行调试。


我必须在这里遗漏一点,为什么要在对象内使用吸气剂来访问该对象的属性?

得出结论,吸气剂应称为吸气剂,吸气剂应称为吸气剂。

因此,我想说一个对象方法内部直接访问属性,尤其是看到调用该对象中的另一个方法(无论如何将直接访问该属性然后返回它)只是毫无意义,浪费的练习(或者我误解了这个问题) )。


正如一些评论中所述:有时应该,有时不应该。 关于私有变量的重要之处在于,您可以在更改某些内容时看到它们被使用的所有位置。 如果您的getter / setter执行了您需要的操作,请使用它。 如果没关系,您可以决定。

可能出现相反的情况,如果您使用吸气剂/塞特而有人更改了吸气剂/塞特,则他们必须分析内部使用吸气剂和塞特器的所有位置,以查看是否弄乱了某些东西。


这具有宗教战争的潜力,但是在我看来,如果您使用的是吸气剂/塞特剂,则也应该在内部使用它-两者同时使用会导致维护问题(例如,有人向 需要 特定方法的塞特剂中添加代码)会在每次设置该属性时运行,并且在内部设置该属性而无需调用该setter)。


这取决于。 这比其他任何事情都更是样式问题,没有硬性规定。





theory