为什么我不能只使用公共财产而不被人看不起呢


Why cant i just use public property and not be looked down at

我看到(并编写)了很多这样的代码:

class MyClass
{
    private $_myProperty;
    public function setMyPropert($myProperty)
    {
         $this->_myProperty = $myProperty;
    }
    public function getMyProperty()
    {
         return $this->_myProperty;
    }
}

既然我们被告知类属性应该始终是私有的。

然而,我真的只想在上面的场景中这样做:

class MyClass
{
    public $myProperty;
}

这是更少的代码,更容易阅读。但其他开发人员会看不起这段代码,很可能它会通过代码审查等。即使没有,我仍然不会这样做,因为我害怕别人看到它并做出判断。

为什么?这是不是在oop代码的开发人员中根深蒂固的东西?或者是我遗漏的另一个原因,可能与测试、未来维护或其他不明显的技术原因有关。我说的是在一个场景中,getter/setter注意到了get/set的更多内容。

如果你在getter和setter中什么都不做,那么是的,你还不如公开这个属性。但setter通常用于检查值以确保其有效:

public function setFoo($foo) {
    if (!is_string($foo)) {
        throw new InvalidArgumentException('No you foo-l!');
    }
    $this->foo = $foo;
}

这样做是一个好主意,以确保类的完整性,这就是封装的目的。即使你现在不做这个检查,你也可能在修复了由于设置无效值而导致的第三个错误后,在将来添加它。如果你突然开始切换到方法调用而不是属性分配,你将很难修改所有设置属性的代码。

最好尽早从实际封装开始。

这实际上可以归结为打开/关闭原理:

软件实体(类、模块、功能等)应开放用于扩展,但关闭用于修改

在这种情况下,原则意味着类的成员在默认情况下应该是私有的。

在某些情况下,你可能只需要声明一名公众成员。你可以,但这仍然是事实,你不应该这样做作为一个规则。这在一定程度上只是为了避免坏习惯——把一个班的所有成员都暴露在每个人面前是草率的。

这也是一个表明你意图的问题:如果有人看到一名公众成员,他们会怎么想?目前还没有办法知道作者是否打算公开该成员,或者他们只是不知道自己在做什么。