Вопрос

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

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

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

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

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

редактировать2
Был задан пример:

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;
    }
}
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top