Использование переменной класса против отправки локальной переменной в функции / методы - PullRequest
6 голосов
/ 04 апреля 2011

Когда лучше передать локальную переменную в функцию / метод в качестве параметра, а не использовать переменную класса вместо переменной функции / метода.

Например, я могу иметьфункция:

int DoSomething(int var)
{
   if(var == -1)
     return 0;
}

или я могу иметь переменную класса "_var" и использовать ее в той же функции, например:

int DoSomething()
{
   if(_var == -1)
     return 0;
}

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

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

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

Пожалуйста, сообщите.

Ответы [ 3 ]

11 голосов
/ 04 апреля 2011

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

Типичные случаи:

  • Элемент данных : значение является частью состояния объекта (как в случае класса).Вы хотите, чтобы другие вызовы методов отражали это конкретное состояние.
  • Статический член : значение имеет одновременное значение, идентичное всем экземплярам класса.Обычно это используется только для констант (даже при инициализации во время выполнения, например, синглтоном), но в некоторых случаях требуется изменяемое состояние класса.
  • Аргумент функции : значение имеет значениетолько для конкретного исполнения функции / метода.Это значение может быть изменено от одного вызова к следующему.

Есть некоторые распространенные симптомы неправильного выбора.

Примите во внимание следующие вопросы:

  • Всегда ли вы передаете одно и то же значение методу независимо от того, откуда вы его вызываете? Подумайте о том, чтобы сделать аргумент постоянным и скрыть его.Рассмотрите возможность определения перегрузок: одна без аргумента для общего случая и одна с аргументом для гибкости.
  • Вам нужно устанавливать элемент данных (через установщик) каждый раз, когда вы вызываете функцию? Рассмотрите возможность сделать значение аргументом функции.Нет необходимости экономить на сигнатуре функции, если вам нужно заменить каждый вызов двумя строками, чтобы заранее установить значение.

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

2 голосов
/ 04 апреля 2011

Я смотрю на это с точки зрения зависимости , то есть кто зависит от переменной (в вашем случае var), это метод или класс?

Например,JavaBeans имеют переменные класса, которые зависят от класса, поэтому, если классу нужны эти переменные, тогда лучше всего DoSomething().

В качестве альтернативы, если ваш класс не заботится о var и не нуждается в немгде-нибудь еще, и только для DoSomething() требуется var, тогда DoSomething(int var) имеет важное значение.

0 голосов
/ 04 апреля 2011

Это не должно касаться того, что дает больше или меньше кода или что требует больше усилий для ввода. Речь идет о том, что является более логичным в контексте этого класса и функции. Держать вещи изолированными друг от друга, как вы, в общем, хорошо, но не переусердствуйте. Когда из функции функции становится ясно, что она должна работать со значением, содержащимся в классе var, она должна делать это и не получать значение через параметр.

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