2013-08-28 3 views
2

я вижу (и писать) много кода, как это:Почему косяк я просто использовать общественную собственность, а не смотрел на

class MyClass 
{ 
    private $_myProperty; 

    public function setMyPropert($myProperty) 
    { 
     $this->_myProperty = $myProperty; 
    } 

    public function getMyProperty() 
    { 
     return $this->_myProperty; 
    } 
} 

Так как мы научены, что свойства класса всегда должны быть частными.

Однако, я действительно хочу сделать это в приведенном выше сценарии:

class MyClass 
{ 
    public $myProperty; 
} 

Thats гораздо меньше кода и легче читать. Но другие разработчики будут смотреть на этот код и, скорее всего, не будут проверять код и т. Д. Даже если нет, я все равно никогда не сделаю этого, опасаясь, что кто-то еще увидит это и вынесет суждение.

Почему же? Это что-то, что просто укоренилось в разработчиках oop-кода? Или есть еще одна причина, по которой я отсутствую, возможно, связанная с тестированием, будущим обслуживанием или другой неочевидной технической причиной. Я говорю конкретно в сценарии, где геттер/сеттер отмечает больше, что get/set.

+3

http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – Klaasvaak

+0

Хороший вопрос снова. Просто, но сложно ответить, особенно с фокусом на PHP. Пожалуйста, продолжайте спрашивать. Для этого здесь у меня нет времени, чтобы ответить, но у меня есть сильное чувство, это зависит от типа объекта (Value, Helper, Operator, Object/Immutable или нет). Наличие геттеров и сеттеров часто защищает вас от принятия неправильного решения, поэтому сохранение личных вещей, принадлежащих объекту (например, «свойство»), не так уж и много, и делает ваш код каким-то будущим доказательством в PHP. – hakre

ответ

1

Если вы делаете ничего в своих геттерах и сеттерах, то да, вы можете также просто сделать недвижимость публичной. Но сеттеры обычно используются для проверки значения, чтобы убедиться, что это действительно:

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

Это хорошая идея, чтобы сделать это, чтобы обеспечить целостность класса, это то, что инкапсуляция для. И даже если вы не выполняете эту проверку сейчас, вы можете добавить ее в будущем после исправления третьей ошибки, вызванной тем, что установит недопустимые значения. Если вы затем внезапно начнете переключиться на вызовы методов вместо назначения свойств, вам будет сложно переопределить весь свой код, устанавливающий свойства.

Лучшее начало с фактической инкапсуляцией как можно раньше.

0

Это действительно сводится к open/closed principle:

программные объекты (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации

В этом контексте, принцип означает, что члены класса должны быть частными по умолчанию.

Может показаться, что в некоторых случаях вы можете просто объявить публичного участника. Вы можете, но это правда, что вы не должны делать это, как правило. Это отчасти просто избегает вредных привычек - разоблачение всех членов класса для всех просто неряшливо.

Это также вопрос сигнализации ваших намерений: если кто-то видит публичного участника, что они думают? Не существует непосредственного способа узнать, предназначен ли автор для того, чтобы член был публичным, или если они просто не знали, что они делают.