Лучше ли, чтобы данные класса передавались внутри или напрямую? - PullRequest
3 голосов
/ 17 апреля 2010

Пример:

// access fields directly
private void doThis()
{
    return doSomeWork(this.data);
}

// receive data as an argument
private void doThis(data)
{
    return doSomeWork(data);
}

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

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

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

Ответы [ 3 ]

3 голосов
/ 17 апреля 2010
  • если данные являются частью состояния объекта, private / protected - это нормально. вариант 1 - хорошо.

  • я заметил, что некоторые разработчики любят создавать закрытые / защищенные переменные просто для передачи параметров между методами в классе, чтобы они не передавали их при вызове метода. они не предназначены для хранения модели / состояния объекта. ... тогда вариант 1 - НЕ хорошо.

Почему вариант 1 не подходит в этом случае ...

  • выставляйте столько, сколько вам нужно (var scoping). поэтому передайте данные. Не создавайте приватную / защищенную переменную просто для передачи данных между двумя методами.
  • частные методы, которые все выясняют внутри, очень легко понять. продолжай в том же духе, если только это не неизбежно.
  • частные / защищенные переменные затрудняют рефакторинг, так как ваш метод не является "самодостаточным", он зависит от внешних переменных, которые могут использоваться в других местах.

мои 2 цента! : -)

2 голосов
/ 17 апреля 2010

В классе глобальные данные не проблема ИМХО. Классы используются для соединения состояния, поведения и идентичности. Таким образом, такая связь не является проблемой. Аргумент предполагает, что вы можете вызывать этот метод с данными из других объектов, даже из других классов, и я думаю, что это должно быть более продуманным, чем соединение внутри класса.

1 голос
/ 17 апреля 2010

Они оба являются методами экземпляра, поэтому # 1 имеет больше смысла, если у вас нет ситуации, связанной с потоками (но в зависимости от языка и сценария, даже тогда вы можете просто заблокировать / пометить метод данных как синхронизированный - мои знания Java устарели ).

Второй метод больше напоминает процедурное программирование.

...