Подтвердить что ты не робот

Параметр против переменных-членов

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

  • Переменная должна быть сохранена для последующего вызова.
  • Данные, хранящиеся в переменной, используются глобально в классе.
  • Когда переменная должна управляться глобально (что-то решительно отличается от необходимости читать переменную каждым методом класса).
  • Когда это упростит программирование. (По общему признанию, расплывчатый, но нужно во многих случаях избегать рисования себя в угол).

(Я признаю, что многие из перечисленных выше немного повторяются, но каждый из них кажутся достаточно разными, чтобы заслужить такое лечение...)

Просто кажется, что это наиболее эффективное средство предотвращения случайного изменения переменной. Похоже, что последующие эти стандарты позволят в конечном счете манипулировать внешними ссылками (если класс в конечном итоге изменен), таким образом оставляя вас в будущем. Это просто проблема стиля (например, одна настоящая скобка или венгерские соглашения об именах), или у меня есть оправдание в этом убеждении? Действительно ли в этом случае лучшая практика?

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

edit2
Пример:

class foo
{
    private $_my_private_variable;

    public function __constructor__()
    {
     }

    public function useFoo( $variable )
    {
        // This is the line I am wondering about,
        // there does not seem to be a need for storing it.
        $this->_my_private_variable = $variable; 
        $this->_doSometing();
    }

    private function _doSomething()
    {

        /*
          do something with $this->_my_private_variable.
        */
        // This is the only place _my_private_variable is used.
        echo $this->_my_private_variable;
    }
}

Так я бы это сделал:

class foo
{

    public function __constructor__()
    {
     }

    public function useFoo( $variable )
    {
        $this->_doSometing( $variable );
    }

    private function _doSomething( $passed_variable )
    {
        /*
          do something with the parameter.
        */
        echo $passed_variable;
    }
}
4b9b3361

Ответ 1

В общем, члены класса должны представлять состояние объекта класса.

Они не являются временными расположениями параметров метода (для чего предназначены параметры метода).

Ответ 2

Я утверждаю, что это не проблема стиля, а проблема с читабельностью/ремонтопригодностью. Одна переменная должна иметь одно применение, а одно - только одно. Переменные "Переработка" для разных целей только потому, что они требуют того же типа, не имеют никакого смысла.

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

Чем меньше лексическая область и время жизни любой данной переменной, тем меньше вероятность ошибочного использования и тем лучше для утилизации ресурсов.

Ответ 3

Наличие переменной-члена означает, что она будет удерживать состояние, которое должно удерживаться между вызовами метода. Если значение не должно проживать между вызовами, у него нет причин существовать вне сферы действия одного вызова, и, следовательно, (если он вообще существует) должен быть переменной внутри самого метода.

Стиль всегда тяжелый, как только вы его разрабатываете, вы можете застрять немного в колеи, и может быть трудно понять, почему то, что вы делаете, может быть не лучшим образом.

Ответ 4

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

Ответ 5

Члены класса должны быть следующими:

  • Зависимость класса
  • Переменная, представляющая состояние класса
  • Метод класса

Ответ 6

Я не уверен, что существует заявленная наилучшая практика использования переменных с глобальным охватом и всегда передаваемых в качестве параметров метода. (По "частным переменным", я предполагаю, что вы имеете в виду глобально ограниченные переменные.)

Использование переменной с глобальным охватом является единственным способом реализации свойств в .NET(даже в автоматических свойствах в конечном счете используется переменная с глобальным охватом, просто не одна, которую вы должны объявить сами).

Существует строка аргументов для всегда использования параметров метода, потому что она полностью очищает место, откуда исходит значение. Я не думаю, что это действительно помогает помешать методу внести изменения в базовое значение, и может, на мой взгляд, усложнять время.

Ответ 7

Я бы не согласился с его внедрением для глобального доступа или упростил программирование. Открывая их глобально без какой-либо фильтрации, затрудняет определение доступа в будущем.

Ответ 8

Поскольку свойства объекта предназначены для хранения состояния, как указано другими, моя политика заключается в том, чтобы все из них были закрыты по умолчанию, если у меня нет веских оснований для их раскрытия.

Гораздо проще сделать их публичными позже, если вам нужно просто написать метод getter (например, мне также не нужно думать о начале написания класса). Но позже в будущем в общественном имуществе может потребоваться перезапись большого количества кода.

Мне нравится сохранять его гибким, не думая об этом больше, чем нужно.